Эта тема на forum.dklab.ru


WingedFox: Дыра в безопасности при удалении переменных
Суть такая: когда удаляется переменная из глобальной области видимости (по сути - из GLOBALS) или ключ массива, то PHP до версии 4.4.3 и 5.1.4 некорректно удаляет эту переменную.
Т.е. есть возможность передать снаружи переменную в 2 экземплярах и unset удалит клона.

Из-за этого бага в PHP возникает куча проблем с XSS дырами, которые были заткнуты через unset.

Подробное описание: http://www.hardened-php.net/hphp/zend_hash_del_key_or_index_vulnerability.html
Mr.PRO:
Какой кашмар! надо срочно проверить свои скрипты на наличие unset()

Я так понимаю, вожможна также эксплуатация SQL-инжекций. И как в примере "file upload"...
Вот только не понятно как высчитываются значения клонов в зависимости от версии и, судя по всему, от выполняемого действия..

Version Value
PHP 4 -269001946
PHP 5 -834358190

Version Value
PHP 4 472504636
PHP 5 1425328718
WingedFox:
Функциями на С, которые в PHP вычисляют цифровое значение имени переменной.
Andrey Gurin:
Функции для вычисления хэшей на php(только для строк), если компилировать лень

function zend_inline_hash_func_php5($arKey) {
$h = 5381;
preg_match("/\\0$/", $arKey) or $arKey .= "\0";
$nKeyLength = strlen($arKey);

$arPtr = 0;

while ($arPtr < $nKeyLength) {
$h += ($h << 5);
$h += ord($arKey[$arPtr]);
$arPtr++;
}
return $h;
}

function zend_inline_hash_func_php4($arKey) {
$h = 5381;
preg_match("/\\0$/", $arKey) or $arKey .= "\0";
$nKeyLength = strlen($arKey);

$arPtr = 0;

while ($arPtr < $nKeyLength) {
$h += ($h << 5);
$h ^= ord($arKey[$arPtr]);
$arPtr++;
}
return $h;
}

Эта тема на forum.dklab.ru