joseph-guidici/pentest-lab-06-web-app-testing
GitHub: joseph-guidici/pentest-lab-06-web-app-testing
针对 DVWA 靶场环境的 Web 应用渗透测试实验,完整演示 SQL 注入、XSS、CSRF、命令注入等 OWASP Top 10 漏洞的利用流程与修复思路。
Stars: 0 | Forks: 0
# 渗透测试实验 06:Web 应用测试
针对托管在 Metasploitable 2 上的 DVWA (Damn Vulnerable Web Application) 进行的 Web 应用测试。本实验涵盖了在实际安全 engagements 中最常见的 OWASP Top 10 漏洞类别:SQL injection、cross-site scripting、CSRF 和 command injection。流量使用 Burp Suite 进行拦截和分析,并使用 SQLmap 执行了自动化的 SQL injection。
**[道德与法律声明](./ETHICS.md)**
## 目标
- 使用 Burp Suite 拦截并检查 HTTP 请求
- 手动利用 SQL injection 从数据库中提取凭据
- 自动化 SQLmap 以枚举数据库并确认注入类型
- 破解从数据库转储中恢复的 MD5 密码 hash
- 利用 command injection 通过 Web 应用执行 OS 级命令
- 通过 reflected XSS 窃取 session cookie
- 通过 stored XSS 注入持久化 payload
- 演示一个有效的 CSRF 攻击,在受害者不知情的情况下更改其密码
## 使用的工具
| 工具 | 用途 |
|---|---|
| Burp Suite | HTTP proxy,请求拦截和检查 |
| SQLmap | 自动化 SQL injection 和数据库枚举 |
| Hashcat | 通过字典攻击进行离线 MD5 hash 破解 |
| Firefox | 配置了 Burp proxy 的目标浏览器 |
| DVWA | 故意存在漏洞的 Web 应用(目标) |
## 攻击链
```
flowchart TD
A[Burp Suite Proxy\nIntercept HTTP Traffic] --> B[SQL Injection\nUNION-based, dump users table]
B --> C[SQLmap Automation\nConfirm 4 injection types\nEnumerate 7 databases]
C --> D[Hash Recovery\n5 MD5 hashes extracted]
D --> E[Hashcat Cracking\n5 of 5 passwords cracked]
A --> F[Command Injection\nOS command execution via ping field]
A --> G[Reflected XSS\nCookie theft via URL payload]
A --> H[Stored XSS\nPersistent payload in guestbook]
A --> I[CSRF PoC\nAuto-submit form changes victim password]
```
## 发现
| 严重程度 | 漏洞 | 位置 | 影响 |
|---|---|---|---|
| Critical | SQL Injection (基于 UNION) | `/dvwa/vulnerabilities/sqli/` | 完整数据库转储,凭据泄露 |
| Critical | Command Injection | `/dvwa/vulnerabilities/exec/` | 在服务器上执行 OS 命令 |
| High | Stored XSS | `/dvwa/vulnerabilities/xss_s/` | 为所有访问者执行持久化 payload |
| High | CSRF | `/dvwa/vulnerabilities/csrf/` | 未经身份验证的密码更改 |
| High | Reflected XSS | `/dvwa/vulnerabilities/xss_r/` | Session cookie 被盗 |
| Medium | 弱密码 Hashing | `dvwa.users` 表 | MD5 hash 在几秒钟内被字典破解 |
## 演练
### 1. Burp Suite 流量拦截
Burp Suite 被配置为 `127.0.0.1:8080` 上的 proxy,并使 Firefox 指向它。在浏览期间保持拦截关闭,以便请求累积在 HTTP 历史记录中。发往 `/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit` 的 SQLi 请求被捕获并保存为请求文件,以便与 SQLmap 一起使用。

### 2. SQL Injection(手动)
在 DVWA SQL Injection 页面上,一个基于 UNION 的 payload 被注入到 `id` 参数中,以便从预期查询转移到 `users` 表:
```
' UNION SELECT user, password FROM users-- -
```
应用程序返回了所有五个用户记录,包括用户名和未加盐的 MD5 密码 hash。

### 3. SQL Injection(SQLmap)
捕获的 Burp 请求被传递给 SQLmap 以自动化枚举:
```
sqlmap -r sqli-reqtests.txt --dbs
```
SQLmap 识别出针对 `id` 参数的四种注入类型:boolean-based blind、error-based、time-based blind 和 UNION query。在服务器上枚举出了七个数据库:
```
dvwa, information_schema, metasploit, mysql, owasp10, tikiwiki, tikiwiki195
```
输出记录至:[sqlmap-output.txt](./files/sqlmap-output.txt)
### 4. 从转储的 Hash 中破解密码
从 `dvwa.users` 恢复的五个 MD5 hash 被输入 Hashcat 进行字典破解:
```
hashcat -m 0 hashes.txt /usr/share/wordlists/rockyou.txt
```
五个密码中有四个在几秒钟内被破解:
| 用户 | Hash (MD5) | 破解的密码 |
|---|---|---|
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 | password |
| gordonb | e99a18c428cb38d5f260853678922e03 | abc123 |
| 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | charley |
| pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | letmein |
| smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | password |

### 5. Command Injection
DVWA Command Execution 模块将用户输入直接传递给系统 `ping` 调用,而未进行清理。通过使用 `|` 链接第二条命令,在服务器上执行了任意的 OS 命令:
```
127.0.0.1 | id
127.0.0.1 | cat /etc/passwd
```
响应直接在浏览器中渲染了注入命令的输出,证实了未经身份验证的远程命令执行。

### 6. Reflected XSS 和 Cookie 盗窃
DVWA Reflected XSS 模块在回显 `name` URL 参数时未进行编码。以下 payload 被注入到 URL 中:
```
```
浏览器执行了该脚本,并在对话框中显示了活动的 session cookie,暴露了 `PHPSESSID` 值。能够诱骗受害者点击精心构造的链接的攻击者可以盗取该 session token。

### 7. Stored XSS
DVWA Stored XSS 模块(留言板)将用户输入持久化到数据库中,未进行清理。一个脚本 payload 被作为消息字段提交:
```
```
检查页面源代码证实,原始的 script 标签被直接写入到了 `guestbook_comments` 内部的 DOM 中。该 payload 会对每个加载页面的用户执行,而不仅仅是攻击者。

### 8. CSRF 概念验证
一个独立的 HTML 页面被精心构造,它自动向 DVWA CSRF endpoint 提交一个带有新密码值的隐藏表单。当已登录的受害者访问该页面时,请求会从他们的浏览器发出,并附带他们现有的 session cookie,应用程序会在没有任何确认的情况下更改他们的密码。
```
```
PoC 文件:[csrf-poc.html](./files/csrf-poc.html)
## 挑战与修复
**问题:** 当 DVWA 托管在 localhost 时,Burp Suite 未拦截 DVWA 请求。
**原因:** 在大多数浏览器中,发往 `127.0.0.1` 的流量默认会绕过 proxy;如果不进行额外配置,Burp 无法拦截 loopback 流量。
**修复:** 将目标切换到 Metasploitable 2 (192.168.56.102) 上的 DVWA。所有流量现在都通过网络适配器传输,Burp 可以干净地拦截它,无需任何额外配置。
## 经验教训
- 基于 UNION 的 SQL injection 仅在注入查询中的列数与原始查询匹配时才可能实现;首先使用 `ORDER BY` 计算列数可以避免试错性的 payload。
- SQLmap 的 `-r` 标志直接接受保存的 Burp 请求文件,这省去了在命令行手动重建 cookie 和 header 的麻烦。
- MD5 不是一种密码 hashing 算法。如果没有 salt,所有五个 hash 都能轻易从 rockyou.txt 中破解。生产系统应使用 bcrypt、Argon2 或 scrypt。
- Reflected XSS 需要用户交互(点击恶意链接),但 stored XSS 则不需要;payload 会为每个访问者自动触发,这使其在大多数 bug bounty 计划中成为严重程度较高的发现。
- CSRF 利用了对用户浏览器的信任。服务器无法区分由用户提交的表单与由恶意页面悄悄提交的表单。CSRF token(synchronizer token)通过添加攻击者无法预测的 secret 值来打破这一点。
- 通过 ping 字段进行的 command injection 提醒我们,任何传递给 shell 函数而没有经过适当清理的输入都是一个潜在的执行向量,无论该功能看起来多么无害。
标签:Burp Suite, CISA项目, OWASP Top 10, SQLmap, StruQ, Web安全, 后端开发, 蓝队分析, 靶机实战