hosochinの技術ブログ

【セキュリティ】【安全なWebアプリケーションの作り方】で登場する主な攻撃手法とその対策をまとめる

はじめに

お世話になります、hosochinです
今回は「安全はWebアプリケーションの作り方(通称:徳丸本)」を読んでみました
この記事では主な攻撃手法とその対策について、一覧化しておきます

📚 書籍情報:

目次

参考書籍

「安全なWebアプリケーションの作り方 第2版」(徳丸浩著)

主な攻撃手法とその対策について

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

脆弱性が生まれる原因:

  • HTMLのエスケープが適切でない
  • 出力時のエスケープ不足

対策:

  • 要素内容については「<」「&」をエスケープする
  • 属性値についてはダブルクォートで囲って、「<」「”」「&」をエスケープする
  • HTTPレスポンスに文字エンコーディングを明示する
  • 入力値の検証、サニタイズ
  • 出力時のエスケープ処理
  • cookieにHttpOnly属性を付与
  • (TRACE メソッドの無効化)
  • (X-XSS-Protection レスポンスヘッダの使用)

SQLインジェクション

脆弱性が生まれる原因:

  • 動的なSQLクエリの作成
  • 入力値の検証不足
  • エラーメッセージの露出

対策:

  • プレースホルダによりSQL文を組み立てる
  • 可能であれば静的プレースホルダを使う
  • 詳細なエラーメッセージの抑止
  • 入力値の検証
  • データベースの権限設定

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

脆弱性が生まれる原因:

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

対策:

  • 秘密情報(CSRFトークン)の埋め込み
  • パスワード再入力
  • Refererのチェック

クリックジャッキング

脆弱性が生まれる原因:

  • HTMLの仕様の悪用

対策:

  • X-Frame-Optionsヘッダーの使用
  • 「重要な処理」の実行後には通知メールを送信する

セッションハイジャック

脆弱性が生まれる原因:

  • 主要なWebアプリケーション開発ツールが備えるセッション管理機構を利用しない
  • 安全なセッションID生成処理を開発することは技術的難易度が高い

対策:

  • Webアプリケーション開発ツールなどが備えるセッション管理機構を利用する(極力自作しない)
  • cookieにセッションIDを保存する
  • 認証時にセッションIDを変更する
  • 認証前にはセッション変数に秘密情報を保持しない

セッションIDの固定化攻撃

脆弱性が生まれる原因:

  • セッションIDを外部から強制できる仕組みになっている

対策:

  • セッションハイジャックの対策と同様

オープンリダイレクト脆弱性を悪用した攻撃

脆弱性が生まれる原因:

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

対策:

  • リダイレクト先のURLを固定にする
  • リダイレクト先のURLを直接指定せず番号指定にする
  • リダイレクト先のドメイン名をチェックする

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

脆弱性が生まれる原因:

  • HTTPヘッダの1行に1つのヘッダを定義でき、改行で区切られている性質を悪用する

対策:

  • 外部からのパラメータをHTTPレスポンスヘッダとして出力しない
  • リダイレクトやcookie生成を専用API(ライブラリ)にまかせる
  • ヘッダ生成するパラメータの改行文字をチェックする

cookieのセキュア属性不備を利用した攻撃

脆弱性が生まれる原因:

  • 開発者がcookieのセキュア属性について知らない
  • セキュア属性をつけるとアプリケーションが動かなくなる(HTTPとHTTPSが混在するWebアプリケーションなど)

対策:

  • cookieにセキュア属性を付与する

メールヘッダ・インジェクション

脆弱性が生まれる原因:

  • ヘッダの各フィールドは改行で区切られているという、メールヘッダの仕様を悪用

対策:

  • メール送信には専用のAPIやライブラリを使用する
  • 外部からのパラメータをメールヘッダに含ませないようにする
  • 外部からのパラメータには改行を含まないようにメール送信時にチェックする
  • メールアドレスのチェック
  • 件名のチェック

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

脆弱性が生まれる原因:

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

対策:

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

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

脆弱性が生まれる原因:

  • シェルを呼び出す機能のある関数を利用している
  • シェル呼び出しの機能のある関数にパラメータを渡している
  • パラメータ内に含まれるシェルのメタ文字をエスケープ漏れ

対策:

  • 設計フェーズで対策方針を決定する
  • OSコマンド呼び出しを使わない実装方法を選択する
  • シェル呼び出し機能のある関数の利用を避ける
  • 外部から入力された文字列をコマンドラインのパラメータに渡さない
  • OSコマンドに渡すパラメータのエスケープ処理
  • アプリケーションの稼働するユーザ権限を最小限にする

ファイルアップロード機能を悪用した攻撃

脆弱性が生まれる原因:

  • アップロードしたファイルが公開ディレクトリに保存される
  • サーバースクリプトを示す拡張子を指定できる

対策:

  • 公開ディレクトリに保存しない