読者です 読者をやめる 読者になる 読者になる

ウェブアプリケーションセキュリティ

書評っぽいの Web Security

NGK(名古屋合同懇親会)2009忘年会キックオフでお会いしたid:tantack さんからリクエストがあったので、ざっと書きます。読んだのが8月なので記憶で書いてます。暇を見つけてもうちょっとちゃんと書く予定。

1998年よりネットワークやセキュリティ関連の情報を提供するJUMPERZ.NETを運営されていて、ウェブアプリケーション開発・ウェブアプリケーションファイアウォール開発・Guardian@JUMPERZ.NETを中心としたネットワークセキュリティ関連ツール開発されている株式会社ビットフォレスト取締役の金床さんの本です。

たぶん、考えうる全てのウェブアプリケーションの脆弱性について網羅されていると思います。

ウェブアプリケーションセキュリティ

ウェブアプリケーションセキュリティ

目次

ものすごいボリュームです。(^^;

  1. ウェブアプリケーションセキュリティの基礎
    1. HTMLによる制限は回避可能である
    2. 裏側で何が行われているのか
    3. パケットスニッファ
    4. プロキシツール
    5. ウェブブラウザの存在そのものが偽装できる
    6. リクエストの書き換えでHTMLの制限を回避する
    7. JavaScriptの制限を回避する
    8. hiddenフィールドの内容を書き換える
    9. フォームの値の書き換えとGET/POST
    10. Cookieを書き換える
    11. リファラーやUser-Agentを書き換える
    12. リクエストに含まれる情報は信用できない
  2. データ処理の原則と指針
    1. データ処理の原則
      1. 原則1
      2. 原則2
      3. 原則3
    2. hiddenフィールドとCookieに関する指針
      1. 指針1
      2. 指針2
      3. セキュリティと前提
    3. 「入力時に型チェック、出力時にエスケープ」とは
      1. 原則ではない
      2. 役に立つ場合もある
      3. なぜこの考え方が広まったのか
      4. 入力時に怪しい文字を消す方法
  3. XSS
    1. 攻撃の概要
    2. 攻撃者とターゲット
    3. 想定される攻撃例
      1. セッションハイジャック
      2. 機能の不正な実行
      3. 情報の漏洩
      4. ページの改ざん
      5. ワーム
    4. データ処理の原則とXSS
    5. ウェブアプリケーション側の対策
      1. 概要
      2. 可能な限りホワイトリスト方式を採る
      3. タグの外側
      4. タグの内側
      5. 過激なエスケープ
      6. 最上位bit無視の問題
      7. ダブルクォートなどを食う問題
      8. 異なるエンコーディングの問題
      9. DOM Based XSSについて
      10. IEMIMEタイプ無視問題
    6. 凶悪化するXSS
    7. クライアント側の対策
      1. JavaScriptを無効にする
      2. ウェブアプリケーションを利用しない
    8. クライアント側の保険的な対策
      1. JavaScriptのオン・オフを行う
      2. ログイン中は他のウェブサイトを見ない
      3. 利用が終わったらログアウトする
      4. ウェブブラウザを使い分ける
    9. WAFとXSS
  4. CSRF
    1. 攻撃の概要
    2. 全ての機能がターゲットとなる
    3. 認証とCSRFの関係
    4. 攻撃者のターゲット
    5. CSRFの特徴
      1. 特別な知識が必要
      2. イントラネットも攻撃可能
    6. 想定される被害例
    7. ウェブアプリケーション側の対策
      1. トークン方式
      2. ワンタイムトークン方式
      3. 固定トークン方式
      4. パスワードの再入力
    8. 推奨されない対策
      1. CAPTCHA
      2. セッションIDをトークンとして使う
    9. 誤った対策
      1. POSTにする
      2. セッションと結び付けないトークン方式
      3. 確認画面を挟む
      4. セッションIDを細かく変更する
      5. 画面遷移を制御する
    10. WAF(CSRFDetector)による対策
      1. WAFはCSRF対策として有効
      2. CSRFDetectorの概要
      3. トークン追加対象(レスポンス)の設定
      4. トークンチェック対象(リクエスト)の設定
      5. トークンの有効期限の設定
      6. 通信のブロックの設定
    11. クライアント側の対策
  5. セッション管理
    1. HTTPセッションとは
    2. セッション管理とは
    3. セッション管理と認証の関係
    4. IPアドレスやポートによるユーザの識別は不可能
    5. Cookieを使ったセッション管理
      1. Cookieとは
      2. セッションIDをCookieに保存する
      3. ユーザごとのデータはウェブアプリケーション側で管理する
      4. セッションIDに関する注意点
      5. Cookieとプライバシー
      6. 有効期間は短くする
      7. 有効ドメインは狭くする
      8. Cookie実装の現状
      9. Cookie Monster Bug
      10. 汚染されたCookieの様子
      11. path属性によるせいげんは回避可能
      12. HttpOnly属性を使う
      13. 他のウェブサイトにCookieが漏れる現象
      14. SecureフラグとHTTPSの関係
      15. Cookieのポイゾニング
      16. ログアウトできるようにする
    6. URI中のセッションIDを利用する方法
    7. hidden + POST方式
    8. セッションハイジャック
      1. 攻撃の概要
      2. 想定される被害例
      3. ウェブアプリケーション側の対策
      4. IPアドレスやUser-Agentによる保険的対策
    9. Session Fixation
      1. 攻撃の概要
      2. 想定される被害例
      3. ウェブアプリケーション側の対策
      4. Cookieを利用している場合
      5. よくある誤解
    10. WAFによるセッションIDの監視
      1. ルールの設定
      2. セッションIDに対するブルートフォース攻撃の監視
      3. セッション中のIPアドレスの変化
      4. セッション中のUser-Agentの変化
    11. BASIC認証
      1. 概要
      2. 実装
      3. ブルートフォース攻撃
      4. ログアウト
      5. XST
      6. 設定ミスに注意する
  6. SQLインジェクション
    1. 攻撃の概要
    2. Microsoft SQL Server
      1. テーブル名やカラム名の取得
      2. 認証の迂回
      3. カラム総数の取得
      4. 各カラムの型の取得
      5. 不正なアカウントの作成
      6. データの削除
      7. テーブルの削除
      8. 任意のテーブル、カラムの情報の取得
      9. エラーメッセージの利用
      10. データベースのバージョンの取得
      11. テーブル及びカラム一覧の取得
      12. サーバーへの侵入
      13. サーバーのIPアドレスの取得
      14. ファイルを読む
      15. データベースファイルの場所の取得
      16. データベースサーバー一覧の取得
      17. データベース一覧の取得
      18. スリープする
      19. エラーのコントロール
      20. シングルクォートの回避
    3. Oracle
      1. 認証の迂回
      2. カラム総数の取得
      3. 各カラムの型の取得
      4. 任意のテーブル、カラムの情報の取得
      5. エラーメッセージの利用
      6. データベースのバージョンの取得
      7. テーブル一覧の取得
      8. 現在のユーザの取得
      9. データベース名の取得
      10. データベースユーザ一覧の取得
      11. データベースファイルの場所の取得
      12. サーバーのIPアドレスの取得
      13. クライアントのIPアドレスの取得
      14. テーブルの定義の取得
      15. ビルトイン関数への攻撃
      16. エラーのコントロール
      17. シングルクォートの回避
    4. MySQL
    5. PostgreSQL
    6. 攻撃者とターゲット
    7. 想定される被害例
    8. ウェブアプリケーション側の対策
      1. バインドメカニズム中心の対策
    9. 保険的な対策
      1. 適切な権限を設定する
      2. エラーメッセージを隠す
      3. SQLの文法を変更してしまう
      4. データをエンコードした形で格納する
    10. 推奨されない対策
      1. メタキャラクターのエスケープ
    11. WAFとSQLインジェクション
      1. シグネチャベースの検知
      2. 通信量からの検知
      3. POSTリクエストの記録
  7. Doorman@JUMPERZ.NET
    1. 概要
    2. 必要となる環境
    3. 起動方法
    4. プロキシサーバーのスタート
    5. メインウィンドウ
    6. セッションウィンドウ
    7. リクエストウィンドウ
    8. レスポンスウィンドウ
    9. パラメータウィンドウ
    10. オプションウィンドウ
    11. リクエストとレスポンスを見る
    12. 不要なセッションのフィルタリング
    13. 日本語などの文字化けを防ぐ
    14. リクエストやレスポンスの書き換え
  8. Guardian@JUMPERZ.NET
    1. 概要
      1. リバースプロキシサーバー
      2. ネットワーク上に独立して動作
      3. 主な用途
        1. 攻撃の検知及び通信の遮断
        2. HTTPトラフィックを完全に記録
      4. 暗号化された通信(HTTPS)に対応
      5. オープンソース
      6. 開発の動機
      7. CUI
      8. ルールベース
      9. 入力に対する厳しい検査
    2. 攻撃の検知と防御
      1. リクエストの監視
        1. Nimda
        2. プロキシサーバーのスキャン
        3. バッファーオーバーフロー
        4. エクスプロイトコード
        5. NOPの連続
        6. chunkedエンコーディング
        7. NULL
        8. ディレクトリトラバーサル
        9. 不正なメソッド
        10. openssl too open
        11. Windowsシステムの拡張子
        12. 不正なURLエンコーディング
        13. POSTリクエストの記録
      2. レスポンスの監視
        1. 不正なステータスコード
        2. 大量の個人情報の表示
        3. 少数の個人情報の表示
        4. エラーメッセージ
    3. プラグインの開発
      1. 概要
      2. プラグインの呼び出し
      3. Hello Guardian Plugin
      4. リクエストを書き換える
      5. URIを書き換える
  9. ディレクトリトラバーサル
  10. コマンドインジェクション
  11. ヘッダインジェクション
  12. HRS
  13. XST
  14. Connection Flooding
  15. SSL MITM攻撃
  16. DNSを使った攻撃
  17. クロスドメイン通信
  18. AJAX

全般的にどんな内容?

ありとあらゆる脆弱性について、攻撃(crack)の仕方とその影響(被害)について詳細に書かれています。したがってscript-kiddyのcrackの教科書として使うことも可能*1

被害の一例として、クリックしただけでオンラインバンキングで勝手に振込みされてしまったり、オンライン証券で勝手に発注→約定させられてしまったりとか深刻な事例も載ってます。

お仕事でお金・人命などcriticalなものを扱うWeb Applicationやる人は、一読しておくのが良さそうです。

*1:良い子は真似しないように!