※動作テストは自己責任で必ず自分の環境で確認すること。
変数汚染攻撃とは
変数汚染攻撃とは、regster_globalが有効になっていた場合に、内部変数の値を書き換えることができる問題である。
セッションの値を変えたり、設定ファイルを変数から取得していた場合、設定ファイルの読み込み先を変えたりできるため、危険な脆弱性である。
リクエストとは独立しているはずの内部変数を上書きして、セッション情報を書き換えたり、任意コードを実行したりする攻撃。
■攻撃先
$_GET、$_POST、$_COOKIEが直接foreach()またはextract()にかかっている箇所 関数:import_request_variables()、parse_str()、extract()、register_globalsが有効の時。
■被害
セッションを書き換えることで、管理者権限などを奪われる。 任意のPHPコードを実行される。
Case 1
<?php if(!ini_get('register_globals')) { foreach($_GET as $key=>$val) { $$key = $val; } } ?>
$_GET['_SESSION']や、$_POST['_SESSION']経由でセッション変数を上書きし、セッションを自在に乗っ取ることが可能。 このようなスーパーグローバル変数展開方法は非常に危険でありregister_globals off環境で動くように書きなおすべき
<?php include_once $my_root.'include/config.php'; ?>
register_globals onの環境では、$_GET['my_root']=(任意のパス)を送り込むことにより、任意のPHPコードが実行可能となる。
対策方法
・ブラックリスト法 $_GET、$_POST、$_COOKIE内に、"_SESSION"、"_GET"、"_POST"、"_COOKIE"など、特定のキーが見つかった時点で処理を中断する。
foreach(array($_GET, $_POST, $_COOKIE) as $ary) { if(!empty($ary['_SESSION']) || !empty($ary['_COOKIE']) || !empty($ary['_SERVER']) || !empty($ary['_REQUEST']) || !empty($ary['_ENV']) || !empty($ary['_FILES']) || !empty($ary['_POST']) || !empty($ary['_GET']) || !empty($ary['_GLOBALS'])) { exit; } }
・ソースコードの抜本的書き換え $_GET等のスーパーグローバル変数をforeach()やextract()を展開している部分を削除し、$_GET[(index)]という形式に書き換える。
・register_globalsをOFFにする PHPバージョン4.2.0以前ではregister_globals onがデフォルトでなっていることに注意
・ホワイトリスト法 受け取る可能性のあるリクエスト変数名をリストアップしておき、プログラムの先頭でそれ以外のリクエスト変数を全てunsetする。
新品価格 |
![]() |