PHPではshell_execやsystemなどの関数でシェルコマンド等(OSコマンド)を実行することができますが、その仕組みを悪用して不正なコマンドを実行させるのがOSコマンドインジェクションです。
スポンサーリンク
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $input = '-l; cat sample.html'; $command ='ls '.escapeshellarg($input); //$command ="ls ".$input; echo $command; $output = shell_exec($command); echo "<pre>$output</pre>"; |
sample.html(上記のPHPファイルと同ディレクトリに置いておく)
1 2 3 |
<h1>あいうえお</h1> <h2>かきくけこ</h2> <h3>さしすせそ</h3> |
上記のPHPコードにおいて、$inputがユーザからの入力であると仮定します。5行目においてコマンドを組み立てていますが、escapeshellarg関数によってエスケープすることによって cat sample.html は実行されない状態となります。
もし6行目の状態だと ls -l; cat sample.html のようにコマンドが実行されて、sample.htmlの中身が表示されるようになります。
コマンドの引数に渡すべき値はescapeshellarg関数を利用してエスケープすることが大切です。
escapeshellcmd関数は引数を含めたコマンド列全体に対してエスケープしますが、任意の数の引数を渡す場合による攻撃を防げないことが知られています。
参照ページ
PHPマニュアル