为什么这个 XSS 向量在 svg 中有效,但在 HTML 中无效?

信息安全 xss svg
2021-08-14 01:47:41

为什么这个向量:

<svg><script>alert&#40/1/.source&#41</script>

http://jsfiddle.net/ZgPY4/2/和这个

<script>alert&#40/1/.source&#41</script>

没有。如何<svg>让它发挥作用?

2个回答

HTML<script>具有其他元素没有的特殊功能:它是“CDATA 元素”。这意味着直到元素末尾的任何<&字符都被视为字面意思这些字符。所以传递给 JS 解释器的是:

alert&#40/1/.source&#41

这显然不是有效的 JS 语法。

“CDATA 元素”的概念来自开发 HTML 的 SGML 世界。但是 SVG 来自 XML 世界,在这个世界中,事情被简化并且没有 CDATA 元素。因此,SVG<script>元素没有特殊的权力:在 SVG 脚本中,<引入标签并&引入实体或字符引用。

因此,&#40被解析(并传递给 JS 解释器的结果字符串是:

alert(/1/.source)

在 XML 术语中,<script>元素位于 HTML 名称空间中,而<svg><script>元素位于 SVG 名称空间中,因此它们是不同的元素。HTML5 通过隐藏命名空间前缀并将非 XML 解析器应用于 SVG 使这一切变得不那么清晰(这就是为什么&#40尽管它的格式不正确;应该是这样&#40;)。

( #hash,sharp,pound) 会破坏您的 Javascript。<svg>标记对(未提供结束标记)内部,实体编号被转换为正确的字符引用,因为它呈现为 html,然后引擎执行ECMA 脚本(允许为绘图执行该脚本)

OWASP.org 将其记录为不带分号的十六进制编码