『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』を読んだので、内容をまとめてみます。
攻撃 | 概要 | 典型的な原因 | 発生箇所 | 影響を受けるページ | 影響の種類 | 影響の度合い | 利用者関与 | 対策の概要 |
---|---|---|---|---|---|---|---|---|
[ ] XSS | 開発者の意図しない形でHTMLやJSを注入・変形される | HTML生成の際に特殊記号を正しく扱っていないこと | Webアプリケーション上でHTML,JavaScriptを生成している箇所 | すべてのページ | Webサイト利用者のブラウザ上でのJSの実行・偽情報の表示 | 中~大 | 必要 | 1. 属性値はダブルクォートで囲む 2. HTMLで特別な意味を持つ記号文字をエスケープする |
[ ] SQLインジェクション | シングルクォートなどを用いてリテラルからはみ出した文字をSQL文として認識させ、アプリケーションが呼び出すSQL文を変更する | リテラルの扱いの不備 | SQL呼び出しをしている箇所 | すべてのページ | 情報漏えい・データ改ざん・認証の回避・プログラムの実行・ファイルの参照/更新 | 大 | 不要 | 静的プレースホルダ(値のバインドをデータベースエンジンで行う)を利用してSQLを呼び出す |
[ ] CSRF | アプリケーションの「重要な処理」を勝手に実行させる | Webの以下の性質のため、正規のリクエストと不正なリクエストの見分けがつかない 1. formのaction属性にはどのドメインのURLも指定できる 2. Cookieに保存されたセッションIDは自動的に送信される | 以下のいずれかのサイト上の「重要な処理」が行われるページ 1. Cookieのみでセッション管理が行われているサイト 2. HTTP認証・TLSクライアント証明書のみで利用者の識別をしているサイト | CSRF脆弱性のあるページ | 被害者の権限で「重要な処理」を実行させられる | 中~大 | 必要 | 「重要な処理」の前に正規利用者からのリクエストであることを確認する(CSRF対策トークン・パスワード再入力・Referer確認) |
[ ] クリックジャッキング | iframeとCSSを巧妙に利用して、透明にした攻撃対象ページと罠のサイトを重ね合わせ、利用者が気づかないうちに攻撃対象サイトでのクリックを誘導する | HTMLの仕様を巧妙に悪用 | マウスなどの操作のみで「重要な処理」を実行でき、かつ認証を要するページ | クリックジャッキング脆弱性のあるページ | 被害者の権限で「重要な処理」を実行させられる | 中~大 | 必要 | 「重要な処理」の実行ボタンなどがあるページでX-Frame-Optionヘッダを出力する |
[ ] セッションハイジャック | 第三者がセッションIDを悪用してなりすます | 1. セッションIDが推測可能 2. セッションIDを外部から強制できる 3. セッションIDをURLに埋め込んでいる | セッションIDを生成している場所 | セッション管理をしているページすべて | なりすまし | 大 | 不要 | 1. 実績のあるセッション管理機構を利用する(自作しない) 2. ログイン時にセッションIDを変更する 3. URL埋め込みのセッションIDの禁止 |
[ ] オープンリダイレクト | 任意のドメインにリダイレクトできる脆弱性(フィッシングに悪用可能) | 以下の両方 1. リダイレクト先のURLを外部から指定できる 2. リダイレクト先のドメイン名のチェックがない | 外部から指定したURLにリダイレクト可能な箇所 | Webアプリケーションの利用者が被害を受ける | フィッシングサイトへの誘導・マルウェアを配布される | 中~大 | 必要 | 以下のいずれか 1. リダイレクト先の固定 2. あらかじめ許可されたドメインのみリダイレクトする |
[ ] HTTPヘッダインジェクション | 任意のレスポンスヘッダの追加、レスポンスボディの偽造 | 外部から指定したパラメータに含まれる改行をそのままレスポンスとして出力する | 外部から指定したパラメータに基づいてHTTPレスポンスヘッダを出力している箇所 | すべてのページ | なりすまし、偽ページの表示、キャッシュ汚染 | 中~大 | 必要 | 以下のいずれか 1. 外部からのパラメータをHTTPレスポンスヘッダとして出力しない 2. パラメータ中の改行コードをチェックする |
[ ] ディレクトリトラバーサル | アプリケーションの意図しないファイルに対して閲覧・改ざん・削除をする | 以下の3つ 1. ファイル名を外部から指定できる 2. ファイル名として、異なるディレクトリを指定できる 3. ファイルに対するアクセス可否をチェックしていない | ファイル名を外部から指定できるページ | すべてのページ | 秘密情報の漏洩、データの改竄・削除、任意のスクリプトの実行、アプリケーションの機能停止 | 大 | 不要 | 以下のいずれか 1. 外部からファイル名を指定できる仕様を避ける 2. ファイル名にディレクトリ名が含まれないようにする 3. ファイル名を英数字に限定する |
[ ] OSコマンドインジェクション | 意図しないOSコマンドを実行する | シェルのメタ文字がエスケープされていない | シェルを呼び出す機能のある関数を実行している場所 | すべてのページ | 秘密情報の漏洩、データの改竄・削除、外部への攻撃、アプリケーションの機能停止 | 大 | 不要 | 以下のいずれか 1. シェル呼び出し機能のある関数の利用を避ける 2. シェル呼び出し機能のある関数には外部からのパラメータを渡さない 3. OSコマンドにわたすパラメータを安全な関数によりエスケープする |