2011年9月21日水曜日

(括弧)とスペースを使わないでXSS

タイトルのように括弧とスペースを入力値に使えないような状態でXSSするものを見つけて結構面白かったのでメモ。
その時のサイトを再現したような感じのページ

JS Bin

クイズとか書いてありますが、興味ある方は下の解答を読む前にやってみるといいかもしれないですね。

自分が考えながらやった感じの解答は以下のようなものです

以下に実証コードを作成するまでの経緯を書いておくと

---

  1. 検索キーがエスケープされてない事に気づく
  2. 単純に<script>alert(1)</script>を検索キーとした場合()が大文字変換されてJavaScriptコードはエラーになる
  3. 検索キーにスペースが入ると検索結果が変わり、この場合はエスケープされて正しく出力される
  4. スペースと括弧を使わずにスクリプトを実行するという条件でも、window.nameを使い任意のスクリプトを実行させることが可能。
    XSS例題(下書き中) - st4rdustの日記
    2009-08-17 - hoshikuzu | star_dust の書斎
  5. XSS例題のようなaリンクのtargetにスクリプトを仕込んでやる方法でとりあえず実行できる事は確認したが、実際に罠として踏ませるテストケースにために自動的に実行できるようにする。
  6. window.openでtarget指定や、aリンクを用意してdocument.createEvent('MouseEvents')で自動的に踏ませる方法はポップアップブロックに阻まれてしまった。(許可すれば実行はできる)
    Chrome で画像の一括ダウンロード - Griever
  7. target指定があると、ポップアップブロックされてしまうが、targetはframeの指定にも利用できる。
    <a>-HTML5タグリファレンス
  8. つまり、以下のようにtargetに仕込んだスクリプトと同じ名前をつけたiframeを用意すれば、ポップアップせずに iframe内のURLが書き換わるようになり、そのURLにJavaScriptの実行コードを仕込むことができる。
<iframe src="http://攻撃対象サイト" name="javascript:alert(1)"></iframe>
<a id="xss" href="http://攻撃対象サイト/%3Cscript%3Elocation.href=window.name%3C/script%3E" target="javascript:alert(1)">
XSS
</a>
後は、マウスクリックを自動でさせるようにすれば、罠ページにアクセスしたら任意のJavaScriptを実行できる。

----

という感じの流れで、上記の解答例を作ってました。
window.nameで実行できることにはすぐ気づいたのですが、それを自動的に実行させる方法を色々試していたので何か遠回りな方法になっています。

window.nameの参考リンクにもでてきた@s_hskzさんによる解答はもっとシンプルで、こっちのほうが失敗もないし良いと思います。

他にも解答はあるような気がしますがこんなところで。

再現したページのしょっぱいPHPコードは http://codepad.viper-7.com/1EvHix で見られます。

1 コメント:

コメントを投稿