※動作テストは自己責任で必ず自分の環境で確認すること。
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); ?>
新品価格 |
![]() |