SEBUG-ID:1491
SEBUG-Appdir:PHP
發布
PHP_FUNCTION(session_regenerate_id)
{
...
if (PS(id)) {
...
efree(PS(id));
}
PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC);
PS(send_cookie) = 1;
php_session_reset_id(TSRMLS_C);
RETURN_TRUE;
}
RETURN_FALSE;
}
但是此分配操作不是一個原子操作。因此可被如內存限制沖突操作來中斷,另外,根據PHP配置,生成器可觸發PHP錯誤也可導致一個中斷。
復制代碼 代碼如下:
PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
{
...
switch (PS(hash_func)) {
...
default:
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
efree(buf);
return NULL;
}
...
if (PS(hash_bits_per_character) < 4
|| PS(hash_bits_per_character) > 6) {
PS(hash_bits_per_character) = 4;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character...");
}
...
通過注冊一個惡意用戶空間錯誤處理器可比較容易的利用此問題。當此處理器調用一個HASH表分配到前會話識別器相同的地方,然後惡意錯誤處理器可以通過調用session_id()函數和分配包含偽造HASH表到HASH表相同地方,這樣來觸發另一個之前的會話識別器的釋放操作。當用戶錯誤處理器完成後會解構覆蓋的HASH表而調用攻擊者提供的代碼。
http://www.php-security.org/MOPB/MOPB-22-2007.html
測試方法:
[www.sebug.net]
本站提供程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,風險自負!
http://www.php-security.org/MOPB/code/MOPB-22-2007.php
SEBUG安全建議:
目前沒有解決方案提供: