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


Posted in PHP onJanuary 27, 2011
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 Image Resize图片大小调整的函数代码
Jan 17 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP整合PayPal支付
Jun 11 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
比较完整的微信开发php代码
Aug 02 PHP
PHP中trait使用方法详细介绍
May 21 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 #PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 #PHP
PHP企业级应用之常见缓存技术篇
Jan 27 #PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 #PHP
discuz的php防止sql注入函数
Jan 17 #PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 #PHP
php短域名转换为实际域名函数
Jan 17 #PHP
You might like
php $_ENV为空的原因分析
2009/06/01 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
JS查看对象功能代码
2008/04/25 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
js实现双色球效果
2020/08/02 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
django2.0扩展用户字段示例
2019/02/13 Python
python nmap实现端口扫描器教程
2020/05/28 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
工商学院毕业生自荐信
2013/11/12 职场文书
房产委托公证书样本
2014/04/04 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript