CSP Bypass
CSP Bypass(Content Security Policy Bypass)漏洞涉及的是绕过网站部署的内容安全策略(Content Security Policy,CSP)限制,从而执行潜在的恶意操作。CSP 是一种安全机制,用于防止跨站脚本(XSS)、数据注入攻击等。其通过限制网页能够加载和执行的内容来源来增强浏览器的安全性。
low
查看源码可以发现被信任的网站有https://pastebin.com、hastebin.com、www.toptal.com、example.com、code.jquery.com、https://ssl.google-analytics.com
打开https://pastebin.com,输入“alert(xss);”
然后点击“Create New Paste”就可以得到下一步
点击“raw”,复制得到的网址。
然后输入到输入框即可
源码审计
只允许来自https://pastebin.com example.com code.jquery.com https://ssl.google-analytics.com 这几个网站的js脚本
<?php
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // 允许从自身(self)、pastebin.com、example.com、code.jquery.com 和 google analytics 发送的 js 脚本。
header($headerCSP); // 设置响应头的内容安全策略。
# https://pastebin.com/raw/R570EE00 // 这是一个外部链接,可能是指向某个资源的地址。
?>
<?php
if (isset ($_POST['include'])) { // 检查表单是否提交
$page['body'] .= "
<script src='" . $_POST['include'] . "'></script> // 如果提交,获取输入的 URL,并将其作为脚本引入
";
}
$page['body'] .= '
<form name="csp" method="POST"> // 创建一个表单,方法为 POST
<p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p> // 提示用户可以输入外部脚本的 URL
<input size="50" type="text" name="include" value="" id="include" /> // 输入框,用户输入的 URL
<input type="submit" value="Include" /> // 提交按钮
</form>
';
medium
查看源码当csp有Unsafe-inline时, 并且受限于csp无法直接引入外部js, 不过当frame-src为self, 或者能引入当前域的资源的时候, 即有一定可能能够引入外部js。nonce-source,仅允许特定的内联脚本块,所以直接输入源码内注释的内容即可。
输入注释内容
源码审计
nonce参数定义了如果 CSP 上下文中定义了 nonce,则只有与该值匹配的内联脚本能够运行,其他不带或不匹配的脚本会被阻止,所以我们可以使用示例脚本来绕过
<?php
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';"; // 设置内容安全策略,允许从自身、自定义内联脚本及具有特定随机数值的脚本。
header($headerCSP); // 设置响应头的内容安全政策。
// 禁用 XSS 保护,以便内联的警报框能够工作
header ("X-XSS-Protection: 0"); // 关闭跨站点脚本(XSS)保护。
# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script> // 这是一个示例脚本,用于展示使用随机数值的内联脚本。
?>
<?php
if (isset ($_POST['include'])) { // 检查表单是否提交
$page['body'] .= "
" . $_POST['include'] . " // 如果提交,直接将用户输入的内容添加到页面中。
";
}
$page['body'] .= '
<form name="csp" method="POST"> // 创建一个表单,方法为 POST
<p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p> // 提示用户输入的内容将直接放入页面,并试图触发一个警报框。
<input size="50" type="text" name="include" value="" id="include" /> // 输入框,用户输入的内容
<input type="submit" value="Include" /> // 提交按钮
</form>
';
high
注意这段代码source/jsonp.php?callback=solveSum
抓包修改
也是可以的
源码审计
服务器:
设置了只允许来自同源的脚本
复制代码
<?php
$headerCSP = "Content-Security-Policy: script-src 'self';"; // 设定内容安全策略,只允许加载来自同源的脚本
header($headerCSP); // 发送内容安全策略的 HTTP 头部
?>
<?php
if (isset ($_POST['include'])) { // 检查是否有通过 POST 请求包含的内容
$page['body'] .= "
" . $_POST['include'] . " // 将包含的内容添加到页面主体中
";
}
$page['body'] .= '
<form name="csp" method="POST"> // 创建一个表单,使用 POST 方法提交
<p>该页面调用 ' . DVWA_WEB_PAGE_TO_ROOT . '/vulnerabilities/csp/source/jsonp.php 来加载一些代码。修改该页面以运行您自己的代码。</p> // 提示用户该页面会调用的 URL
<p>1+2+3+4+5=<span id="answer"></span></p> // 显示一个简单的数学表达式
<input type="button" id="solve" value="解答这个和" /> // 一个按钮,用于触发计算
</form>
<script src="source/high.js"></script> // 加载一个外部 JavaScript 文件
';
客户端:
s.src = "source/jsonp.php?callback=solveSum";设置了callback参数,并且密钥过滤,所以我们可以利用此参数绕过
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'];
}
}
var solve_button = document.getElementById ("solve");
if (solve_button) {
solve_button.addEventListener("click", function() {
clickButton();
});
}
impossible
源码审计
服务端:
csp只允许来自外部脚本
<?php
$headerCSP = "Content-Security-Policy: script-src 'self';";
header($headerCSP);
?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
" . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>Unlike the high level, this does a JSONP call but does not use a callback, instead it hardcodes the function to call.</p><p>The CSP settings only allow external JavaScript on the local server and no inline code.</p>
<p>1+2+3+4+5=<span id="answer"></span></p>
<input type="button" id="solve" value="Solve the sum" />
</form>
<script src="source/impossible.js"></script>
';
客户端:
function clickButton() {
var s = document.createElement("script");
s.src = "source/jsonp_impossible.php";
document.body.appendChild(s);
}
function solveSum(obj) {
if ("answer" in obj) {
document.getElementById("answer").innerHTML = obj['answer'];
}
}
var solve_button = document.getElementById ("solve");
if (solve_button) {
solve_button.addEventListener("click", function() {
clickButton();
});
}
标签:脚本,DVWA,漏洞,源码,solve,document,com,CSP
From: https://www.cnblogs.com/GuijiH6/p/18669362