こんにちは。サイオステクノロジーの川田です。
今回はWebアプリケーションの脆弱性のひとつ、クロスサイトスクリプティング(XSS)をご紹介致します。
クロスサイトスクリプティング(XSS)とは
クロスサイトスクリプティングとは攻撃者が悪意のあるスクリプトを埋め込み、ユーザーに実行させる攻撃手法。この攻撃により利用者はCookieのデータや個人情報等を攻撃者に送信してしまい、意図しない操作を実行させられてしまいます!
図にまとめてみました。
②何も知らない利用者は罠が仕掛けられたリンクをクリック。
③偽サイトのログイン画面にジャンプ!
④Sサイト用のIDとPWを利用者は偽サイトで入力しログインを押す。
⑤攻撃者は利用者が入力したIDとPW情報を取得することができてしまう。
PHPを使ってXSS攻撃を実際にしてみよう!
入力画面を用意しました。
こちらはXSS対策をされていない簡単なプログラムになります。
「確認」ボタンをクリックすると、入力した値が出力されます。
それでは入力フォームに「名前」+スクリプトを入力してみます。
※こちらはCookieから値を取得するためのスクリプトになります。
<script>alert(document.cookie)</script>
事前に入力画面のhtmlファイルにテスト用のCookieを書き込みました。(4行目~6行目)
<!DOCTYPE html> <html lang="ja"> <head> <script type="text/javascript"> document.cookie = "test=HelloWorld"; </script> <meta charset="utf-8"> <title>XSSテスト-入力画面-</title> </head> <body> <h1>入力画面</h1> <form action="confirm.php" method="post"> <label for="username">Name:</label> <input type="text" style="width:290px;" name="name"><br/><br/> <input type="submit" value="確認"> </form> </body> </html>
「確認」ボタンをクリックすると。
確認画面に先ほど保存したCookieデータが表示されてしまいました((((;゚Д゚))))
では対策方法をみていきましょう。
基本的なXSS対策とは
サニタイジングで対策を行うことです。
先ほどのscriptタグは対策をしなければJavaScriptのスクリプトが実行されてしまいます。
これらの文字列を実行させないようにするのがサニタイジングというわけです。
ではどうやるか!?ということになりますが、PHPでは関数が用意されております。
htmlspecialchars関数について
■変換対象となる文字
変換前 | 変換後 |
& [アンパサンド] | & |
” [ダブルクォート] | 引数で「ENT_NOQUOTES」が指定されていない場合は" |
‘ [シングルクォート] | 引数で「ENT_NOQUOTES」が指定されている場合は'あるいは' |
< [小なり] | < |
> [大なり] | > |
詳しくは公式ページをご覧ください!
参考☞htmlspecialchars
htmlspecialchars関数を使ってみよう!
先ほどのプログラムにhtmlspecialchars関数を使用して、動かしてみます。
■変更前
$name = $_POST['name'];
■変更後
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8");
それではこちらのスクリプトを入力画面に入力します。
<script>alert(document.cookie)</script>
そうするとスクリプトが文字として扱われ、確認画面にそのまま表示されることができました!
先ほどの「<script>alert(document.cookie)</script>」はhtmlspecialchars関数を使用すると、
「<script>alert(document.cookie)</script>」と変換されます!
※ブラウザのソースを表示してみると変換後の値が表示されております。
まとめ
今回はPHPの関数を使用して、ご紹介致しました。
CakePHPは先ほど使用したhtmlspecialchars関数をh()に省略することができます。
viewの出力箇所に「<!–?= h($name) ?–>」をするとエスケープされます。
■Laravel
viewの出力箇所に「{{ $name }}」と実装することでXSS対策を行うことができます。
もし、タグをそのまま実行したいときは「{!! $name !!}」とするとタグをそのまま実行します。
簡単ではありましたが、最後までお読みいただきありがとうございましたm(__)m