情報処理安全確保支援士 2014年 春期 午前2 問15
問題文
Webアプリケーションの脆弱性を悪用する攻撃手法のうち、Perlのsystem関数やPHPのexec関数など外部プログラムの呼出しを可能にするための関数を利用し、不正にシェルスクリプトや実行形式のファイルを実行させるものは、どれに分類されるか。
選択肢
ア:HTTPヘッダインジェクション
イ:OSコマンドインジェクション(正解)
ウ:クロスサイトリクエストフォージェリ
エ:セッションハイジャック
Webアプリケーションの脆弱性で外部プログラムを呼び出して実行させる攻撃は何か【午前2 解説】
正解の理由
なぜイが正解か:設問は「外部プログラムの呼出しを可能にする関数を利用し、不正にシェルスクリプトや実行形式のファイルを実行させる」攻撃手法を問うています。これはまさにアプリケーション経由でOSのコマンドを注入・実行させる攻撃であり、「OSコマンドインジェクション(Command Injection)」の定義に合致します。PerlのsystemやPHPのexecは外部コマンドを呼び出す関数で、未検証の入力を渡すことで任意のコマンドが実行されます。よってイが正解です。
解法ステップ
- 設問文のキーワードを抽出:「外部プログラムの呼出しを可能にする関数」「シェルスクリプトや実行形式のファイルを実行させる」
- 各選択肢の定義を照合:HTTPヘッダインジェクション、OSコマンドインジェクション、CSRF、セッションハイジャックの特徴を確認。
- 「外部コマンドの実行」が明確に述べられている選択肢(OSコマンドインジェクション)を選択する。
選択肢別の誤答解説
- ア: HTTPヘッダインジェクション
誤りの理由: HTTPヘッダの改ざんやレスポンス分割などを指し、サーバ上で外部プログラムを実行させる攻撃ではありません。 - イ: OSコマンドインジェクション
正解の理由: 外部プログラム呼出し関数に未検証の入力が渡され、任意のコマンドやスクリプトが実行される攻撃手法を正確に表しています。 - ウ: クロスサイトリクエストフォージェリ(CSRF)
誤りの理由: 利用者の認証を悪用して別のリクエストを強制的に行わせる攻撃で、サーバ側で任意のOSコマンドを実行させることが主題ではありません。 - エ: セッションハイジャック
誤りの理由: セッションIDの盗用により認可された操作を行えるようにする攻撃で、外部プログラム呼出し関数の性質とは異なります。
よくある誤解
- 誤解1: 「HTTPヘッダインジェクションと同じ」と考える
解説: HTTPヘッダインジェクションは応答やリダイレクト、ヘッダ分割攻撃に関係し、OS上の外部プログラム実行とは異なります。 - 誤解2: 「クロスサイトリクエストフォージェリ(CSRF)と似ている」と考える
解説: CSRFは利用者の認証情報を悪用してWebアプリ上の正当な操作を勝手に実行させる攻撃で、サーバ側でコマンドを直接実行させるものではありません。 - 誤解3: 「セッションハイジャックがコマンド実行を招く」と考える
解説: セッションハイジャックは認証セッションの乗っ取りであり、結果として様々な操作が可能になることはありますが、設問文で示す“外部プログラムを呼ぶ関数を利用して直接実行する”特性とは別物です。
補足コラム
- 発生原因と対策(実務でのポイント)
- 原因: 入力の未検証・不適切なサニタイズ、シェルに渡される文字列の組成、最小権限でない実行環境。
- 対策: 外部コマンド実行を禁止あるいは最小化、パラメータ化されたAPIの使用、入力のホワイトリスト検証、エスケープ処理、実行ユーザの権限制限。
- PHPでの例: execやsystemを使わず、必要ならば escapeshellarg/escapeshellcmd を使うかプロセス制御ライブラリを使う。だが根本は「外部コマンドを直接渡さない」こと。
FAQ
Q1: OSコマンドインジェクションとコマンドインジェクションは同じですか?
A1: はい。一般にはOSコマンドインジェクション、または単にコマンドインジェクションと呼ばれ、同義で使われます。
A1: はい。一般にはOSコマンドインジェクション、または単にコマンドインジェクションと呼ばれ、同義で使われます。
Q2: SQLインジェクションと似ていますか?
A2: 類似点は「外部入力をそのまま命令に組み込むことで不正操作が可能になる」点ですが、対象はSQL文かOSコマンドかで異なり、対策手法(パラメタ化、ホワイトリスト検査など)は共通する部分があります。
A2: 類似点は「外部入力をそのまま命令に組み込むことで不正操作が可能になる」点ですが、対象はSQL文かOSコマンドかで異なり、対策手法(パラメタ化、ホワイトリスト検査など)は共通する部分があります。
Q3: どうやって実務で検査すればよいですか?
A3: セキュリティテストではペネトレーションテストで入力にメタ文字やシェル演算子を投げて挙動を確認します。自動診断ツールやコードレビューで外部実行関数の使用箇所を重点的にチェックします。
A3: セキュリティテストではペネトレーションテストで入力にメタ文字やシェル演算子を投げて挙動を確認します。自動診断ツールやコードレビューで外部実行関数の使用箇所を重点的にチェックします。
関連キーワード: OSコマンドインジェクション、コマンドインジェクション、Web脆弱性、入力検証、PHP exec、Perl system、セキュリティ対策、脆弱性診断

\ せっかくなら /
情報処理安全確保支援士を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

