セキュリティ・キャンプの存在を知ったのは今年の5月後半です。
内容を見てみると、自分の興味があることに凄くマッチしていて「これは行きたい!」と思い早速応募用紙を書くことに。
どのクラスも凄く興味があったのですが、現在一番興味があるのはWebサービス開発だったので、それに関係するWeb・セキュリティ・クラスに応募することに決めました。
まずはWeb・セキュリティ・クラスの応募用紙をダウンロードして内容を読んでみることに。
その中にあった以下の問題が一番面白そうだったので、最初に解くことに決めました。
5. 以下のJavaScriptのコード断片は、とあるWebサイトで利用されていたものです。これを見て気付いた点について、自由に書いてください。
function getRedirectPageUrl(){ var url = location.hash.substring(1); try{ if( url.length === 0 ) return "/"; url = decodeURIComponent( url ); if( !url.match( /^https?:\/\// ) ) return "/"; }catch( e ){ console.log( "invalid url" ); } return url; } /* .... */ var url = getRedirectPageUrl(); location.href = url;
僕はJavaScriptをほとんど触ったことがなかったので、このコードがどういう仕組みなのかがいまいち分かりませんでした。
なので、まずはこのコードがどういう動作をするのか検証してみることに。
関数名からリダイレクトをするコードかな?と思ったので、htmlファイルに上記のコードを埋め込んで以下のような文字列をURLの最後につけてみました。
?hoge
…。
変化なし。
一向に文字列を拾ってくれません。
var url = location.hash.substring(1);
ここがURLを取得する部分のようなので、location.hash.substringについて調べてみることに。
すると、URLの最後に#をつけるとそれ以降の文字列がlocation.hash.substring(1)で拾われることが分かりました。
なぜかと思い調べてみると、URLの#以降の文字列はサーバには送られないため、JavaScriptで認識、区別をすることができると知りました。
これにより、URLの最後に
#https://www.google.co.jp
をつけると、https://www.google.co.jpにリダイレクトされることが分かりました。
とりあえずこれで動作の確認が出来ました。
そしてコードを眺めていると、エラーがcatchされた後にcatch内でreturn “/”;がされていないことを疑問に思い、エラーが発生するようにこのような文字列をURLの#以降に加えました。
http://%.jp
URLにアクセスをしてみると、予想通りcatch内でreturn “/”;がされていないので
http://%.jp
にリダイレクトされることが分かりました。
脆弱性の発見です。
試しに#以降にこのような文字列を加えてみます。
javascript:alert(“XSS”);//%
この文字列を加えることで、JavaScriptが実行されることを確認しました。
これにより、このコードはJavaScriptを実行できてしまうことが分かりました。
最後に無限ループに陥る可能性がこのコードには含まれていて、このコードをhttp://hoge.jp等の一番上の階層に設置すると、http://hoge.jp等の一番上の階層に対してのリダイレクトが無限ループすることを確認しました。
応募用紙にはここまでの解説と、対処法のコードを書きました。
(デバッグ用に書き換えたコードも応募用紙に貼りましたが、あまり脆弱性探しに活躍しなかったのは秘密)
他に脆弱性があれば、コメントやTwitterのリプライなどでぜひ教えてください。
他の問題には、自分の考えや思いを思い浮かぶままにずらーっと書きました。
恥ずかしいのでブログには書きません(,,Ծ‸Ծ,,)
その後応募用紙を提出をしたのですが、訂正したいことがあり再提出。
ここで終わるかと思いきや、1週間くらいの間隔で何度も訂正後→提出を繰り返してしまって、最終的にはメールのタイトルが再々々々提出までになってしまいました。
窓口の方にとても申し訳なかったです…。
すみませんでした(っ◞‸◟c)
ところで今回のセキュリティ・キャンプの応募者数は、公式Twitterアカウントからの情報だと300名みたいです。
過去最多の倍率らしいですが、応募をされた皆さんは自分が書いた応募用紙を信じて結果を待ちましょう!
番外編
応募用紙を提出後、他のクラスの応募用紙に興味があったのでネットワーク・セキュリティ・クラスの応募用紙を見てみることに。
ネットワーク・セキュリティ・クラスの応募用紙は課題を解かないと入手ができないようになっているので、まずは課題を解きます。
課題の「000038855」というファイルをダウンロードした瞬間、これはバイナリエディタの出番だ!と思ってわくわくしながらバイナリエディタでこのファイルをオープン。
何かのファイルのはずなので、バイナリデータの先頭から適当に抜き出したd4 c3 b2をGoogleさんで検索。
するとpcapのヘッダだと分かったので、早速Wiresharkで開いてみることに。
ふむふむ。
HTTP通信で何やらsecurity-camp-2014-nw.txtというテキストファイルをGETしているみたい。
今度はWiresharkさんの機能の出番だーと思い、
File→Export Objects→HTTP
を選択。
すると予想通りファイル一覧にsecurity-camp-2014-nw.txtというファイルが現れたので、Save Allを押して保存!
これで応募用紙の入手は完了です。
中身を見てみてみましたが、勉強不足で分からない問題ばかり。
これはネットワークの勉強をしなければーと思い、パケットキャプチャ入門 第3版という本を早速Amazonさんで注文しました。
早く届かないかなー。