Webアプリケーションの各種脆弱性の影響・原因・対策【出力に起因する脆弱性】

体系的に学ぶ 安全なWebアプリケーションの作り方を読みました。「Webアプリケーションの各種脆弱性の影響・原因・対策」という観点から、学んだことをまとめようと思います。

表示処理

【クロスサイト・スクリプティングXSS)】

影響
  • サイト利用者のブラウザ上で、攻撃者の用意したスクリプトの実行によりクッキー値を盗まれ、利用者が成りすましの被害にあう
  • 同じくブラウザ上でスクリプトを実行させられ、サイト利用者の権限でWebアプリケーションの機能を悪用される
  • Webサイト上に偽の入力フォームが表示させられ、フィッシングにより利用者が個人情報を盗まれる
原因

HTML生成の際に、HTMLの文法上特殊な意味を持つ特殊記号を正しく扱っておらず、開発者の意図しない形でHTMLやJavascriptを注入・変形されてしまうこと

対策(基本的なもの)

(必須対策)

  • 表示の際に、HTMLで特殊な意味を持つ記号文字をエスケープする
  • HTTPレスポンスに文字エンコーディングを明示する

(保険的対策)

  • 入力値を検証する
  • クッキーにHttpOnly属性を付与する
  • TRACEメソッドを無効化する

SQL呼び出し

SQLインジェクション

影響
  • データベース内のすべての情報が外部から盗まれる
  • データベースの内容が書き換えられる
  • 認証を回避される(IDとパスワードを用いずにログインされる)
  • その他、データベースサーバー上のファイルの読み出し、書き込み、プログラムの実行などを行われる
原因

パラメータとして指定した文字列の一部がリテラルをはみ出すことにより、SQL文が変更されること

対策

静的プレースホルダーを利用する

リダイレクト処理

【HTTPヘッダ・インジェクション】

影響
  • 任意のクッキーの生成
  • 任意のURLへのリダイレクト
  • 表示内容の改変
  • 任意のJavascript実行によるXSSと同様の被害
原因

リダイレクト先URLやクッキー値として設定されるパラメータ中に改行を挿入した場合に、改行がそのままレスポンスとして出力されること

対策

以下のいずれかを行う。

  • 外部からのパラメータをHTTPレスポンスヘッダとして出力しない
  • リダイレクトやクッキー生成の専用ライブラリあるいはAPIを使用し、パラメータ中の改行コードをチェックする

メール送信

【メールヘッダ・インジェクション脆弱性

影響
  • 件名や送信元、本文を改変される
  • 迷惑メールの送信に悪用される
  • ウィルスメールの送信に悪用される
原因

宛先や件名として設定されるパラメータ中に改行を挿入した場合に、改行がそのままヘッダとして出力されること

対策

メール送信には専用のライブラリを使用する。 その上で、以下のいずれかを行う。

  • 外部からのパラメータをメールヘッダに含ませないようにする
  • 外部からのパラメータには改行を含まないようにチェックする

OSコマンド呼び出し

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

影響
  • Webサーバー内のファイルの閲覧・改ざん・削除
  • 外部へのメールの送信
  • 別のサーバーへの攻撃
原因

以下の3条件がすべて満たされていること。

  • シェルを呼び出す機能のある関数(system、openなど)を利用している
  • シェル呼び出しの機能のある関数にパラメータを渡している
  • パラメータ内に含まれるシェルのメタ文字をエスケープしていない
対策

以下のいずれかを行う(上から、優先して採用すべき順)。

  • OSコマンド呼び出しを使わない実装方法を選択する
  • シェル呼び出し機能のある関数の利用を避ける
  • 外部から入力された文字列をコマンドラインのパラメータに渡さない
  • OSコマンドに渡すパラメータを安全な関数によりエスケープする

所感

出力に起因する脆弱性については、共通の原理(終端を示すマークを混入させて、その後の文字列の構造を変化させる)で発生することがわかりました。今後は、この視点に気をつけて設計・コーディングを行っていこうと思います。