sonickun.log

備忘録

Google XSS game | Write-up

 Googleが公開したXSS(クロスサイトスクリプティング)脆弱性をつくハッキングゲームに、XSSの勉強がてら挑戦してみました。

 wikipedia:クロスサイトスクリプティング

 XSS game
f:id:sonickun:20140629193405p:plain

 レベルは1~6まであり、それぞれXSS攻撃によりアラートを表示させるコードを実行させるとクリアになります。すべてクリアするとGoogleからケーキのご褒美があるそうです。
 問題の下にはソースコードとヒント(3~4つまで)があります。

 
 

Level 1

f:id:sonickun:20140629194130p:plain
  
 入力欄に適当に文字を入れて「Search」を押すと、次の画面にその文字が表示されます。試しに<h1>hoge</h1>というHTMLコードを入れてみると、大きな見出し文字として表示されました。つまり、"<" や ">" の文字を変換するといったXSS対策がなされていないことが分かります。したがって、直接Javascriptのコードをぶち込んでやればいいわけです。アラートで表示させる文字は何でもいいようです。
 そこで、入力欄に以下のコードを入れて「Search」を押すとアラートが表示されます。

<script>alert('(^o^)');</script>

f:id:sonickun:20140629200607p:plain


 

Level 2

f:id:sonickun:20140629200919p:plain
 
 レベル2はチャット画面のようです。文字を入力するとどんどん表示されていきます。レベル1の時と同じコードを入れてもアラートはなりません。
 そこで今回はスクリプトタグではなく、imgタグを使ってみようと思います。<img src="XSS">という文字を入れると、チャット画面に画像のアイコンが現れるのでこれは使えるようです。このコードの後ろにonerrorというエラー処理を追加して、以下の様なコードを入力するとアラートが表示されました。

<img src="XSS" onerror="alert('XSS')">



 

Level 3

f:id:sonickun:20140629202647p:plain
 
 レベル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

f:id:sonickun:20140629205336p:plain
 
 レベル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

f:id:sonickun:20140629210833p:plain
 
 レベル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

f:id:sonickun:20140629212914p:plain
 
 レベル6は…何をしたいのかわからない(笑)。/static/gadget.jsから何かのガジェットをロードしているようです。

http://www.google.com/jsapi?callback=alert

 ↑こちらのjavascriptAPIの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')

 
 
 

すべてクリアすると…

f:id:sonickun:20140629220806p:plain
 
 Googleからケーキがもらえます。(アスキーアートですが)
 
 
 

感想

 問題を通して、かなりXSSの勉強になりました。最初の問題こそ簡単でしたが、レベルと難易度は必ずしも比例しないような感覚でした。
 もともと、XSSは任意のコードを実行できるようになってからが本番ですから、その先の、データを抽出したりなどの攻撃までやってみたかったです。