Loading

DVWA 之 CSP Bypass - 浏览器内容安全策略绕过

十一、CSP Bypass - 浏览器内容安全策略绕过

原理

HTTP 返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。为了缓解潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对 XSS 攻击时,主要采用函数过滤、转义输入中的特殊字符、标签、文本来规避攻击。CSP 的实质就是白名单制度,开发人员明确告诉客户端,哪些外部资源可以加载和执行,开发者只需要提供配置,实现和执行全部由浏览器完成。

两种方法可以启用 CSP:

  1. 通过 HTTP 响应头信息的 Content-Security-Policy 字段
  2. 通过网页标签

例如:

<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.examplehttp://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) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本和数据注入攻击等

posted @ 2023-03-05 16:22  紫曜花  阅读(153)  评论(0编辑  收藏  举报