PHP Session_Regenerate_ID函数双释放内存破坏漏洞

2015-01-24信息快讯网

PHP Session_Regenerate_ID函数存在双释放内容破坏问题,远程攻击者可利用此漏洞对应用程序进行拒绝服务攻击,可能导致任意指令执行。

SEBUG-ID:1491
SEBUG-Appdir:PHP
发布时间:2007-03-17
影响版本:
PHP PHP 5.2.1
PHP PHP 5.1.6
PHP PHP 5.1.5
PHP PHP 5.1.4
PHP PHP 5.1.3
PHP PHP 5.1.3
PHP PHP 5.1.2
PHP PHP 5.1.1
PHP PHP 5.1
PHP PHP 5.0.5
PHP PHP 5.0.4
PHP PHP 5.0.3
+ Trustix Secure Linux 2.2
PHP PHP 5.0.2
PHP PHP 5.0.1
PHP PHP 5.0 candidate 3
PHP PHP 5.0 candidate 2
PHP PHP 5.0 candidate 1
PHP PHP 5.0 .0
PHP PHP 5.2
漏洞描述:
PHP是一款广泛使用的WEB开发脚本语言。
PHP Session_Regenerate_ID函数存在双释放内容破坏问题,远程攻击者可利用此漏洞对应用程序进行拒绝服务攻击,可能导致任意指令执行。
session_regenerate_id()函数最先会释放旧的会话识别器,然后马上分配由会话识别生成器生成的新值:
 
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安全建议:
目前没有解决方案提供:
PHP版网站缓存加快打开速度的方法分享
PHP仿盗链代码
PHP通过session id 实现session共享和登录验证的代码
PHP中设置时区方法小结
php 函数中使用static的说明
php注销代码(session注销)
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
iis下php mail函数的sendmail配置方法(官方推荐)
redis 队列操作的例子(php)
PHP中return 和 exit 、break和contiue 区别与用法
php 的加密函数 md5,crypt,base64_encode 等使用介绍
PHP新手用的Insert和Update语句构造类
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
php preg_filter执行一个正则表达式搜索和替换
php中echo()和print()、require()和include()等易混淆函数的区别
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
php设计模式 Bridge (桥接模式)
提高define性能的php扩展hidef的安装和使用
PHP中利用substr_replace将指定两位置之间的字符替换为*号
PHP中通过加号合并数组的一个简单方法分享
PHP中删除变量时unset()和null的区别分析
PHP企业级应用之常见缓存技术篇
兼容性最强的PHP生成缩略图的函数代码(修改版)
discuz的php防止sql注入函数
Php Image Resize图片大小调整的函数代码
Base64在线编码解码实现代码 演示与下载
PHP strncasecmp字符串比较的小技巧
从php核心代码分析require和include的区别
深入理解PHP之require/include顺序 推荐
PHP中foreach循环中使用引用要注意的地方
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
php empty,isset,is_null判断比较(差异与异同)
php google或baidu分页代码
MYSQL 小技巧 -- LAST_INSERT_ID
PHP下通过系统信号量加锁方式获取递增序列ID
PHP DataGrid 实现代码
©2014-2024 dbsqp.com