Burp扫描提示疑似DOM型XSS,求验证及利用Payload
分析DOM型XSS疑似告警:基于window.location.hash与jQuery $()的场景
嘿,咱们来拆解下你遇到的这个Burp告警问题。首先先理清楚工具提示的代码逻辑:
应用从
window.location.hash读取URL哈希值,直接传入jQuery的$()函数,接着调用offset().top获取元素位置,最终用来做页面滚动动画。
一、先判断:这大概率是误报吗?
核心得看jQuery的$()函数怎么处理输入:
- 如果哈希值是HTML标签字符串(比如
<img src=x>),jQuery会创建对应的DOM元素,但这些元素默认不会被插入到页面里。调用offset()时,没插入DOM的元素会返回null,再访问.top就会抛出JS错误,直接中断后续代码,恶意脚本根本跑不起来。 - 如果哈希值是CSS选择器字符串(比如
#header、.content),jQuery只会在页面里找匹配的元素,完全不会执行任何脚本逻辑。
只有碰到以下两种特殊情况,才可能真的有风险:
- 网站用的是超老版本的jQuery(比如1.6及更早),这类版本存在已知的选择器解析漏洞,特殊构造的选择器可能触发代码执行;
- 页面还有其他隐藏逻辑,比如会把
$(window.location.hash)返回的元素插入到DOM里,那风险就上来了。
二、可以试试这些Payload来验证
虽然常规场景下很难触发XSS,但你可以用下面的Payload测一测:
- HTML元素测试Payload:
#<img src=x onerror=alert(document.domain)>
原理是强制jQuery创建带onerror事件的img元素,但因为元素没被插入页面,多数浏览器不会执行这个事件;不过旧浏览器或者特殊环境下可能有例外。 - 老旧jQuery版本专属Payload:
#[(alert(1))]
这个只对jQuery 1.2到1.5版本有效,旧版本的选择器解析器有缺陷,会把这种特殊语法当成代码执行,但现在几乎没人用这么老的版本了。 - DOM事件触发测试:
#<div onclick=alert(1)>
同样是创建带事件的元素,但没插入DOM的话点击事件根本触发不了;除非页面后续有逻辑把这个元素加到页面里。
三、自己动手验证的步骤
- 打开浏览器F12开发者工具,切到Console标签;
- 手动模拟代码执行:把
window.location.hash换成你构造的Payload,执行$("你的Payload").offset().top,看看会不会弹出alert,或者有没有报错; - 查一下jQuery版本:在Console里输
jQuery.fn.jquery就能看到,如果版本≥3.0,基本可以确定是误报; - 仔细看看页面逻辑:有没有代码会把
$(window.location.hash)返回的元素插入到DOM中,如果有,就得再深入排查。
总的来说,这个告警绝大多数情况是误报,当前代码逻辑下,哈希值要么用来查元素,要么创建个没人管的DOM元素,根本触发不了脚本执行。不过还是建议你结合jQuery版本和页面实际逻辑再确认下~
内容的提问来源于stack exchange,提问作者AW Wasi
相关产品推荐
相关产品推荐

