* XSS Game Write-Up
Jul 27 2014
解けたの嬉しかったし初めてWrite-Upとやらを書いてみる。
ガチ勢には相当ゆるい内容らしいけどまぁいいよね。
以下ネタバレ注意
問題の流れとしては
- 全6問
- iframe内の擬似ブラウザでalert出せればオッケー
- 全部解けたらケーキあげるヨ!
って感じですかね。
Level 1: Hello, world of XSS
こんな感じのフォームが表示される
試しに“a"ってうつとこんな感じ
タグで囲まれて入力内容が出力されてますね。
とりあえず<script>タグを入れてみる。
<script>alert(1);</script>
そしたらalert出た。楽しい₍₍ ◝( ´ω´ )◟ ⁾⁾
Level 2: Persistence is key
こんな感じの画面
簡単な掲示板で、下のテキストボックスに内容をいれると追加されていく。
お約束的な流れでスクリプトタグの挿入を試みる。こんな感じに。
<script>タグ挿入はできたのだけどスクリプトが実行されない…
いろいろggったりしてみても分からんかったので友達のxss芸人に聞いたら「よくわからないけど動かない」らしいので別の方法を考える。
”>“とか”<“とか全然エスケープされてないので僕の知る数少ない定石を打ち込んだら成功。
<img src="x" onerror="alert('xss')">
Level 3: That sinking Feeling…
画面はこんな感じ。
"Image2"とかを選ぶとhashの値が"2"になって、画像も切り替わるみたいな感じ。
コードを見てみるとlocation.hashの値をsubstr(1)してhtml内に出力している。
出力部分だけ見るとこんな感じ。
var html = "Image " + parseInt(num) + "<br>"; html += "<img src='/static/level3/cloud" + num + ".jpg' />"; $('#tabContent').html(html);
てなわけで以下のテキストを突っ込んでタグ破壊。
'><script>alert("xss");</script>
Level 4: Context matters
画面はこんな感じ。
テキストボックスに数字を入れるとその数だけカウントしてくれるWebアプリ。
てなわけでどこにどう出力してるか確認。
コードを見てみるとGETリクエストで受け取った"timer"の値をtimer.html内の{{timer}}に出力している。
timer.html
<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" /> <br> <div id="message">Your timer will execute in {{ timer }} seconds.</div>
しかしながら"X-XSS-Protection"ヘッダがついてるため、この場合divタグ内にscriptタグを挿入することはできない。
のでstartTimer()関数内に着目し、以下をぶっこんで終わり。
');alert("xss");('
Level 5: Breaking protocol
プロトコルを破壊せよ。
どういうことでしょう。
画面はこんな感じ!
Sign upをクリックするとメアド入力を求められ、入力するとconfirm画面になり、最初のページにリダイレクトされる。
今回もLevel4と同じくJSでの出力でなく、サーバ側での出力に着目する。
するとsignup.htmlにこんなところがある。
<a href="{{ next }}">Next >></a>
ので、覚えたてのJavascriptスキームを使って終了!
https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert("xss");
Level6: Follow the
こんな感じの画面。
仕様としては、location.hashからJavascriptをロードしてscriptタグ内に出力って感じ。
なので外部からalertの含まれた.jsファイルを読みこませれば勝ち。
しかしながらhashの値は正規表現を通してるのでhttp://hogeとかhttps://hogeは通らない。
if (url.match(/^https?:\/\//)) { setInnerText(document.getElementById("log"), "Sorry, cannot load a URL containing \"http\"."); return; }
けど小文字大文字チェックはしてないのでHttp://***とすることで正規表現は回避。
とりあえず試しに自分のサーバに.jsファイルを置いて
#Http://sota1235.net/alert.js
とやってみる。
するとエラー。どうやら何かしらの制限がかかってて外部のリソースを読み込めない(?)らしい。
どうしたものかーと考えたところでdata URI スキームの存在を思い出す。
ので、alert("xss”);をbase64エンコード。
data:text/javascript;base64,YWxlcnQoInhzcyIpOw==
でもわざわざエンコードしなくてよいことに気づいたのでこれで解決
data:,alert("xss");
Cake!!
ケーキはアスキーアートのケーキでしたとさ。
しかしなんか型崩れしててりんごにしか見えない。
感想
初心者なりに楽しみました。
ggったりしながらだけど一応最後まで解けたし満足です。
何か間違いとかあったら@sota1235までお願いします。
(Write-Up適当でごめんなさい)
※この記事は WordPress に投稿した記事を変換したものです。一部不自然な表示があるかも知れません。ご了承ください。また、記事タイトル先頭の * は WordPress から移行した記事である印です。