外部コマンド実行攻撃

※動作テストは自己責任で必ず自分の環境で確認すること。

外部コマンド実行攻撃とは

外部コマンド実行攻撃とはプログラム実行系関数(system、exec、passthruなど)の引数として外部リクエストを利用する場合に
不正なコマンドを混ぜて送信され、サーバを不正に操作される攻撃。

プログラム実行系関数の引数にリクエストを混ぜて、任意のコマンドを実行する攻撃

■攻撃先

プログラム実行系関数:system()、exec()、passthru()
演算子:backtickコマンド実行演算子

■被害

あらゆるPHPコードを実行可能
ローカルアタック対策が弱いサーバであれば、root権限まで奪取される可能性がある。

Case 1

<?php
echo "<pre>";
system("ls al".str_replace('..', '', './'.$_GET['dir']));
?>
リクエスト変数を通じて、任意のコマンドを送られる。

対策方法

・シェルエスケープ法

外部コマンドに渡す引数について、escapeshellarg()関数をかける。
<?php
echo "<pre>";
system("ls-al".escapeshellarg(str_replace('..', '', './'.$_GET['dir'])));
?>

・ホワイトリスト法

system関数または外部コマンドに渡しても良い引数のリストを予め作成しておき、そのリストにある文字列だけを通過させる。
<?php
$dir = basename($_GET['dir']);
if(!is_dir($dir))
{
  exit;
}

echo "<pre>";
system("ls -al".str_replace('..', '', './'.$_GET['dir']));
?>

Case 2

<?php
echo "<pre>";
system("ls -al".strstr($_GET['dir'], array('..'=>'', '|'=>'')));
?>
リクエスト変数を通じて、任意のオプションを送り込まれる。コマンドによっては危険なオプションとなる。

対策方法

・safe_mode制限

php.iniでsafe_mode制限をかける。
safe_mode on
safe_mode_exec_dir = /usr/local/lib/php/safe_mode_bin
/usr/local/lib/php/safe_mode_binには、実行許可する外部コマンドのシンボリックリンクまたは実体を用意する。

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.