1. OSコマンドインジェクションとは
SQLインジェクションと同様に、脆弱性のあるサーバに対し、OSのコマンドをインジェクション(injection:注入)します。これによる脅威として、IPAの資料(https://www.ipa.go.jp/files/000017316.pdf)では以下のように記載されています。OSコマンドが自由に実行されると何が起こるかを考えると、理解しやすいでしょう。
発生しうる脅威(IPA資料) |
---|
OS コマンド・インジェクション攻撃により、発生しうる脅威は次のとおりです。 - サーバ内ファイルの閲覧、改ざん、削除 重要情報の漏えい、設定ファイルの改ざん 等 - 不正なシステム操作 意図しないOS のシャットダウン、ユーザアカウントの追加、変更 等 - 不正なプログラムのダウンロード、実行 ウイルス、ワーム、ボット等への感染、バックドアの設置 等 - 他のシステムへの攻撃の踏み台 サービス不能攻撃、システム攻略のための調査、迷惑メールの送信 等 |
2. OSコマンドインジェクションの対策
対策としては、同じくIPAの上記サイト(https://www.ipa.go.jp/files/000017316.pdf)に、以下の2点が記載されています。
①シェルを起動できる言語機能の利用を避ける。
②シェルを起動できる言語機能を利用する場合は、その引数を構成する全ての変数に対してチェックを行い、あらかじめ許可した処理のみを実行する。
少し補足します。
①に関しては、Perlでファイルを開く場合、シェルを起動できてしまうopen関数ではなく、sysopen関数を利用します。
②に関しては、「|」、「<」、「>」等、問題となりうる文字をチェックし、それが見つかった場合には処理を中断します。
では、情報処理安全確保支援士試験の過去問を解いてみましょう。
過去問(H26SC午前Ⅱ問15) |
---|
問15 Webアプリケーションの脆弱性を悪用する攻撃手法のうち,Perlのsystem関数やPHPのexec関数など外部プログラムの呼出しを可能にするための関数を利用し,不正にシェルスクリプトや実行形式のファイルを実行させるものは,どれに分類されるか。 ア HTTPヘッダインジェクション イ OSコマンドインジェクション ウ クロスサイトリクエストフォージェリ エ セッションハイジャック |
↓
↓
↓
↓
↓
正解はイです。「外部プログラムの呼出しを可能にするための関数を利用し」とあります。これは、たとえば、Perlのopen関数を使い、引数に「|」を活用してOSコマンドを渡します。そうして、不正にコマンドやファイルを実行します。
3. OSコマンドインジェクションの過去問
過去問(H30春SC午前Ⅱ問2) |
---|
問2 Webサーバのログを分析したところ,Webサーバヘの攻撃と思われるHTTPリクエストヘッダが記録されていた。次のHTTPリクエストヘッダから推測できる,攻撃者が悪用しようとしている脆弱性はどれか。ここで,HTTPリクエストヘッダはデコード済みである。 〔HTTPリクエストヘッダの部分〕 GET /cgi-bin/submit.cgi?user=;cat /etc/passwd HTTP/1.1 Accept:*/* Accept-Language: ja UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent:(省略) Host: test, example.com Connect ion: Keep-Alive ア HTTPヘッダインジェクション イ OSコマンドインジェクション ウ SQL インジェクション エ クロスサイトスクリプティング |
↓
↓
↓
↓
↓
注目すべきは、「;cat /etc/passwd HTTP/1.1」の部分です。catは、指定されたファイルの内容を表示するコマンドです。これにより、サーバのパスワードを取得しようとしています。OSのコマンドを不正に入力しているので、OSコマンドインジェクションが正解です。
正解:イ
補足します。OSコマンドインジェクションは、一例として、OSのコマンドを入力できる関数(例、system)などを利用している場合に危険が高くなります。
問題文の以下の構文を見てみましょう。
GET /cgi-bin/submit.cgi?user=;cat /etc/passwd HTTP/1.1
このとき、?の後ろが、ユーザから入力される引数で、それが、OSコマンドが実行されるsystem関数やopen関数に引き渡されているとします。
たとえばuserにyamadaと入れた場合に、yamadaのディレクトリにあるファイル一覧が見れるようなコマンドが渡されるとします。
system("ls $user")
user=yamadaなら
実行されるコマンドは "ls yamada" になります。
そして、user=yamada;cat /etc/passwdなら
実行されるコマンドは "ls yamada;cat/etc/passwd"となり、passwdファイルの中身が表示されてしまいます。