Webアプリケーションからの入力により、サーバ上のOSコマンドを実行できてしまう脆弱性です。
概要
「Webページからメールの本文を入力し、その内容をメールで送信するプログラム」や「Webページからサーバにあるファイルを開く」場合などに起こる可能性があります。
以下のような例1、例2のような場合を例として説明します。
例1)
Webページからメールの宛先を入力し、メールマガジンの登録を行い、登録完了メールを送るページがあった場合を考えます。
「登録する」ボタンを押すと、入力したメールアドレスに登録完了メールが送信されます。
ここでは、以下のようなPerlのプログラムが動作するとします。
1. open(MAIL,"| /usr/sbin/sendmail $to");
「test@example.com」に指定された内容のメールを送信します。
ところが、このように入力された値をそのまま「sendmail」コマンドに引き渡してしまうと、例2のような入力があったときに大変なことになります。
例2)
先ほどと同じPerlのプログラムが動作するとします。
2. open(MAIL,"| /usr/sbin/sendmail $to");
サーバにある全てのファイルを削除されてしまいます。
この脆弱性を悪用すると、ディレクトリやファイルを削除されるだけでなく、パスワードの盗聴なども行うことができてしまいます。
例に挙げたのはPerlのプログラムでしたが、JAVAやPHPにもOSコマンドを実行する関数はありますが、それを用いる際には十分注意が必要です。
対策:
対策としては次のものが挙げられます。
参考文献:
「ウェブアプリケーションセキュリティ」金床 著 / 発行所:株式会社データハウス」2007年8月20日発行
「知っていますか?脆弱性/5. OS コマンド・インジェクション」(情報処理推進機構:セキュリティセンター)
Webアプリケーションに潜むセキュリティホール 「第13回 OSコマンドインジェクションを防ぐルールを作成する」(中村隆之 著)
関連する用語:
SQLインジェクション
サニタイジング
「Webページからメールの本文を入力し、その内容をメールで送信するプログラム」や「Webページからサーバにあるファイルを開く」場合などに起こる可能性があります。
以下のような例1、例2のような場合を例として説明します。
例1)
Webページからメールの宛先を入力し、メールマガジンの登録を行い、登録完了メールを送るページがあった場合を考えます。
「登録する」ボタンを押すと、入力したメールアドレスに登録完了メールが送信されます。

1. open(MAIL,"| /usr/sbin/sendmail $to");
- |/usr/sbin/sendmail
「usr」ディレクトリにある「sbin」ディレクトリの中にある「sendmail」コマンドを実行します。
「sendmail」は「$to」で指定された宛先に、メールを送信する「OSのコマンド」です。 - $to
ここでは入力された「test@example.com」が入ります。
「test@example.com」に指定された内容のメールを送信します。
ところが、このように入力された値をそのまま「sendmail」コマンドに引き渡してしまうと、例2のような入力があったときに大変なことになります。
例2)
先ほどと同じPerlのプログラムが動作するとします。2. open(MAIL,"| /usr/sbin/sendmail $to");
- |/usr/sbin/sendmail
「usr」ディレクトリにある「sbin」ディレクトリの中にある「sendmail」コマンドを実行します。
「sendmail」は「$to」で指定された宛先に、メールを送信する「OSのコマンド」です。
- $to
ここでは入力された「test@example.com;rm -rf /」が入ります。
「test@example.com」は先ほどと同じです。
続いて入力されている「;」ですが、これはOSコマンド区切るコマンドになります。つまり「;」までの入力で1.と
同じプログラムが動作します。 - rm -rf /
次に入力されている「rm」はディレクトリやファイルを削除するコマンドになります。
「rm」コマンドは「rm -x y」のようにオプションを指定し、「-x」という条件で「y」にあるディレクトリやファイルを削除するというコマンドです。
ここで入力されている「-rf」は「警告メッセージを表示せずに、ディレクトリ内を再帰的に削除する」という条件で、
「/」はサーバにある全てのファイルを指定することになります。
サーバにある全てのファイルを削除されてしまいます。
この脆弱性を悪用すると、ディレクトリやファイルを削除されるだけでなく、パスワードの盗聴なども行うことができてしまいます。
例に挙げたのはPerlのプログラムでしたが、JAVAやPHPにもOSコマンドを実行する関数はありますが、それを用いる際には十分注意が必要です。
対策:
対策としては次のものが挙げられます。
- OSコマンドにユーザからの入力を極力含めないこと。
- ユーザからの入力に対して、OSコマンドで実行しても大丈夫な形にエスケープ処理を行う。
- Webサーバのユーザ権限を限定し、実行できるコマンドを制限する。
参考文献:
「ウェブアプリケーションセキュリティ」金床 著 / 発行所:株式会社データハウス」2007年8月20日発行
「知っていますか?脆弱性/5. OS コマンド・インジェクション」(情報処理推進機構:セキュリティセンター)
Webアプリケーションに潜むセキュリティホール 「第13回 OSコマンドインジェクションを防ぐルールを作成する」(中村隆之 著)
関連する用語:
SQLインジェクション
サニタイジング
