DOM型XSS漏洞源于客户端JavaScript对location.hash、location.search等不可信源数据的无条件信任,直接通过innerHTML、document.write等危险sink点执行,绕过服务端防护。

移动端HTML页面中的跨站漏洞(尤其是DOM型XSS)不能靠服务端扫描器覆盖,必须从客户端数据流入手——因为很多漏洞根本不出现在HTTP响应体里,只在JS运行时动态拼接DOM时触发。
先盯死location.hash和location.search
移动端页面大量依赖URL片段传参(比如微信内嵌页、PWA启动参数、APP WebView跳转),location.hash和location.search是最常见的污染源。它们不发往服务器,但前端JS常直接读取并写入DOM。
- 用DevTools的Console执行
location.hash、location.search看是否返回可控字符串 - 全局搜索
location\.hash、location\.search、location\.href,重点看后面是否跟了.replace()、.split(“#”)、URLSearchParams等解析逻辑 - 特别注意SPA路由(如Vue Router的
hash模式、React Router v5)——useHash或hashHistory配置下,整个路由参数都可能被JS提取后拼进innerHTML
检查innerHTML、document.write等危险sink点
移动端为节省资源常省略框架,直接用原生JS操作DOM,innerHTML滥用极普遍。只要用户输入进了这些函数,基本就等于开了XSS后门。
- 搜索所有
innerHTML =、outerHTML =、document\.write\(.+、insertAdjacentHTML\(.+,再逆向追溯赋值来源 - 注意“伪安全”写法:比如
el.innerHTML = decodeURIComponent(hash)——解码后仍可能含<script> - 警惕模板字符串拼接:
div.innerHTML = `<p>${userInput}</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill6712" title="Wechat HTML Publisher">Wechat HTML Publisher</a> <p>直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>`,ES6模板字面量不自动转义
别忽略WebView特有的攻击面
安卓/iOS WebView默认允许JS执行,且常开放addJavascriptInterface或evaluateJavascript,一旦前端把URL参数透传给原生桥接方法,就可能绕过DOM限制触发更深层漏洞。
- 查JS中是否调用
prompt()、confirm()、alert()——这些虽不直接XSS,但常是调试残留,暴露了参数未过滤逻辑 - 搜索
javascript:伪协议,尤其在a[href]或iframe[src]里;移动端常用来触发原生功能,但若拼接了location.href就危险 - 检查
postMessage监听器:WebView中网页与APP通信常用此方式,若event.data未经校验就写入DOM,就是典型DOM XSS
用Console快速验证payload是否执行
别等完整复现流程,先用最简方式确认漏洞存在性。移动端真机调试可用Chrome DevTools远程连接,或直接在Safari开发者工具中操作。
- 在地址栏末尾加
#%3Cimg%20src=x%20onerror=alert(1)%3E(即#<img src="https://img.php.cn/" alt="如何查找移动端HTML页面中的跨站漏洞">),刷新后看是否弹窗 - 如果没反应,尝试
?q=%3Cscript%3Ealert(1)%3C/script%3E,再检查页面中是否有document.getElementById("search-result").innerHTML = q类逻辑 - 对
eval()、setTimeout()等动态执行函数,用setTimeout("alert(1)", 0)直接测试是否可执行字符串
真正难发现的是那些经过多层函数处理、带正则清洗但漏掉javascript:或data:协议的case,还有用textContent显示但旁边又另起一个innerHTML渲染富文本的混合场景——这时候得一行行跟JS调用栈,而不是只看表面赋值。


















