Webアプリケーションの脆弱性と対策

Webアプリケーションを開発する上で、セキュリティ対策の知識は必須です。
今回は、IPA(情報処理推進機構)で紹介されている一般的な攻撃手法の中で、特に重要なものを紹介したいと思います。

参考:IPA 安全なウェブサイトの作り方

具体的な実装コードについては個別の記事で解説しますので、まずは広く概要をご説明します。
詳しくは、上記のガイドなどを熟読することをお勧めします。

SQLインジェクション

Webアプリケーションでは、SQLという言語を使ってデータをデータベースに格納したり、問い合わせしたりします。
SQLインジェクションは、このSQLに任意のパラメータを埋め込んで、不正なデータを保存させたり、重要な情報を抜き出したりする攻撃手法です。

リスク

個人情報や機密情報を奪取される危険があります。
また、データベースに予期しないデータを保存させられる危険があります。

対策

SQLに埋め込む文字列のエスケープ(SQL上特別な意味のある文字の変換)を行うことで対策します。
PHPの場合は、mysqliというクラスライブラリの、プリペアドステートメント機能などで対策できます。

OSコマンド・インジェクション

プログラミング言語には、OSのコマンドを実行する関数が存在します。(PHPの場合はexec関数、system関数などが該当します)
OSコマンド・インジェクションは、このOSコマンドを実行する関数に対して、任意のパラメータを含め、不正なアクセスを行ったり、予期しないコマンドを実行させる攻撃手法です。

リスク

パスワードファイルを閲覧されたり、システムの改ざんを行われたり、予期しないコマンドを実行されたりする危険があります。

対策

極力OSコマンド実行関数の使用を控えます。また、利用する場合も、Webから渡ってきた値を使わないように心がけましょう。
やむを得ずWeb経由で取得した値を使用する場合は、変数のサニタイズ(危険な文字列の除去や変換)や、正規表現での値チェックを行うようにします。
PHPでは、escapeshellcmd関数やescapeshellarg関数を利用します。

ディレクトリ・トラバーサル

プログラミング言語には、システム上のファイルを読み込む関数や構文が存在します。(PHPの場合はinclude構文、require構文、fopen関数、file_get_contents関数などが該当します)
ディレクトリ・トラバーサルは、このファイルを読み込む関数や構文に対して、任意のパラメータを含め、不正なアクセスを行う攻撃手法です。
ファイル読み込みについてはプログラムで行う機会が多いので、前述のような関数や構文利用には注意が必要です。

リスク

パスワードファイルを閲覧されたり、予期しない機密情報を閲覧されたりします。

対策

ファイル読み込み関数には、Webから渡ってきた値を使わないように心がけましょう。
やむを得ずWeb経由で取得した値を使用する場合は、変数のサニタイズ(危険な文字列の除去や変換)や、正規表現での値チェックを行うようにします。

セッション管理の不備

Webアプリケーションでは、複数のページをまたいで値を持ち回りたい場合、セッションという仕組みを利用します。また、セッションの仕組み上、セッションIDという文字列を奪取されると、他人にセッションを乗っ取られる被害にあってしまいます。
攻撃手法としては、『セッションハイジャック』『セッション固定化攻撃』が存在します。

リスク

他人にセッションを乗っ取られることで、個人情報の乗っ取りや、不正ログインの被害に遭う危険があります。

対策

『セッションIDを長くする』『こまめにセッションIDを再生成する』『セッションクッキーにセキュア属性を付ける』『セッションIDを固定値にしない』『セッションの有効期間を短くする』などの対策が考えられます。

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

クロスサイト・スクリプティングは、特定のページにjavascriptなどのタグを埋め込み、ユーザーを悪意のあるサイトに誘導したり、セッションIDを奪取したりする攻撃手法です。
Webからの値を(間接的であれ)画面に表示するページで注意が必要です。

リスク

任意のjavascriptコードなどを実行されることで、セッションを乗っ取られたり、フィッシングサイトに誘導されたりします。

対策

『HTMLタグとして意味のある文字(<>")をエスケープする』『javascriptタグの中にWebからの値を出力しない』『値を十分にバリデーションする』などの対策が考えられます。

CSRF(クロスサイト・リクエスト・フォージェリ)

Webアプリケーションでは、ログインをすることで特別なサービスを提供する場合があります。(ショッピングサイトや各種SNS、その他サービスなど)
CSRFは、ログインしなければ実行できない操作を実行させる攻撃手法です。
ユーザーがサービスを利用中に、ログインしたまま外部のサイトなどを閲覧した場合などに発生しえます。

リスク

強制投稿、強制物品購入、アカウント削除などが発生し、副次的に個人情報の奪取などの被害が発生する危険があります。

対策

『重要な処理を行う場合は、直前でパスワードの入力を求める』『ページ遷移時にハッシュコードを受け渡し、遷移後にデータベースなどを介して値を照合する』などの対策が考えられます。

ヌルバイトアタック

PHPでは、ヌルバイト(NULL文字)(\0)を終端文字として扱う関数があります。また、不正に終端文字を含んだ文字列の場合、入力内容のチェックなどが正常に機能しない状況となります。
ヌルバイトアタックは、Webの値にヌルバイトを混入させ、上記の異常を誘発させる攻撃手法です。

リスク

プログラムが意図しない動作をとり、副次的に情報漏洩やサービス障害が発生する危険があります。

対策

Webの値からヌルバイトを除去する対策が考えられます。

このページをシェア Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn