問36 ログから読む OS コマンドインジェクション

応用情報​技術者試験 令和7年度 春期 午前、全80問のうちの問36。

出典:令和7年度 春期 応用情報技術者試験 午前 問36(HTTP リクエストヘッダーは原本の画像を文字に書き起こした。ふりがなを省いた)

Web サーバのログを分析したところ,Web サーバへの攻撃と思われる HTTP リクエストヘッダーが記録されていた。次の HTTP リクエストヘッダーから推測できる,攻撃者が悪用しようとしていた可能性が高い脆弱性はどれか。ここで,HTTP リクエストヘッダー中の“%2⁠0”は空白を意味する。

〔HTTP リクエストヘッダーの一部〕
GET /cgi-bin/submit.cgi?user=;cat%20/etc/passwd HTTP/1.1
Accept: */*
Accept-Language: ja
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: (省略)
Host: test.example.com
Connection: Keep-Alive
  1. アHTTP ヘッダーインジェクション (HTTP Response Splitting)
  2. イOS コマンドインジェクション
  3. ウSQL インジェクション
  4. エクロスサイトスクリプティング
答えと解説を開く

正解はイです。

リクエストの 1 行目は GET /cgi-⁠bin/submit.cgi?user=;cat%2⁠0/etc/passwd です。%2⁠0 を空白に戻すと、user の値は「;cat /etc/passwd」です。シェルではセミコロンがコマンドの区切りなので、CGI がこの値をそのままシェルのコマンドに組み込むと、本来のコマンドのあとに cat /etc/passwd が実行され、利用者の一覧のファイルの中身が表示されてしまいます。入力に OS のコマンドを紛れ込ませて実行させる攻撃なので、OS コマンドインジェクションです。正解はイです。

ほかの選択肢が違う理由

  • アHTTP ヘッダーインジェクションは、入力に改行の文字 (%0d%0a など) を入れて、応答のヘッダーに勝手な行を足す攻撃です。このリクエストには改行の文字がありません。
  • ウSQL インジェクションは、入力に ' や OR のような SQL の文の断片を入れて、データベースへの問合せを書き換える攻撃です。cat はシェルのコマンドで、SQL ではありません。
  • エクロスサイトスクリプティングは、入力に <script> のようなスクリプトを入れて、ほかの利用者のブラウザで実行させる攻撃です。このリクエストにはスクリプトがありません。

仕組み

インジェクションは「注入」の意味で、入力の中に命令を混ぜて、プログラムに意図しない処理をさせる攻撃の総称です。どこに注入するか (シェル、SQL、HTML、HTTP ヘッダー) で名前が変わります。

OS コマンドインジェクションを防ぐには、入力をシェルに渡さない作りにするのが一番です。どうしても渡すときは、使ってよい文字だけを通すようにします。

この問に出る言葉