変数汚染攻撃

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

変数汚染攻撃とは

変数汚染攻撃とは、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する。

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

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

Comments are closed.