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

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

「重要な処理(取り消しできない処理)」の実行

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

影響
  • 利用者のアカウントによる物品の購入
  • 利用者の退会処理
  • 利用者のアカウントによる掲示板への書き込み
  • 利用者のパスワードやメールアドレスの変更
原因

以下のWebの性質があること。

  • form要素のaction属性にはどのドメインのURLでも指定できる
  • クッキーに保管されたセッションIDは、対象サイトに自動的に送信される
対策

(必須対策)

  • CRRF対策の必要なページを区別する
  • 正規利用者の意図したリクエストであることを確認する(確認方法には以下の3種類がある)
    • 秘密情報(トークン)の埋め込み
    • パスワード再入力
    • Refererのチェック

(保険的対策)

  • 重要な処理の実行後に、登録済みメールアドレスに通知メールを送信する

セッション管理

【推測可能なセッションID】

影響
  • 利用者の重要情報(個人情報、メールなど)の閲覧
  • 利用者の持つ権限での操作(送金、物品購入など)
  • 利用者のIDによるメール、ブログなどへの投稿、設定の変更など
原因

(技術的な原因)

  • 推測可能な情報を元にセッションIDを生成していること

(根本的な原因)

  • アプリケーション側でセッション管理機構を自作していること
対策

セッション管理機構を自作せず、Webアプリケーション開発ツールが備えるセッション管理機構を利用する

【URL埋め込みのセッションID】

影響

(同上)

原因

不適切な設定あるいはプログラミング

対策

クッキーにセッションIDを保存するよう設定する

【セッションIDの固定化】

影響

(同上)

原因

セッションIDを外部から強制できること

対策

ログイン時にセッションIDを変更する

リダイレクト処理

【オープンリダイレクタ脆弱性

影響

利用者が知らないうちに別ドメインに遷移する場合、フィッシング詐欺に悪用される

原因
  • リダイレクト先のURLを外部から指定できること
  • リダイレクト先のドメインのチェックがないこと
対策

以下のいずれかを実施する

  • リダイレクト先のURLを固定にする
  • あらかじめ許可されたドメインにのみリダイレクトするよう制限する

クッキー出力

【クッキーのセキュア属性不備】

影響

クッキーが平文で送信される場合があり、盗聴されると成りすましの被害に直結する

原因
  • 開発者がセキュア属性について知らない
  • セキュア属性をつけるとアプリケーションが動かなくなる
対策
  • クッキーにセキュア属性をつける

(セッションIDを保持するクッキーにセキュア属性をつけられない場合)

  • セッションIDとは別にセキュア属性つきのクッキーとしてトークンを発行し、ページごとにトークンを確認する

ファイルアクセス

【ディレクトリ・トラバーサル脆弱性

影響
  • Webサーバー内のファイルの閲覧
    • 重要情報の漏洩
  • Webサーバー内のファイルの改ざん、削除
    • Webコンテンツ改ざんによるデマ、誹謗中傷の書き込み
    • マルウェアのサイトに誘導する仕組みの書き込み
    • スクリプトファイルや設定ファイル削除によるサーバー機能停止
    • スクリプトファイル改ざんによる任意のサーバースクリプト実行
原因

以下の3条件を全て満たすこと。

  • ファイル名を外部から指定することができる
  • ファイル名として、絶対パス相対パスの形で異なるディレクトリを指定できる
  • 組み立てたファイル名に対するアクセスの可否をチェックしていない
対策

以下のいずれかを実施する。

  • 外部からファイル名を指定できる仕様を避ける
  • ファイル名にディレクトリ名が含まれないようにする
  • ファイル名を英数字に限定する

【意図しないファイル公開】

影響
  • 重要情報の漏洩
原因

以下の3条件を全て満たすこと。

  • ファイルが公開ディレクトリに置かれている
  • ファイルに対するURLを知る手段がある
  • ファイルに対するアクセス制限が掛かっていない
対策

(必須対策)

  • 非公開ファイルを公開ディレクトリに置かない

(保険的対策)

ファイルアップロード

【アップロードファイルによるサーバー側スクリプト実行】

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

以下の2条件を全て満たすこと。

  • アップロードしたファイルが公開ディレクトリに保存される
  • アップロード後のファイル名として、「.php」「.asp」などスクリプトを示す拡張子が指定できる
対策

以下のいずれか、あるいは両方を行う。

  • 利用者がアップロードしたファイルは、公開ディレクトリに置かず、スクリプト経由で閲覧させる
  • ファイルの拡張子スクリプト実行の可能性のないものに制限する

【ファイルダウンロードによるクロスサイト・スクリプティング

影響

XSSの影響と同様)

原因

ブラウザがファイルタイプを誤認する場合があること

対策
  • ファイルのContent-Typeを正しく設定する
  • 画像の場合、拡張子と画像の中身(マジックバイト)が対応していることを確認する
  • ダウンロードを想定したファイルには、レスポンスヘッダとして「Content-Disposition:attachment」を指定する

インクルード

【ファイルインクルード攻撃】

影響
  • Webサーバー内のファイルの閲覧による情報漏洩
  • 任意スクリプトの実行による影響
    • サイト改ざん
    • 不正な機能実行
    • 他サイトへの攻撃
原因

以下の2条件を満たすこと。

  • インクルードファイル名を外部から指定することができる
  • インクルードすべきファイル名かどうかの妥当性チェックをしていない
対策

(【ディレクトリ・トラバーサル脆弱性】の対策と同様)

eval

【evalインジェクション】

影響
  • 情報漏洩
  • サイト改ざん
  • 不正な機能実行
  • 他サイトへの攻撃
原因
  • evalを用いることがそもそも危険であること
  • evalに与えるパラメータのチェックがされていないこと
対策
  • eval(同等機能を含む)を使わない
  • evalの引数に外部からのパラメータを指定しない
  • evalの与える外部からのパラメータを英数字に制限する

共有資源

【競合状態の脆弱性

影響
  • 別人の個人情報などが画面に表示される(別人問題)
  • データベースの不整合
  • ファイルの内容の破壊
原因

以下の2条件を満たすこと。

  • 変数が共有変数である
  • 共有変数の排他制御をしていない
対策
  • できるだけ共有資源の利用を避ける
  • 共有資源に対して排他制御を行う