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下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
PHP 事件机制(2)
Mar 23 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 PHP
PHP Web表单生成器案例分析
Jun 02 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
如何用PHP实现多线程编程
May 26 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
一个程序下载的管理程序(四)
2006/10/09 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
微信小程序 POST请求的实例详解
2017/09/29 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Python: 传递列表副本方式
2019/12/19 Python
商场经理竞聘演讲稿
2014/01/01 职场文书
社区端午节活动方案
2014/01/28 职场文书
教师学习培训邀请函
2014/02/04 职场文书
护理专业自荐信范文
2014/02/26 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
运动会的口号
2014/06/09 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL