
1. XSS-Labs入门理解基础反射型漏洞第一次接触XSS-Labs靶场时很多新手会对着Level 1的输入框发愣。这个看似简单的文本框其实是理解反射型XSS最直观的入口。当我输入普通用户名时页面正常显示但当我尝试输入scriptalert(xss)/script时浏览器突然弹出警告框——这就是最基础的XSS攻击成功标志。查看网页源代码会发现这个关卡没有任何过滤机制。用户输入的内容被直接拼接到HTML中就像在记事本里写代码一样直接。这种漏洞常出现在早期开发的网页中开发者误以为用户都会乖乖输入正常文本。实际测试时我建议先用简单payload验证漏洞存在性再尝试更复杂的攻击链。初学者常犯的错误是直接在地址栏修改参数。比如原始URL是?nametest可以改为?namescriptalert(1)/script。但要注意浏览器地址栏对特殊字符的自动编码这时用Burp Suite或Postman工具直接修改请求会更可靠。我在教学时发现约30%的初学者会卡在这个基础操作上。2. 突破HTML实体编码闭合标签的艺术来到Level 2时情况开始变得有趣。输入常规XSS代码会被转义成lt;scriptgt;这样的HTML实体。这时候需要观察转义发生在哪个环节——是在显示层如h2标签内还是在表单value属性中。通过查看源码我发现value属性值没有被转义。于是构造scriptalert(1)/script这样的payload先闭合前端的双引号和标签再插入新脚本。这个技巧就像玩拼图要找到模板字符串的拼接点。有次我给学生演示时有人问为什么最后要加//其实这是为了注释掉原始代码中可能干扰的后缀字符。实际渗透测试中这种部分转义的情况很常见。建议养成查看网页源码的习惯用CtrlF搜索你的输入内容看看它出现在HTML的哪个位置。有时候转义可能只针对尖括号但对引号没做处理这时可以尝试用事件处理器如onmouseover来触发。3. 事件驱动的XSS当常规注入失效时Level 3和Level 4是绝佳的事件处理器教学案例。当所有特殊字符都被转义时常规的script标签注入完全失效。这时候需要换个思路——利用HTML元素自带的事件属性。在单引号闭合的Level 3中我使用onfocusjavascript:alert(1)//这样的payload。这里的技巧在于先用单引号闭合value属性添加onfocus事件处理器需要点击输入框触发用//注释掉后续代码双引号闭合的Level 4原理相同只是把单引号换成双引号。这类攻击在真实场景中危害更大因为很多WAF对事件属性的检测较弱。有次审计某电商网站时我就利用onerror事件在图片加载失败时执行了恶意代码。4. 伪协议与大小写绕过对抗基础过滤Level 5引入了关键词过滤机制把script和on等关键词添加了下划线。这时候常规的事件触发和脚本标签都失效了需要更隐蔽的攻击方式。我最终采用的方案是a hrefjavascript:alert(1)click/a。这里利用了两个关键点javascript伪协议可以直接在href属性中执行代码标签名和属性名没有被过滤Level 6的防御更进一步但只做了简单的大小写敏感过滤。通过将payload改为sCriptalert(1)/scRipt就能轻松绕过。在真实环境中我曾遇到将script替换为空字符串的防御这时用scrscriptipt这样的双写就能突破。5. 高级绕过技术编码与校验欺骗最后几个关卡展示了企业级防护下的XSS技巧。Level 7的双写绕过看似简单实则考验对过滤逻辑的理解。当系统只做一次关键词替换时像scrscriptipt这样的payload会变成scriptafter过滤。Level 8的Unicode编码则更隐蔽。将javascript:alert(1)转换成#106;#97;#118;#97;#115;#99;#114;#105;#112;#116;:alert(1)后能绕过大多数关键词检测。有次在测试某CMS系统时我发现它们只检测了UTF-8编码却忽略了HTML实体编码导致防护被轻易绕过。最有趣的是Level 9的URL校验绕过。防御代码要求href必须包含http://但我们可以构造这样的payloadjavascript:alert(1)//http://example.com这段代码既满足了校验条件又确保了恶意代码的执行。这种利用校验逻辑本身缺陷的绕过方式在实战中往往最有效。