とあるサイトでXSSができてしまうことを偶然発見しました。
ところが普段私が使ってるChromeだとブロックしてくれるらしく、スクリプトの実行まではされませんでした。そこで他のブラウザではどうなってるのだろうと思って調べてみました。
検索窓などを想定したXSSぜい弱性のあるPHPコード
<?php
function xssPrint($post_name){
if($_POST[$post_name] == '')
return;
$text =mb_convert_encoding($_POST[$post_name],"UTF-8","auto");
if(get_magic_quotes_gpc())
$text= stripslashes($text);
print $text;
}
function xssPrint2($post_name){
if($_GET[$post_name] == '')
return;
$text =urldecode(mb_convert_encoding($_GET[$post_name],"UTF-8","auto"));
if(get_magic_quotes_gpc())
$text= stripslashes($text);
print $text;
}
?>
<html>
<head><title>XSS test</title></head>
<form name="form" method="post" action="XSS.php">
Fromで送信するタイプ
<input ype="text" name="xss1" value="<?php xssPrint('xss1');?>" ><br />
URL引数で送信するタイプ
<input ype="text" name="xss2" value="<?php xssPrint2('xss2');?>" ><br />
<button type="button" onClick="location.href='XSS.php?xss2='+encodeURI(document.form.xss2.value)">URL引数</button>
<button type="submit">From</button>
</form>
</html>
これに対して
ぬるぽ♪" /><script type="text/javascript">window.alert("...Hello. Mr. ....");</script>
と送ってみると、実行されちゃうことがわかります。ちゃんと実用アプリではユーザーの入力値はよほどのことがない限り、htmlescape()しておくか、スクリプトタグ、iframeを拒否するようにしましょう。
調査結果
| ブラウザ |
ぜい弱性の種類 |
調査結果 |
| Chrome 4.0.249.78 |
URL |
OK |
| From |
OK |
| IE8 |
URL |
OK |
| From |
NG |
| FF3.6 |
URL |
NG |
| From |
NG |
| Safari |
URL |
NG |
| From |
NG |
…Chorme最高!どっちの場合もちゃんとブロックしてくれました。FormのほうはURLの場合に比べて遭遇する可能性は少ないと思いますけど、たとえばFormに値を自動入力して、自動でポストしちゃうスクリプトをブックマーレットとして作ってTwitterのおかげで大活躍なURL短縮サービスかなんかで一見わからないようにしておけばURLと変わらなくなります。
まぁそもそもこういうぜい弱性を作っちゃう開発者が悪いのですが、安全なことにこしたことはありません。
ってことで、Chromeお勧めだよ!!爆速だよ!便利だよ!軽いよ!!(笑)