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 一起使用。 ![Burp Suite 捕获](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/1142000ebafd650c0bdf67289996095dcac178e47b87d1b71135d517f704bd83.png) ### 2. SQL Injection(手动) 在 DVWA SQL Injection 页面上,一个基于 UNION 的 payload 被注入到 `id` 参数中,以便从预期查询转移到 `users` 表: ``` ' UNION SELECT user, password FROM users-- - ``` 应用程序返回了所有五个用户记录,包括用户名和未加盐的 MD5 密码 hash。 ![SQL Injection 结果](https://static.pigsec.cn/wp-content/uploads/repos/cas/23/239fef883ec4f55646cc9105d91f66872c899135b0082dcc3775d6b3b5412604.png) ### 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 | ![Hashcat 输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/73/7393b36e41aa81a5902775b060577833de81e11bdf1df558b2ff359eb8b04802.png) ### 5. Command Injection DVWA Command Execution 模块将用户输入直接传递给系统 `ping` 调用,而未进行清理。通过使用 `|` 链接第二条命令,在服务器上执行了任意的 OS 命令: ``` 127.0.0.1 | id 127.0.0.1 | cat /etc/passwd ``` 响应直接在浏览器中渲染了注入命令的输出,证实了未经身份验证的远程命令执行。 ![Command injection 输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/73/731c0e6ccc46eebc4a7134aa02f16db0d1dd6323c71094409d1cd01d69a12a9f.png) ### 6. Reflected XSS 和 Cookie 盗窃 DVWA Reflected XSS 模块在回显 `name` URL 参数时未进行编码。以下 payload 被注入到 URL 中: ``` ``` 浏览器执行了该脚本,并在对话框中显示了活动的 session cookie,暴露了 `PHPSESSID` 值。能够诱骗受害者点击精心构造的链接的攻击者可以盗取该 session token。 ![通过 XSS 盗窃 Cookie](https://static.pigsec.cn/wp-content/uploads/repos/cas/75/7532987adfa6b18fdb9e29507568d4d712ba38a2c38e6e228e453f6637d1ed59.png) ### 7. Stored XSS DVWA Stored XSS 模块(留言板)将用户输入持久化到数据库中,未进行清理。一个脚本 payload 被作为消息字段提交: ``` ``` 检查页面源代码证实,原始的 script 标签被直接写入到了 `guestbook_comments` 内部的 DOM 中。该 payload 会对每个加载页面的用户执行,而不仅仅是攻击者。 ![页面源代码中的 Stored XSS](https://static.pigsec.cn/wp-content/uploads/repos/cas/0a/0add638f3d4a25dabb2d9f127e9a0843e41aac01f7fd1b265e7387f974fd8458.png) ### 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安全, 后端开发, 蓝队分析, 靶机实战