应直接检查页面JS对事件监听、表单提交和DOM写入的篡改行为,重点通过getEventListeners、FormData构造逻辑、抓包对比及危险API(innerHTML、eval等)使用情况发现交互漏洞与XSS风险。

直接看页面行为是否被JS劫持或篡改,而不是只盯<script>标签——绝大多数交互漏洞藏在事件监听、表单拦截和DOM写入点里。</script>
怎么发现表单提交被JS修改过
后端收到的字段值和页面显示不一致,基本就是JS在submit前动了手脚。常见手法是绑定form.onsubmit或addEventListener('submit'),然后调用event.preventDefault()再用fetch()或XMLHttpRequest发请求。
- 在浏览器控制台执行
getEventListeners(document.querySelector('form')),检查是否有submit监听器 - 搜索代码里有没有
new FormData(——它读的是当前DOM的value,但如果JS已提前改过input.value,那它拿到的就是被篡改后的值 - 抓包对比:如果请求体字段和表单HTML里的
value属性对不上,说明数据没走原生序列化,而是JS手动构造的 - 留意
form.getAttribute('action')和实际请求URL是否不同,这是典型的手动提交迹象
哪些DOM操作容易引发XSS漏洞
只要把用户可控数据直接塞进DOM,又没做上下文敏感编码,就可能触发DOM型XSS。重点盯住这几个函数:
-
element.innerHTML = data:最危险,会解析HTML标签。应改用textContent或先做HTML实体编码 -
document.write():已废弃,但老项目仍有残留,输入未过滤时极易被利用 -
eval()、setTimeout(string)、setInterval(string):执行字符串代码,等同于开放远程执行入口 -
location.href、location.assign()拼接用户输入:可能触发javascript:伪协议执行
注意:Vue的v-html、React的dangerouslySetInnerHTML也属于同类风险,必须确保传入内容已净化。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
如何快速定位AJAX响应处理漏洞
动态加载的内容如果未经处理就写入DOM,就是DOM型XSS的高发区。关键不是看请求发没发,而是看返回的数据怎么被用。
- 在开发者工具Network面板中筛选
XHR或Fetch,逐个点开响应,检查返回内容是否含用户可控字段(如评论、用户名、错误提示) - 搜索JS代码中对
response.json()或response.text()的后续处理,尤其关注是否直接赋值给innerHTML或传给eval() - 在控制台打断点,观察AJAX返回后DOM节点的实际变化路径,确认数据流终点是否落在危险API上
- 测试时用
<img src=x onerror=alert(1)>这类payload注入源头参数,看是否触发弹窗或DOM变动
事件监听器里常被忽略的攻击面
除了onclick这种显式属性,很多事件监听是动态绑定的,且可能读取并执行用户输入。这类漏洞隐蔽、复现难,但危害不小。
- 检查
addEventListener注册的input、change、blur事件——它们常用于实时校验或格式化,比如自动补全手机号、加解密密码字段,一旦逻辑有误就可能泄露或篡改数据 - 右键目标元素 →
Break on > attribute modifications,可捕获JS偷偷修改value、data-*属性的行为 - 搜索
onerror、onload、onabort等事件绑定,特别是用在<img>、<script>、<iframe>上时,若src由用户控制,可能触发CSP绕过或资源劫持 - 注意
document.addEventListener('DOMContentLoaded')或window.onload里是否解析URL参数并写入DOM,这是反射型XSS的常见温床
真正的难点不在找到这些点,而在于判断JS处理逻辑是否引入了新的信任边界——比如前端加密后传给后端,结果密钥硬编码在JS里;或者token从cookie读取后拼进API header,却没校验其格式合法性。这些细节,工具扫不出来,得靠人工串联数据流。


















