Google XSS game | Write-up
Googleが公開したXSS(クロスサイトスクリプティング)脆弱性をつくハッキングゲームに、XSSの勉強がてら挑戦してみました。
レベルは1~6まであり、それぞれXSS攻撃によりアラートを表示させるコードを実行させるとクリアになります。すべてクリアするとGoogleからケーキのご褒美があるそうです。
問題の下にはソースコードとヒント(3~4つまで)があります。
Level 1
入力欄に適当に文字を入れて「Search」を押すと、次の画面にその文字が表示されます。試しに<h1>hoge</h1>というHTMLコードを入れてみると、大きな見出し文字として表示されました。つまり、"<" や ">" の文字を変換するといったXSS対策がなされていないことが分かります。したがって、直接Javascriptのコードをぶち込んでやればいいわけです。アラートで表示させる文字は何でもいいようです。
そこで、入力欄に以下のコードを入れて「Search」を押すとアラートが表示されます。
<script>alert('(^o^)');</script>
Level 2
レベル2はチャット画面のようです。文字を入力するとどんどん表示されていきます。レベル1の時と同じコードを入れてもアラートはなりません。
そこで今回はスクリプトタグではなく、imgタグを使ってみようと思います。<img src="XSS">という文字を入れると、チャット画面に画像のアイコンが現れるのでこれは使えるようです。このコードの後ろにonerrorというエラー処理を追加して、以下の様なコードを入力するとアラートが表示されました。
<img src="XSS" onerror="alert('XSS')">
Level 3
レベル3では古いコンピュータの画像が現れます。上のImageタブをクリックすると画像が切り替わります。この時、URLの末尾がframe#1, frame#2, frame#3 と変わっていくことに注目です。URLの数字を書き換えるだけでもページを切り替えることができます。ソースを見ると
<div class="tab" id="tab1" onclick="chooseTab('1')">Image 1</div> <div class="tab" id="tab2" onclick="chooseTab('2')">Image 2</div> <div class="tab" id="tab3" onclick="chooseTab('3')">Image 3</div>
とあり、Imageの番号をchooseTabに渡していることが分かります。chooseTabの中身を見てみると
html += "<img src='/static/level3/cloud" + num + ".jpg' />";
このようにimgタグで画像を表示させているようです。
ここで、URLを
http://xss-game.appspot.com/level3/frame#2'/><script>alert('XSS');</script>
とすると、プログラムの中では
html += "<img src='/static/level3/cloud"'/><script>alert('XSS');</script>".jpg' />";
が実行され、アラートが表示されます。
Level 4
レベル4では、数字を指定して実行するとタイマーが作動する仕組みになっています。ソースと見ると
<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
となっていて、"{{timer}}"のところに入力の内容が入るようになっていることが分かります。ここに3');alert('XSSと入れると
<img src="/static/loading.gif" onload="startTimer('3');alert('XSS');" />
となり、アラートが表示されます。
Level 5
レベル5では、なにかのログイン画面が現れます。メールアドレスを入力してログインすると元のページヘリダイレクトされます。メールアドレスを入力するページのURLの末尾が"signup?next=confirm"になっていることに注目です。"Next"をクリックするとconfirm.htmlが呼び出されています。ソースを見ると
<a href="{{ next }}">Next >></a>
となっていて、{{ next }}にconfirmが入ることになっています。ここで、以下のようにURLのconfirmをjavascript:alert('XSS');に変えて、Goを押し、Nextをクリックするとアラートが表示されます。
http://xss-game.appspot.com/level5/frame/signup?next=javascript:alert('XSS');
Level 6
レベル6は…何をしたいのかわからない(笑)。/static/gadget.jsから何かのガジェットをロードしているようです。
http://www.google.com/jsapi?callback=alert
↑こちらのjavascriptのAPIのcallback関数でalertを表示させようとしましたが、以下のコードにより"http"が入ってると無効化されてしまいます。
if (url.match(/^https?:\/\//)) { setInnerText(document.getElementById("log"), "Sorry, cannot load a URL containing \"http\"."); return; }
ただしhttp:は省略可能なため、URLの#以下を以下のように書き換えるとアラートを表示させることができます。
http://xss-game.appspot.com/level6/frame#//www.google.com/jsapi?callback=alert
また、別解として、以下のようにURLを変更すればアラートを表示させることができました。
http://xss-game.appspot.com/level6/frame#data:,alert('XSS')