変更要約: 初版
1.4攻撃手法(1)認証・Webアプリ
パスワードクラック(辞書攻撃/ブルートフォース/リバースブルートフォース/レインボーテーブル/パスワードリスト攻撃)、Webアプリの代表的攻撃であるXSS(反射型/格納型/DOMベース)・CSRF・クリックジャッキング・SQLインジェクション・OSコマンドインジェクション・ディレクトリトラバーサル・中間者攻撃(MITM)/MITBを学び、脆弱性の症状からどの攻撃が成立し、どの対策が有効かを判断する力を養います。
Webアプリケーション診断を担当するセキュリティ技術者にとって、脆弱性の「症状」から攻撃手法を特定し、対策の優先順位を決めることは日常業務の核です。同じ「入力値が想定外の動作を引き起こす」という症状でも、原因がSQL文への混入かOSコマンドへの混入かで対策はまったく異なります。この節では認証・Webアプリに対する攻撃手法を、症状→攻撃手法→対策の流れで学びます。
1.4.1パスワードクラック
- 辞書攻撃=辞書に載っている単語や過去に流出したよくあるパスワード候補を順に試す攻撃。ブルートフォース攻撃(総当たり攻撃)は考えられる文字の組み合わせを全て試す攻撃で、パスワードが長く複雑なほど成立しにくい。
- リバースブルートフォース攻撃=1つの固定パスワードに対して多数の利用者IDを次々試す攻撃。通常のアカウントロック(同一IDへの規定回数以上の失敗でロック)をすり抜けやすい点が特徴。
- レインボーテーブル攻撃=パスワードのハッシュ値と平文の対応表(レインボーテーブル)を事前に用意し、盗んだハッシュ値から高速に平文を逆引きする攻撃。ソルト(ハッシュ化前にランダムな値を付加)を使うと、事前計算した表が使い回せなくなり対策になる。
- パスワードリスト攻撃=他のサービスから流出した実在するID/パスワードの組を、別サービスへそのまま試す攻撃。パスワードの使い回しをしている利用者が標的になるため、多要素認証や使い回し防止の啓発が対策の核。
「ブルートフォース=全パスワード候補を1IDに総当たり」「リバースブルートフォース=1パスワードを全IDに総当たり」という主客の逆転を混同しないこと。「レインボーテーブル対策=ソルト」「パスワードリスト対策=多要素認証・使い回し防止」の対応も最頻出です。
1.4.2Webアプリケーション攻撃(XSS・CSRF・クリックジャッキング)
- XSS(クロスサイトスクリプティング)=Webアプリの入力値検証・出力エスケープの不備を突き、悪意あるスクリプトを他の利用者のブラウザ上で実行させる攻撃。反射型はURLパラメータ等がそのまま応答に反映される即時型、格納型は掲示板等にスクリプトが保存され閲覧者全員に影響する持続型、DOMベース型はサーバを経由せずクライアント側JavaScriptの処理だけで発生する。
- CSRF(クロスサイトリクエストフォージェリ)=ログイン済みの利用者に、意図しないリクエスト(送金・投稿等)を別サイト経由で送信させる攻撃。対策の中心はトークンによるリクエストの正当性検証。XSSは「スクリプトを実行させる」攻撃、CSRFは「意図しないリクエストを送らせる」攻撃という攻撃対象の違いを区別する。
- クリックジャッキング=透明化した正規サイトのボタン等を、罠サイトのコンテンツに重ねて表示し、利用者に気づかせずクリックさせる攻撃。対策は
X-Frame-Optionsヘッダ等で他サイトからのiframe埋め込みを制限すること。
1.4.3インジェクション系攻撃と中間者攻撃
- SQLインジェクション=入力値検証の不備を突き、想定外のSQL文をアプリに実行させる攻撃。データベースの不正な閲覧・改ざん・削除に直結する。対策の中心はプレースホルダ(プリペアドステートメント)による値のバインドで、単純な特殊文字のエスケープだけでは不十分な場合がある。
- OSコマンドインジェクション=入力値がOSのシェルコマンドの一部として実行されてしまう脆弱性を突く攻撃。SQLインジェクションと似た構造だが、攻撃対象がデータベースではなくOS自体である点が異なり、被害はサーバの完全な制御奪取まで及びうる。
- ディレクトリトラバーサル=
../等の相対パス指定を悪用し、公開を意図していないディレクトリ配下のファイル(設定ファイル・パスワードファイル等)へ不正にアクセスする攻撃。対策は入力されたパスの正規化と許可された範囲外へのアクセスを拒否する検証。 - 中間者攻撃(MITM)=通信する2者の間に攻撃者が介在し、通信内容を盗聴・改ざんする攻撃。MITB(Man-in-the-Browser)はさらに利用者の端末上のブラウザ自体をマルウェアで乗っ取り、暗号化された通信の復号後の内容を盗聴・改ざんする点でMITMより検知が難しい。
あるWebアプリケーション診断担当者が、あるECサイトの検索フォームに ' OR '1'='1 を入力すると全商品が表示されてしまう、という症状を発見したとします。この症状は入力値がSQL文にそのまま組み込まれて構文として解釈されていることを示しており、SQLインジェクションと診断できます。対策として単純な特殊文字のエスケープだけでは検知漏れの懸念が残るため、プレースホルダ(プリペアドステートメント)による値のバインドへの修正を優先度最高で提案します。並行して同じサイトの掲示板機能で <script> タグを含む投稿がそのまま保存され、閲覧した全利用者のブラウザで実行されてしまう症状を発見した場合、これは投稿がサーバに保存され閲覧者全員に影響する持続型の症状であることから格納型XSSと診断し、出力時のHTMLエスケープ処理の追加を提案します。さらに、ログイン中の利用者が罠サイトを閲覧しただけで、本人の意図しない送金リクエストが正規サイトに送信されてしまう症状を発見した場合、これはスクリプトの実行ではなくリクエストそのものが本人の意図なく送信される症状であることからCSRFと診断し、リクエストにトークンを埋め込み検証する対策を提案します。もしこれがXSSと誤診断されHTMLエスケープだけで対処された場合、CSRFの根本原因(リクエストの正当性検証の欠如)は解決されず、対策が的外れになってしまいます。このように、「スクリプトが実行されるのか」「意図しないリクエストが送信されるのか」「SQL文が書き換わるのか」という症状の性質を正確に見極めることが、有効な対策を選ぶための出発点です。
| 観測された症状 | 診断される攻撃 | 有効な対策 |
|---|---|---|
| 検索フォームへの入力でSQL文が書き換わる | SQLインジェクション | プレースホルダ(プリペアドステートメント) |
| 掲示板の投稿が全閲覧者のブラウザで実行される | 格納型XSS | 出力時のHTMLエスケープ |
| 罠サイト閲覧だけで意図しないリクエストが送信される | CSRF | リクエストへのトークン埋め込みと検証 |
ひっかけ: 「ログイン中に罠サイトを見ただけで意図しない送金リクエストが送信される症状はXSSである」は誤りです——スクリプトの実行ではなくリクエスト自体が本人の意図なく送信されるためCSRFです。また「SQLインジェクション対策は特殊文字のエスケープだけで十分である」も誤り=エスケープ漏れのリスクが残るため、プレースホルダ(プリペアドステートメント)による値のバインドがより確実な対策です。
1.4.4この節のまとめ
- ブルートフォース(1IDに全パスワード)とリバースブルートフォース(1パスワードに全ID)を区別。レインボーテーブル対策はソルト
- XSS=スクリプトを実行させる、CSRF=意図しないリクエストを送らせる、という攻撃対象の違いを区別する
- SQLインジェクション対策はプレースホルダ、OSコマンドインジェクションは対象がOS自体、MITBは復号後の内容まで盗聴する点でMITMより深刻
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. あるWebアプリの検索フォームに `' OR '1'='1` を入力すると、本来表示されないはずの全商品が表示されてしまうことが判明した。この症状に対する診断と最優先の対策の組み合わせとして最も適切なものはどれか。
Q2. ログイン中の利用者が罠サイトを閲覧しただけで、本人の意図しない送金リクエストが正規サイトに送信されてしまう症状が確認された。悪意あるスクリプトの実行は確認されていない。この症状として最も適切な診断はどれか。
Q3. あるサービスで盗まれたパスワードのハッシュ値から、事前に用意したハッシュ値と平文の対応表を使って高速に平文を割り出す攻撃を防ぎたい。最も有効な対策はどれか。

