本記事では「OSコマンド・インジェクション」について分かりやすく説明しています。
OSコマンド・インジェクションとは
OSコマンド・インジェクションとは、Webサイトの入力フォームや掲示板などで「OSコマンド(※コンピュータへの命令文)」を含む文字列を送信することで、Webサーバに意図しない「OSコマンド」を実行させる攻撃です。
OSコマンド・インジェクション攻撃により発生しうる脅威は以下の通りです。
脅威 | 説明 |
サーバ内ファイルの不正操作 | 重要情報の漏洩(重要なファイルを閲覧される)や設定ファイルの改ざん、重要なファイルの削除など |
不正なシステム操作 | OSのシャットダウンやユーザアカウントの追加、変更など |
ウイルス感染 | 不正なプログラムをダウンロードし実行することで、Webサーバがマルウェア(ウイルス)に感染する |
他サイトへの攻撃 | 他サイトへ迷惑メールの送信など |
OSコマンド・インジェクション攻撃の例
Webアプリケーションの開発で利用する言語によっては、OSコマンド・インジェクション攻撃の原因となる「OSコマンド」が実行できるシェルを起動することが可能です。
スポンサーリンク
例えばPerlのopen関数などは「OSコマンド・インジェクション」の有名な攻撃例です。
Perlのopen関数は引数として与えるファイルパスに「|」(パイプ)を使うことで「OS コマンド」が実行できるため、外部からの入力値をそのまま引数として利用する実装は非常に危険です。
例えば、以下のようなopen関数があるとします。$fromには画面からの入力値が入ります。
入力値のアドレスにメールを送信するという内容です。
open(MAIL, "|/usr/sbin/sendmail $from");
・正常のデータ例:入力値「test@co.jp」
open(MAIL, "|/usr/sbin/sendmail test@co.jp");
・OSコマンド・インジェクション攻撃のデータ例:入力値「test@co.jp; rm -rf /」
open(MAIL, "|/usr/sbin/sendmail test@co.jp; rm -rf /");
正常なデータ例は、入力値「test@co.jp」にメールを送信するだけですが、
OSコマンド・インジェクション攻撃のデータ例は、入力値「test@co.jp」にメール送信した後に「rm -rf /」という「OSコマンド」を実行しています。
rmコマンドはファイルやディレクトリを削除するコマンドです。OSコマンド・インジェクション攻撃により意図しないファイルやディレクトリが削除されていましました。
OSコマンド・インジェクション攻撃の対策
OSコマンド・インジェクション攻撃の対策は、OSコマンド・インジェクション攻撃の原因となる「OSコマンド」が実行できるシェルを起動する機能を使用しないことです。
シェルを起動する機能を使っていると「OSコマンド」が実行できるため、外部からの入力値をそのまま引数として利用する実装は非常に危険です。シェルを起動する機能を利用することは避け、他の関数等で代替するようにしましょう。
例えば「OSコマンド・インジェクション攻撃の例」で説明したopen関数はsysopen関数に変えることでシェルが起動しなくなります。