十一、CSP Bypass - 浏览器内容安全策略绕过
原理
HTTP 返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。为了缓解潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对 XSS 攻击时,主要采用函数过滤、转义输入中的特殊字符、标签、文本来规避攻击。CSP 的实质就是白名单制度,开发人员明确告诉客户端,哪些外部资源可以加载和执行,开发者只需要提供配置,实现和执行全部由浏览器完成。
两种方法可以启用 CSP:
- 通过 HTTP 响应头信息的 Content-Security-Policy 字段
- 通过网页标签
例如:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
以上例子的意思如下:
- script-src 脚本:只信任当前域名
- object-src:不信任任何 URL,即不加载任何资源
- style-src 样式表:只信任 http://cdn.example 和 http://third-party.org
- child_src:必须使用 HTTPS 协议加载。这个已从 Web 标准中删除,新版浏览器可能不支持
- 其他资源:没有限制其他资源
当启用 CSP 后,不符合 CSP 的外部资源会被阻止加载
1. Low
$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://pastebin.com、hastebin.com、www.toptal.com、example.com、code.jquery.com 和 https://ssl.google-analytics.com
其中的 pastebin 是一个快速分享文本内容的网站,此时可以在 pastebin 网站上自己写一个 javascript 代码 alert("csp")
,保存然后记住链接。
然后将链接在下面界面中输入,js 代码会被执行,由于网站需要注册登录,这里就不演示了。
攻击者可以把恶意代码保存在受信任的网站上,然后把链接发送给用户点击,实现注入。
2. Medium
http 头信息中的 script-src 的合法来源发生了变化,说明如下:
- unsafe-inline:允许使用内联资源,如内联
<script>
元素,javascript:URL,内联事件处理程序(如 onclick)和内联<style>
元素,必须包括单引号 - nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=”
直接输入以下代码
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
弹出信息框,表示注入成功
3. High
这个级别已经没有输入框了,不过题目已经给了足够多的提示。
首先先看一下 CSP 头,发现只有 script-src 'self';,
看来只允许本界面加载的 javascript 执行。
然后研究了一下这个点击显示答案的逻辑(逻辑在 source/high.js
里), 大致如下: 点击按钮 -> js 生成一个 script 标签(src 指向 source/jsonp.php?callback=solveNum), 并把它加入到 DOM 中 -> js 中定义了一个 solveNum 的函数 -> 因此 script 标签会把远程加载的 solveSum({"answer":"15"})
当作 js 代码执行, 而这个形式正好就是调用了 solveSum 函数, 然后这个函数就会在界面适当的位置写入答案.
<?php
header("Content-Type: application/json; charset=UTF-8");
if (array_key_exists ("callback", $_GET)) {
$callback = $_GET['callback'];
} else {
return "";
}
$outp = array ("answer" => "15");
# callback 可以被控制
echo $callback . "(".json_encode($outp).")";
?>
callback 参数可以被操控以生成任何你想要得到的结果, 比如 alert, 因此可以构造 Payload: <script src="source/jsonp.php?callback=alert('hacked');"></script>
, 并把这个当做 include 参数传给界面就注入成功!
防护方法
内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本和数据注入攻击等
标签:src,浏览器,script,安全策略,DVWA,Bypass,com,CSP,加载 From: https://www.cnblogs.com/augustine0654/p/17180844.html