クロスサイトスクリプティング
クロスサイトスクリプティング(以下XSS)とは、掲示板、SNSなどを代表とするユーザーが入力するコンテンツを利用した攻撃です。
XSS体験
XSSがどのような攻撃なのかを体感しましょう。
タグインジェクション
まず、課題のECサイトの管理ページにアクセスしましょう。(ユーザー名: admin でログイン)
商品追加機能にはまずタグインジェクションという脆弱性があります。
商品名:
<h1>テスト</h1>
その他の項目: 任意のもので結構です。
として商品を追加してみましょう。
追加した商品の商品名を一覧で確認すると、h1タグの効果により文字が大きく表示されています。
つまり、任意のHTMLタグを利用することができるようになっているということになります。この脆弱性を「タグインジェクション」と呼びます。
タグインジェクションを利用したXSS
タグインジェクションを利用すると、任意のJavaScriptを実行することが可能です。
商品名:
<script>alert("JavaScriptが実行されました。")</script>
その他の項目: 任意のもので結構です。
としてさらに商品を追加してみましょう。
商品名を表示するページを開くたびに、自動的にアラートが表示されるようになってしまいました。scriptタグの中身を工夫すれば様々な攻撃が可能です。
商品名:
<script>location.href = "http://yahoo.co.jp"</script>
その他の項目: 任意のもので結構です。
としてさらに商品を追加してみましょう。
商品名を表示するページを開くたびに、自動的にヤフーのトップページが表示されるようになってしまいました。この時に、表示内容が全く同じ別サービスに遷移していたとしたらどうでしょうか?
他にも様々な攻撃が可能ですが、十分にこの攻撃の恐ろしさを理解していただけたと思います。
現在の状態のままでは管理ページを開くことができません。phpmyadminを通じて、itemsテーブルから該当の商品を削除しておきましょう。
対策・タグインジェクションを防止する。
XSSの対策として代表的なものが
- htmlタグのエスケープ処理
- htmlタグの除去
の2つです。PHPの場合、エスケープ処理ではhtmlspecialchars関数、タグの除去の場合にはstrip_tags関数などが用いられます。
エスケープ処理とは
エスケープ処理とは、本来特殊な効果を持つ文字を同じ見た目の単なる文字を意味する文字列に置き換える処理のことです。
例えばタグのかっこに利用される 不等号
<
であれば
<
に置き換えることで画面上に不等号を表示することができます。(ltはless than つまり「小なり」の略です。)
エスケープ処理の実装
それでは、実際にエスケープ処理を実装しましょう。
エスケープ処理は、出力時つまり print echo を行うタイミングで実行します。
データベース等に保存する時にエスケープしてしまうと、データの汎用性がなくなったり二重エスケープに繋がったりしますので避けましょう。
まとめ
クロスサイトスクリプティングは、ユーザーの入力値がHTMLエスケープされずにそのまま出力されてしまう箇所を特定し、そこにJavascriptを埋め込むことで行われる攻撃でした。
対策のために、PHPのスクリプトからの出力箇所はやむを得ない場合を除いてすべて出力直前にエスケープするようにしましょう。