eval利用攻撃

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

eval利用攻撃とは

URL内にPHPコードを直接含ませることで、内部処理中に任意のPHPコードを実行できる可能性がある。
インクルード攻撃同様にrootを乗っ取られる可能性があるため、危険な脆弱性である。

関数eval()およびその応用関数に、悪意あるリクエストを潜り込ませて任意のPHPコードを実行する攻撃

■攻撃先

関数:eval()および'e'修飾子を利用したpreg_replace()「コールバック関数名」を渡す引数部分:usort()、uksort()、ob_start()可変関数呼び出しにおいて、関数名を保持している変数。

■被害

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

Case 1

<?php
if(!empty($_GET['highlight']))
{
  $text = substr(preg_replace('/\>.*\</esU', "str_replace('".$_GET['highlight']."', $_GET['highlight']."<br />', '\\0'", ">$text<"), 1, -1);
}
?>
$_GET['highlight']を通じて、任意のPHPコードを送り込まれる。

対策方法

・ホワイトリスト法

eval()の引数やpreg_replace()の第2引数にリクエストが混ざる場合に、そのリクエストが混ざる場合に、そのリクエストを想定しているものだけに限る。
<?php
if(!empty($_GET['highlight']) && strstr($text, $_GET['highlight']))
{
  $text = substr(preg_replace('/\?.*\</esU', "str_replace('".$_GET['highlight']"', $_GET['highlight']."</br>', '\\0')", ">$text<").1, -1);
}
?>

・preg_replace_callback()への置き換え

preg_replace()の’e’修飾子ではなく、preg_replace_callback()を使うように書き換える。
<?php
if(!empty($_GET['highlight']))
{
  $text = substr(preg_replace_callback('/\>.*\</sU', 'make_highlight', ">$text<"), 1, -1);
}

function make_highlight($matches)
{
  return str_replace($_GET['highlight'], '<b>'.$_GET['highlight']."</b>', $matches[0]);
}
?>

Case 2

<?php
$string = call_user_func($filter_func, $from, $to, $string);
?>
リクエスト変数を通じて、任意のPHPコードを送り込まれる。

対策方法

・コールバック関数ホワイトリスト法

コールバック関数がリクエスト変数から決まる場合、予め用意した配列内に存在するものだけを許可する。
<?php
if(!in_array($filter_func, rray('make_highlight', 'make_plaintext')))
{
  exit;
}

$string = call_user_func($filter_func, $from, $to, $strting);
?>

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

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

Comments are closed.