xss-gameで遊んでみた

久々の投稿です.
ShownetやHardening1010cfなどいろんなイベントに参加させていただいて
大変充実してます.
そしていつの間にか社会人2年目になっていました.

さて, タイトルの通り
勉強会に参加した際に, xss-game(下記のサイト)を教えてもらったので
遊んでいました.

https://xss-game.appspot.com

この後からはネタバレになるかもしれませんので,ご注意を.
解答を載っけていますが, 解き方等は正確でない可能性があります.
その辺はご了承くださいましm(_ _)m

Level1

何にも考えずに
フォームに<script> alert(1); </script>入れちゃったら攻撃できた.

Level2

ヒントみたらscriptタグは使えないらしい.
br,i,spanタグあたりは使えるっぽい.
もしかしたらaタグあたりも使えるんでねーかって予測して
実際にaタグ入れてみたらちゃんとリンクになっていた.
aタグのhrefにjavascript入れたら実行できたなあと思い下記を入力して
実行して, リンクをクリックしたら攻撃できた.

<a href="javascript: alert(1);"> test </a>

Level3

frameの後の数字でイメージの切り替えをやっているみたい.
chooseTabをみてると, imgタグの中に引数のnumを直接入れて
jqueryの.html使ってタグを書き出している.
なので, numにscriptを埋め込んだタグが入れば多分いけるんじゃないかなあと.
で, URLのシャープの後に'<img src=. onerror="alert(1)"/>'と入力したらOKかなと思いやってみたら攻撃成功.

Level4

ボタンを押した時の挙動がonload="startTimer('{{ timer }}');"になっているので,
onload="startTimer('');alert('1');" みたいなのを作れたら多分行けるんじゃないかと思い
フォームに');alert('1を入力したら攻撃成功.

Level5

signup.htmlのソースを見ると <a href="{{ next }}">Next >></a> と書かれていた. {{ next }} は URLのパラメータに next=confirmと書かれていて、実際にWebを見た際は <a href="confirm">Next >></a> となる. nextのvalueがそのまま入るので、valueをいじればいけそう. hrefはjavascriptのコードも実行可能なので URLを https://xss-game.appspot.com/level5/frame/signup?next=javascript: alert(1); とした後にGoを一旦クリック. 次にNextを押すと、攻撃成功.

Level6

URLの#の後に入力した文字列が画面と
srcタグの中に埋め込まれる.

例えば下記のように入力すると

https://xss-game.appspot.com/level6/frame#hogehoge.js

headタグの中にある

<script src="hogehoge.js"></script>

<div id="log">Loaded gadget from hogehoge.js</div>

となる. 入力した文字列がsrc内に直接入れられてるので、
ここにどうにかこうにかjavascriptのコードを入れ込めちゃえば多分いけそう.

imgタグでdataスキーム使ってたりするのは見たことあって、
多分scriptタグでもいけるんじゃないかなと思いググったらあった. https://mgng.mugbum.info/418

なので、こんな感じで書けたら攻撃できた.

#data:text/javascript,alert(1)

どうやらこの問題はLevel6で終わりらしい.
総計7時間くらいはかかったけど, 結構勉強になりました.

ソースやヒントを結構見ちゃったけど,
実際の脆弱性診断では裏側のソースコードを読むことはなく
入力値とその入力値が画面のどこで使われているかを判断して診断をすると
勉強会でいろいろ教えてもらいました.

おしまい.