入门级反射型xss实战
本文仅用于安全技术学习交流所有目标信息已脱敏处理。⚠️ 新手向文章大佬勿喷直接掠过即可。新手有错误欢迎指正信息收集进入目标网站首页页面风格明显偏老。查看源码发现使用了 jQuery版本较旧这类老站点往往对用户输入的过滤不够严格存在 XSS 风险。初步探测在搜索框输入经典 payloadscriptalert(1)/script结果直接被 WAF 拦截。尝试 URL 编码绕过%3Cscript%3Ealert(1)%3C/script%3E结果依然被拦截。猜测 WAF 可能过滤了alert()函数尝试替换scriptconsole.log(1)/script结果还是被拦截。再次进行 URL 编码%3Cscript%3Econsole.log(1)%3C/script%3E结果这次没有触发 WAF。分析 WAF 规则三次测试的对比Payload是否拦截说明scriptalert(1)/script✅ 拦截包含scriptscriptconsole.log(1)/script✅ 拦截包含script%3Cscript%3Econsole.log(1)%3C/script%3E❌ 未拦截URL 编码后绕过了script字符串匹配结论WAF 的规则是匹配script这个字符串模式而非单纯的尖括号。为什么编码后的 payload 没成功虽然绕过了 WAF但控制台并没有输出1。查看页面源码中输入的回显位置发现HTMLinput typetext valueconsole.log(1)lt;/scriptgt;WAF 的处理逻辑直接删除了script字符串剩余部分原样保留。WAF 的规则是匹配并删除script字符串而非拦截整个请求。编码后的 payload 绕过了字符串匹配但解码后仍被过滤。此时console.log(1)只是HTML 属性值中的普通文本/script被 HTML 实体编码为lt;/scriptgt;或浏览器当作纯文本没有任何代码执行的环境核心问题输入被当作 HTML 属性值处理没有进入 JavaScript 执行上下文。转换思路跳出字符串执行既然输入被包裹在双引号中尝试闭合前面的字符串和语句然后注入代码。构造 payload;console.log(1);//分解执行逻辑部分作用闭合value;结束变量赋值语句console.log(1)注入的恶意代码//注释掉后面多余的最终页面中的代码变为var keyword ;console.log(1);//;验证将 payload 进行 URL 编码%22%3Bconsole.log(1)%3B%2F%2F提交后观察浏览器控制台控制台成功回显证明反射型 XSS 存在。修复建议输出编码对用户输入进行 HTML 实体编码→quot;→lt;等避免直接拼接不要将用户输入直接拼接到script标签内的字符串中使用安全的 DOM 操作避免使用innerHTML、document.write()处理不可信数据启用 CSP配置 Content-Security-Policy 限制内联脚本执行总结阶段关键动作探测经典 payload 测试 WAF 边界分析通过对比测试确定 WAF 规则是匹配script定位查看源码确认输入回显位置var keyword ...绕过闭合字符串 语句注释跳出上下文执行代码验证控制台回显确认漏洞存在免责声明本文所述技术仅用于合法授权的安全测试和学习研究请勿用于非法用途。