记录-反射型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实体编码:<&lt;
    • JavaScript编码
    • URL编码

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需要采用纵深防御策略,结合输入验证、输出编码和安全头部等多重防护措施。

反射型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实体编码: < → &lt; JavaScript编码 URL编码 3. 内容安全策略(CSP) 实施严格的CSP策略 限制内联脚本执行 限制外部资源加载 4. 其他防护措施 设置HttpOnly标志的cookie 实施X-XSS-Protection头部 使用X-Frame-Options防止点击劫持 五、漏洞验证与修复 1. 验证方法 在搜索框输入测试payload 观察是否弹出警告框 检查页面源代码确认payload是否被正确编码 2. 修复方案示例 六、总结 本案例展示了即使简单的反射型XSS漏洞,攻击者也能通过巧妙的构造绕过基础的黑名单防护。关键在于理解HTML解析器的特性和浏览器的容错机制。防御XSS需要采用纵深防御策略,结合输入验证、输出编码和安全头部等多重防护措施。