SecurityCamp 2014 Web security Write-up
ネットワークセキュリティの問題はかなりWrite-upが上がっているのにWebはそんなに見ないなと思ったので解いてみました。
まずは応募用紙を見てみましょう。
http://www.ipa.go.jp/files/000038877.txt
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;
このコードを見たとき違和感を感じました。
どこが、というはっきりしたものではありませんが、なぜtry-catchしているのかとかtry内でのreturnの位置とかが変だなあと漠然と思った程度です。
とりあえず上記のコードがどんな処理をするのか整理してみます。
- http/httpsのURLをフラグメントに要求している
- 要求されたURLが渡されている場合にはそのページヘリダイレクトする
- 何か例外が発生したらログにinvalid urlと出力する
URLのフラグメントを使って外部ページにリダイレクトするという処理はさっぱり意味がわからないのですが、とりあえず何か脆弱性があるだろうと細かく見ていきます。
(URLのフラグメントはサーバーには送信されないため記録も残らない)
フラグメントがどういう処理でJavaScriptから取得できるかを知っていればすぐ解けるかもしれませんが、「手を動かせ」って話らしいのでコンソールを開いて弄ってみます。
URL: #あ -> location.hash="#あ" URL: #%E3%81%82 -> location.hash="#%E3%81%82" URL: #http://www.google.co.jp -> location.hash="#http://www.google.co.jp" URL: #%68%74%74%70%3a%2f%2f%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%2e%6a%70 -> location.hash="%68%74%74%70%3a%2f%2f%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%2e%6a%70"
こうしてみると、「どうもdecodeURIComponentの重要性はないんじゃないか?」という疑問に行き当たります。(ブラウザによって挙動が違って非常に厄介)
また、try-catchがあるので例外が発生するならdecodeURIComponentかurl.matchだろうともいうことも考えます。
decodeURIComponentの怪しさが異常なので、ここで何とか例外を起こすことができないか試してみます。
decodeURIComponent("%68%74%74%70%3a%2f%2f%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%2e%6a%70") //-> "http://www.google.co.jp"
どこか1文字消してみたり。
decodeURIComponent("%6%74%74%70%3a%2f%2f%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%2e%6a%70") //-> URIError: URI malformed
あっさり例外出ちゃいました。
コードに戻り、例外が出る場合の処理を追ってみます。
decodeURIComponentで例外を出すと、URLのスキームをチェックする部分はスルーされてcatchへ飛び、そのままurlがreturnされるようです。
ということはURLスキームに絡んだ脆弱性を起こすことができそうです。
ここまでくればわかった人も多いでしょう。
このリダイレクタにはjavascriptスキームを用いてXSSを発生させることができる脆弱性が存在します。
XSSでどんなことができるかについては、来年以降も同じ質問が繰り返されるかもしれないので詳しくは書きませんが、XSSがあるとわかってしまえばあとは問題用紙の要旨にそって自分の考えを書くだけです。
以上、お疲れ様でした。(他に面白い脆弱性があったら教えてね)