脆弱性とは、コンピュータのOSやソフトウェアにおいて、プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のことを指します。
本記事では、主なWebアプリケーションの脆弱性について解説します。
SQLインジェクション
SQLインジェクションとは、データベースサーバ(DBサーバ)と連携するWebアプリケーションにおいて、攻撃者が入力した文字列によって、DBサーバが誤動作または不正操作されてしまう脆弱性です。
Webアプリケーションは、利用者から入力情報を基にSQL文を生成しますが、入力された文字列の特殊文字が含まれていた場合に適切に処理しないと、DBサーバはそれをSQL文と解釈して、誤動作を起こしてしまうことが考えられます。
対策
SQLインジェクションの対策は以下になります。
- SQL文の組立てはプレースホルダで実装する
- SQL文の組立てを文字列連結により行う場合は、エスケープ処理(無害化処理)を行う
- Webアプリケーションに渡されるパラメタにSQL文を直接指定しない
OSコマンド・インジェクション
OSコマンド・インジェクションとは、外部からの攻撃により、WebサーバのOSコマンドが不正に実行されてしまう脆弱性です。特に、外部プログラムを呼び出す関数等を使用しているWebアプリケーションは注意を要します。
対策
OSコマンド・インジェクションの対策は以下になります。
- シェルを起動できる言語機能の利用を避ける
- シェルを起動できる言語機能の利用する場合は、引数の文字の組み合わせにを制限する(ホワイトリスト化)
クロスサイト・スクリプティング
クロスサイト・スクリプティングとは、Webアプリケーションに不正なスクリプトを埋めこむことができてしまう脆弱性です。この不正なスクリプトの埋め込みは、利用者が悪意のあるWebサイトをクリックすることなどで実行されてしまいます。
さらに、その不正なスクリプトが埋めこまれたWebサイトに利用者がアクセスすると、利用者のブラウザ上で不正なスクリプトが実行され、情報漏えいなどの原因となります。
対策
クロスサイト・スクリプティングの対策は以下になります。いずれも、不正なスクリプトを読み込まないための措置になります。
- Webサイトに出力する全ての要素に対し、エスケープ処理(無害化処理)を施す
- URLを出力するときは、「http://」や「https://」で始まるURLのみ許可する、または、URLにスクリプトを埋めこまれないようホワイトリスト化する
- Webページに出力する <script>…</script> 要素の内容を、外部からの入力で動的に生成しない
- スタイルシートを任意のサイトから取り込めるようにしない
- HTTPレスポンスヘッダの Content-Type フィールドで文字コード(charset)を指定する
- HTMLテキストを入力する場合は、構文解析を行い、ホワイトリスト化する
クロスサイト・リクエスト・フォージェリ
クロスサイト・リクエスト・フォージェリ(CSRF)とは、Webサイトにログイン中の利用者からリクエストについて、それが利用者が意図したリクエストか識別する仕組みを持たないことによる脆弱性です。
攻撃者により用意された罠により、利用者が意図しない処理を実行されられた場合、その攻撃を受けてしまう可能性があります。
対策
クロスサイト・リクエスト・フォージェリの対策は以下になります。いずれも、重要な処理を実行する際の、利用者のなりすましを防ぐための措置になります。
- POSTメソッドを使って hidden パラメタに秘密情報を入れて渡し、処理の際にはその秘密情報が正しいか確認する
- 処理を実行する直前のページで再度パスワード入力を求める
- Referer が正しいリンク元かを確認する
バッファオーバーフロー
バッファオーバーフローとは、プログラムが入力されたデータのサイズを適切に処理しないことで、プログラムが確保したメモリの領域を超えて、領域外のメモリが上書きされてしまう脆弱性です。
特に、バッファオーバーフローは、CやC++、アセンブラなど、直接メモリを操作できる言語が使われている場合に起り易くなります。
対策
バッファオーバーフローの対策は以下になります。
- 直接メモリにアクセスできない言語を使う
- 直接メモリをアクセスできる言語を使う場合は、最小限にする
セッション・ハイジャック
セッション・ハイジャックとは、セッション管理に不備により、攻撃者にセッションIDが不正に取得(ハイジャック)されてしまう脆弱性です。これにより、攻撃者による利用者のなりすましが行われる可能性があります。
対策
セッション・ハイジャックの対策は以下になります。
- セッションIDをURLパラメタに格納しない
- HTTPS通信で利用するCookieにはsecure属性を付ける
- ログイン成功後に新しくセッションを開始する
HTTPヘッダ・インジェクション
HTTPヘッダ・インジェクションとは、攻撃者により、HTTPレスポンスに任意のヘッダフィールドやボディを追加されてしまう脆弱性です。この攻撃は、HTTPレスポンスのヘッダが、外部から渡されるパラメタなどを利用して生成するWebアプリケーションで発生します。
これにより、そのHTTPレスポンスを受信した利用者のブラウザ上で、不正なスクリプトが実行される可能性があります。
対策
HTTPヘッダ・インジェクションの対策は以下になります。
- Webアプリケーションの実行環境や言語に用意されているヘッダ出力用のAPIを利用する
- 改行を許可しないよう、開発者自身で適切な処理を行う
メールヘッダ・インジェクション
メールヘッダ・インジェクションとは、メール送信機能を持つWebアプリケーションにおいて、外部の利用者により、メールアドレスが自由に設定できてしまう脆弱性です。これにより、管理者が設定していない宛先にメールが送信される可能性があります。
対策
メールヘッダ・インジェクションの対策は以下になります。
- メールヘッダを固定値にする
- メールヘッダを固定値にできない場合は、Webアプリケーションの実行環境などに用意されているメール送信用APIを使用する
- HTMLで宛先を指定しない
パス・トラバーサル
パス・トラバーサルとは、攻撃者により、Webサーバ上の任意のファイルが指定されてしまう脆弱性です。これによりWebアプリケーションが意図しない処理を行ってしまう可能性があります。
対策
パス・トラバーサルの対策は以下になります。
- 外部からのパラメタでWebサーバ内のファイル名を直接指定させない
- ファイルを開く際は固定のディレクトリを指定させる
クリックジャッキング
クリックジャッキングとは、利用者が意図しない操作(クリック)をするように、罠ページが仕組まれてしまう脆弱性です。利用者からは罠ページが見えて、罠ページ上のコンテンツをクリックしたつもりが、別のサイトのコンテンツがクリックしてしまう可能性があります。
対策
クリックジャッキングの対策は以下になります。
- 他ドメインのサイトからのframe要素やiframe要素による読み込みを制限する
- 処理を実行する直前のページで再度パスワードの読み込みを求める