
ビビッドソウルの池山です。
私はディレクター兼エンジニアを行なっています。
今回は社内でWebサイトが実際どのように攻撃されるのかについて、初歩的な手段を一部紹介したため、こちらでも共有します。
リクエストパラメータの書き換え
簡単なもので言えばお問い合わせフォームの内容ですが、リクエストパラメータをツールやシステム等を使用して書き換えることで、ウェブサイトに思わぬ動作を行わせることができる場合があります。(そのお問い合わせフォームが書き換えの対策を行なっていない場合)
書き換えが可能なパラメーター(ヘッダ)については、例えば以下のようなものがあります。
Acceptヘッダ | $_SERVER{HTTP_ACCEPT} |
Refererヘッダ | $_SERVER{HTTP_REFERER} |
Accept-Languageヘッダ | $_SERVER{HTTP_ACCEPT_LANGUAGE} |
Content-Typeヘッダ | $_SERVER{CONTENT_TYPE} |
User-Agentヘッダ | $_SERVER{HTTP_USER_AGENT} |
Hostヘッダ | $_SERVER{HTTP_HOST}, |
$_SERVER{SERVER_NAME} | |
Cookieヘッダ | $_SERVER{HTTP_COOKIE} |
Hostヘッダ内ポート番号 | $_SERVER{SERVER_PORT} |
リクエストパラメータの書き換えへの対策
・パラメータは悪意のあるものが送られてくる前提で考え、ホワイトリスト方式で必要なパラメータのみ使用し、エスケープを行う
・環境変数であっても、ヘッダーから取得したと思える内容については同様に扱う
・セッションを利用する
クロスサイトスクリプティング
有名な脆弱性なので名称はよく聞くと思いますが、実際のところどういった方法で攻撃してくるのか? を簡単にご紹介したいと思います。
方法としては、シンプルに問い合わせフォーム等の入力欄に、片っ端からjavascriptを入力してみます。
例えば次の図のように入力します。

確認画面などで、javascriptのアラートが動いてしまったら、その問い合わせフォームはクロスサイトスクリプティングの脆弱性があり、危ないということになります。
次の図のように、確認画面でもエスケープされて入力された文字がそのまま表示されるか、無効化されて何も表示されないか、もしくはそもそも先に進めないようになっていれば何らかの対策がされているということになります。

クロスサイトスクリプティングへの対策
まずは入力内容を画面上に表示する場合、特殊文字を変換するところから始めます。
PHPでは、htmlspecialcharsを使用すれば特に問題ありません。
(htmlspecialchars() → 特殊文字を HTML エンティティに変換する)
また、データベースへの保存の際にも攻撃ができるため、こちらもエスケープします。
mysqlとPHPという組み合わせの場合、mysql_real_escape_stringを使用すれば問題ないはずです。
(DB毎にエスケープ関数はあったと思います)
まとめ
Webサイトの脆弱性(初級編)の対策としては、下記2点を押さえておけばいいのかなと思います。
1. フォームから送られてくるパラメータを信用しない(必ずバリデーションをかけたデータを保存)
2. ウェブサイト上にデータ(特にユーザー入力)を表示する場合は、エスケープをかける
フレームワークやCMSのシステムを使っていれば、表示や保存の際にもあまり意識する必要はないのですが、裏側の仕組みで何をしているのか知っておくことは大切ですね。