HTTPリクエストヘッダーから推測できる攻撃|情報処理安全確保支援士試験 令和4年春期午前Ⅱ 問1
出典:令和4年春期 午前Ⅱ 問1
分野:セキュリティ / 情報セキュリティ
Webサーバのログを分析したところ,Webサーバへの攻撃と思われるHTTPリクエストヘッダーが記録されていた。次のHTTPリクエストヘッダーから推測できる,攻撃者が悪用しようとしていた可能性が高い脆弱性はどれか。ここで,HTTPリクエストヘッダー中の"%20"は空白を意味する。
〔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
〔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
- ア:HTTPヘッダーインジェクション(HTTP Response Splitting)
- イ:OSコマンドインジェクション
- ウ:SQLインジェクション
- エ:クロスサイトスクリプティング
TSUNAGARU-ADVICE
まず押さえたいこと
OSコマンドインジェクションは、Webアプリケーションに渡された入力値が、OSコマンドの一部として実行されてしまう脆弱性です。この例では、;cat /etc/passwdというOSコマンド実行を狙った文字列が含まれています。
迷ったときの判断軸
「;」はコマンドを区切るために使われることがあり、「cat /etc/passwd」はUNIX系OSでパスワード関連ファイルを表示しようとする典型的な攻撃例です。SQL文・HTMLスクリプト・HTTPヘッダーの改ざんではなく、OS上のコマンドを実行させようとしている点に注目すると判断できます。
科目Bにつなげるために
科目Bでは、攻撃文字列から脆弱性の種類を推定する問題が出ることがあります。入力値がSQLに渡されるならSQLインジェクション、画面に出力されるならXSS、OSコマンドに渡されるならOSコマンドインジェクションというように、入力値が最終的にどこで解釈されるかを確認しましょう。
このHTTPリクエストで注目すべき部分は、
?user=;cat%20/etc/passwdです。catは、UNIX系OSでファイルの内容を表示するコマンドです。また、/etc/passwdは、ユーザーアカウント情報が記録されているファイルです。なお、
%20はURLエンコードされた半角スペースを表します。そのため、cat%20/etc/passwdは、実際にはcat /etc/passwdという意味になります。問題となるのは、先頭にある
;です。UNIX系OSのシェルでは、;は命令の区切りとして扱われます。cat /etc/passwdつまり、本来の処理に続けて、攻撃者が指定した
cat /etc/passwdまで実行されるおそれがあります。その結果、サーバ上のアカウント情報がブラウザに表示されてしまう可能性があります。
このように、入力値にOSコマンドを紛れ込ませ、Webアプリケーションに不正な命令を実行させる攻撃を、OSコマンドインジェクションといいます。
したがって、イが適切です。
❌他選択肢が誤りの理由ア:HTTPヘッダーインジェクション(HTTP Response Splitting)
⇒HTTPレスポンスヘッダーに改行文字などを挿入し、不正なヘッダーやレスポンス本文を生成させる攻撃です。今回のリクエストでは、OSコマンドとして解釈され得る
;cat /etc/passwdがURLパラメータに含まれており、HTTPレスポンス分割を狙った内容ではありません。ウ:SQLインジェクション
⇒SQLインジェクションは、入力値にSQL文の一部を混入させ、データベースを不正に操作する攻撃です。今回の文字列は、SQL文ではなくOS上のファイルを表示する
catコマンドを実行させようとする内容です。エ:クロスサイトスクリプティング
⇒クロスサイトスクリプティングは、Webページに不正なスクリプトを埋め込み、利用者のブラウザ上で実行させる攻撃です。今回のリクエストには、スクリプトを実行させる記述ではなく、サーバ側でOSコマンドを実行させようとする記述が含まれています。