记录-反射型XSS-利用img对黑名单的绕过
字数 1090 2025-08-10 00:23:58
反射型XSS漏洞挖掘与绕过技巧分析
一、漏洞背景
反射型XSS(跨站脚本攻击)是一种常见的Web安全漏洞,攻击者将恶意脚本注入到网页中,当其他用户访问该页面时,脚本会在用户浏览器中执行。本文记录了一个实际案例,通过巧妙利用``标签绕过黑名单过滤机制实现XSS攻击。
二、漏洞发现过程
1. 初始测试
- 在目标网站的搜索功能中发现输入特殊字符(如
<、>)未被过滤 - 测试基本XSS payload:
<script>alert(1)</script>,发现被拦截 - 确认网站采用了黑名单过滤机制
2. 黑名单绕过尝试
- 尝试使用``标签替代
<script>标签 - 初始payload:``
- 发现
onerror事件被过滤
3. 进阶绕过技巧
- 利用HTML属性可以不闭合的特性
- 最终有效payload:``
- 关键点:在
alert和(1)之间插入空格或换行符 - 这种写法可以绕过简单的关键词匹配过滤
- 关键点:在
三、技术原理分析
1. 黑名单过滤机制的缺陷
- 只检查完整的
onerror=alert(1)字符串 - 未考虑HTML解析器对属性值的宽松处理
- 忽略了空格、换行符等分隔符的影响
2. HTML解析特性
- 浏览器HTML解析器会自动合并属性值中的多个空格
- 属性值可以包含换行符而不影响功能
- 属性值引号是可选的(在某些情况下)
3. 攻击向量分析
- 浏览器实际解析为:``
- 当图片加载失败(src无效)时触发onerror事件
- JavaScript代码被执行
四、防御建议
1. 输入过滤
- 采用白名单而非黑名单机制
- 对所有用户输入进行HTML实体编码
- 过滤或转义特殊字符:
<,>,",',&等
2. 输出编码
- 根据输出上下文进行适当的编码
- HTML实体编码:
<→< - JavaScript编码
- URL编码
- HTML实体编码:
3. 内容安全策略(CSP)
- 实施严格的CSP策略
- 限制内联脚本执行
- 限制外部资源加载
4. 其他防护措施
- 设置HttpOnly标志的cookie
- 实施X-XSS-Protection头部
- 使用X-Frame-Options防止点击劫持
五、漏洞验证与修复
1. 验证方法
- 在搜索框输入测试payload
- 观察是否弹出警告框
- 检查页面源代码确认payload是否被正确编码
2. 修复方案示例
// PHP示例:使用htmlspecialchars过滤输出
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// Node.js示例:使用escape-html库
const escapeHtml = require('escape-html');
let safeOutput = escapeHtml(userInput);
六、总结
本案例展示了即使简单的反射型XSS漏洞,攻击者也能通过巧妙的构造绕过基础的黑名单防护。关键在于理解HTML解析器的特性和浏览器的容错机制。防御XSS需要采用纵深防御策略,结合输入验证、输出编码和安全头部等多重防护措施。