引数として何かの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の日記
まだあったりするだろうか。
Posted by g_sato
https://securitymemo.blogspot.com/2014/10/hackme.htmlHackmeからハッカーの称号を頂いた
有名なXSS Challengesに(今更)挑戦してみた。
#19までの全面クリアに成功。
用意されたフォームをSubmitし、指定のalertを出せればステージクリア。
段階的に、初歩的なレベルのXSSから、だんだん高度なレベルの問題になっていく。
サイトには一部の問題はIEで、と書いてあるが、IEの特定バージョンでないとクリアできないステージがあるので、IETester等IEのバージョンを変えてテストできるソフトが必要。
プロキシソフトはFiddlerを使った。
面白く学べるので、XSSの知識を身に付けたい方はおすすめのサイトです。
良質なXSS学習サイトを作っていただいたyamagata21氏に感謝。
Posted by g_sato
https://securitymemo.blogspot.com/2014/10/xss-challenges.htmlXSS Challenges #19クリア
Powered by Blogger.

