[Phpmyadmin-devel] MOPB-02-2007 deep recursion, phpMyAdmin affected?

Sebastian Mendel lists at sebastianmendel.de
Thu Mar 1 15:51:06 CET 2007


Michal Čihař schrieb:
> Hi
> 
> On Thu, 01 Mar 2007 15:30:59 +0100
> Sebastian Mendel <lists at sebastianmendel.de> wrote:
> 
>> http://www.php-security.org/MOPB/MOPB-02-2007.html
>>
>> i did not fully 'understand' how we are affected, but i think we are 
>> affected somehow ... especially as i come to the sentence wehre phpMyAdmin 
>> is explicitely mentioned ...
> 
> This is IMHO PHP problem and causes problems because single line of our
> code gets executed...

yes of course it is a PHP problem ... but the globals overwrite is also a 
PHP problem and we do check for this ...

a simple counter wuld help, or?

teh only place where we would be possible attackable with this is when we 
iterate over $GLOBALS or $_REQUEST ($_POST, $_COOKIE, $_GET)


common.lib.php#2651
/**
  * Check for numeric keys
  * (if register_globals is on, numeric key can be found in $GLOBALS)
  */
$i = 0;
foreach ($GLOBALS as $key => $dummy) {
     if (++$i >= 1000) {
         die('possible deep recurse attack');
     }
     if (is_numeric($key)) {
         die('numeric key detected');
     }
}


and


/**
  * calls $function vor every element in $array recursively
  *
  * @uses    PMA_arrayWalkRecursive()
  * @uses    is_array()
  * @uses    is_string()
  * @param   array   $array      array to walk
  * @param   string  $function   function to call for every array element
  */
function PMA_arrayWalkRecursive(&$array, $function, $apply_to_keys_also = false)
{
     static $recursive_counter = 0;
     if (++$recursive_counter > 1000) {
         die('possible deep recursion attack');
     }
     foreach ($array as $key => $value) {
         if (is_array($value)) {
             PMA_arrayWalkRecursive($array[$key], $function, 
$apply_to_keys_also);
         } else {
             $array[$key] = $function($value);
         }

         if ($apply_to_keys_also && is_string($key)) {
             $new_key = $function($key);
             if ($new_key != $key) {
                 $array[$new_key] = $array[$key];
                 unset($array[$key]);
             }
         }
     }
     $recursive_counter--;
}


what would be a good value? 10.000? but we never will need such much vars, 
so even 1.000 would be enough? (count all all variables that be available 
when register_globals = on)

-- 
Sebastian Mendel

www.sebastianmendel.de




More information about the Developers mailing list