LGBTQのシンボル

2010年2月7日日曜日

XSSって怖ぇ~~

とあるサイトで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を拒否するようにしましょう。
コメントを頂いてやっぱり、ちゃんとhtmlescape()しておいた方がいいと思いました。しかもオプションで用意されている引数を指定した方がいいみたいです。hakさん、ありがとうございました。

調査結果


ブラウザ ぜい弱性の種類 調査結果
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お勧めだよ!!爆速だよ!便利だよ!軽いよ!!(笑)

2 コメント:

  1. ALAINはともかく、商用では重要な問題ですよね。勉強になりました

    http://www.phppro.jp/phptips/archives/vol4/3
    ↑プログラム側ではこんな対応もあるみたいですね

    返信削除
  2. @hakさん
    おお!そうか、HTMLタグの「onMouseover」とかでもスクリプトが実行できちゃうんでしたね。こちらこそ勉強になりました。

    返信削除