備忘録なるもの

XSS game(google製) writeup

どうもこんにちは。グレープ粗茶 です。 ctfやweb系に関心を持っています。 今回は、CTFweb問の一つのxssをやりました。

※記事に間違いがありましたら、コメントでのご指摘お願いします。

writeup

https://xss-game.appspot.com/

上記のサイトでXSSの問題を解くことができる。 この記事では、xss初心者の記録用として残してみる。また、今回はかなりヒントを利用しています(´;ω;`)

このサイトでは、javascriptの一つのアラートを動作させることが課題となっている。

Level 1:Hello, world of XSS

f:id:grapesoda204:20190809234335p:plain
level1

まずhint2において<h1>?とある。 ここでh1タグを利用して、文字を入力するとタグが適用されている事が分かる。

そこで<script>を利用して、そのままalert("a")を入力すれば正解となる。 正解は

<script>alert("aa")</script>

f:id:grapesoda204:20190809234801p:plain
h1タグ利用

Level2: Persistence is key

f:id:grapesoda204:20190809235321p:plain hint3を見るとonerrorという単語がある。 これは、imgタグでのエラー処理に使われる属性であった。また、ここにjavascriptを適用することができるらしい。

onerror="alert('a');"と埋めれば正解になった。またエラー処理をさせる必要があるためsrc属性も必要であると思う。 正解は

<img src=" " onerror="script="alert('a');">

Level3:That sinking feeling...

f:id:grapesoda204:20190810002217p:plain
level3

今回の問題では、ソースコードを参考にする必要があった。 主に重要となるのは下記の部分であった。

 
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

f:id:grapesoda204:20190810075524p:plain

こちらの問題も上記と同じように文字列で押し出すようにするとよい。

onload="startTimer('{{ timer }}');"

上記の部分でjavascriptを使え、またtimerが直接代入されている。 まず、onloadの再集計を考える。

onload="startTimer('3');alert('3');"

とすればよい。 これより入力部分には、

3');alert('3

とすれば正解であった。

Level 5: Breaking protocol

f:id:grapesoda204:20190810082334p:plain

今回の問題では、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

f:id:grapesoda204:20190810091315p:plain 正直問題の意図も何もわからなかった。 ヒントを参考にすると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