引数として何かのURLを受け取って、そのURLにただ飛ばすという処理をセキュアに書くのは案外チェック項目が多くて大変だったのでメモ。

・引数が正しいURL形式かチェック

・オープンリダイレクタにならないように、引数として渡されたURLが飛び先として想定内のURL(自ドメイン範囲内かなど)かチェックする。

・オープンリダイレクタを使ったURL偽装に引っかかるのは善意の第三者ユーザなので、リファラが消えていないケースが多いことを考えると、補助的な対策として、リファラに何か値があったら、想定範囲内のURLかチェックし、知らないURLから飛んできてたらエラーにするというのもありかも。

・HTTPヘッダで外部から渡されたURLにリダイレクトする場合は、URLから改行コードを削除する必要がある(HTTPヘッダインジェクション対策)。

・metaタグのrefreshに指定するURLは、IE6/7だと;で区切ってURLが複数指定できてしまい、後に指定したほうのURLに飛ぶので注意。
(参考 葉っぱ日記 IE6/7のでは「;」で区切ってURLが複数指定できる問題)

・Javascriptでページを遷移させる場合、Javascriptの文字リテラルに外から渡された引数を渡すのは穴が潰しにくくて危険。Javascript文字列としてのエスケープを行う必要があるが、安全な書き方がなかなか難しく、うっかりするとJavaScriptインジェクションを食らってしまう。
(var val='{$URL}'; みたいなのは危険。)
HTML特殊文字エスケープ後、HTMLフォームのhiddenインプットに値を入れて、それをJSから参照する形にすると楽。
(参考 ockeghem(徳丸浩)の日記 XSS対策:JavaScriptのエスケープ(その3))

まだあったりするかな・・

→まだたくさんあった。
オープンリダイレクト検査:Locationヘッダ編 - T.Teradaの日記

まだあったりするだろうか。

前回のXSS Challengesに続き、こちらも有名サイトHackmeに(またも今更)挑戦してみた。
Lv5までクリア。めでたくHackmeよりハッカーの称号を頂いた。
(Hackme Lv5を解いた感想は、微妙なのでノーコメント。)

結果として、正解そのものよりも、詰まっていろいろ調べた知識のほうが「おいしかった」感じがするので、Hackmeのようなサイトはネタバレなし縛りでトライしてみるのが吉だと思う。
(とは言っても今別のクラック力問題で死ぬほど詰まっていてネタバレなし縛り挫折しそうですが)


有名なXSS Challengesに(今更)挑戦してみた。
#19までの全面クリアに成功。

用意されたフォームをSubmitし、指定のalertを出せればステージクリア。
段階的に、初歩的なレベルのXSSから、だんだん高度なレベルの問題になっていく。

サイトには一部の問題はIEで、と書いてあるが、IEの特定バージョンでないとクリアできないステージがあるので、IETester等IEのバージョンを変えてテストできるソフトが必要。
プロキシソフトはFiddlerを使った。

面白く学べるので、XSSの知識を身に付けたい方はおすすめのサイトです。
良質なXSS学習サイトを作っていただいたyamagata21氏に感謝。

Powered by Blogger.
© WEB系情報セキュリティ学習メモ Suffusion theme by Sayontan Sinha. Converted by tmwwtw for LiteThemes.com.