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.ini中文版
Oct 09 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
php xml实例 留言本
Mar 20 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
php递归创建目录的方法
Feb 02 PHP
PHP7.1新功能之Nullable Type用法分析
Sep 26 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
PHP 与 UTF-8 的最佳实践详细介绍
Jan 04 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
php中关于换行的实例写法
Sep 26 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 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
simplehtmldom Doc api帮助文档
2012/03/26 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
Smarty模板配置实例简析
2019/07/20 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
Node 代理访问的实现
2019/09/19 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python画图学习入门教程
2016/07/01 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
python解释器spython使用及原理解析
2019/08/24 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
什么是Python变量作用域
2020/06/03 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
《雨霖铃》听课反思
2014/02/13 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
满月酒邀请函
2015/01/30 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书