web-dev-qa-db-ja.com

このXSSベクトルがsvgでは機能するがHTMLでは機能しないのはなぜですか?

なぜこのベクトルは:

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

http://jsfiddle.net/ZgPY4/2/ で動作し、これは

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

しません。 <svg>機能させるには?

16
Daniel

HTML <script>には、他の要素にはない特別な能力があります。これは「CDATA要素」です。つまり、要素の最後までの<または&文字は、文字通りそれらの文字を意味すると見なされます。したがって、JSインタープリターに渡されるのは次のとおりです。

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

これは明らかに有効なJS構文ではありません。

「CDATA要素」の概念は、HTMLが開発されたSGMLの世界に由来しています。しかし、SVGは、物事が単純化され、CDATA要素がないXMLの世界から来ています。したがって、SVG <script>要素には特別な機能はありません。SVGスクリプト内では、<はタグを導入し、&はエンティティまたは文字参照を導入します。

その結果、&#40(に解析され、JSインタープリターに渡される結果の文字列は次のようになります。

alert(/1/.source)

XML用語では、<script>要素はHTML名前空間にあり、<svg><script>要素はSVG名前空間にあるため、これらは異なる要素です。 HTML5では、名前空間プレフィックスを非表示にし、非XMLパーサーをSVGに適用することで、これをあまり明確にしません(そのため、整形式ではないにもかかわらず&#40は機能します。&#40;である必要があります)。

21
bobince

#(ハッシュ、シャープ、ポンド)はJavascriptを壊します。 <svg>タグペアの内部(終了タグは提供されません)エンティティ番号は、htmlとしてレンダリングされるため、適切な文字参照に変換され、エンジンは ECMAスクリプト(これは描画のために行うことができます)

OWASP.orgはこれを セミコロンなしの16進エンコーディング として文書化しています。

3
AbsoluteƵERØ