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 相关文章推荐
PHP5 安装方法
Jan 15 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
php 获取远程网页内容的函数
Sep 08 PHP
解析yii数据库的增删查改
Jun 20 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
PHP实现简易blog的制作
Oct 24 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 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清除数组中所有字符串两端空格的方法
2014/10/20 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
javascript基本算法汇总
2016/03/09 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
python config文件的读写操作示例
2019/09/27 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
python实现视频压缩功能
2020/12/18 Python
html5开发之viewport使用
2013/10/17 HTML / CSS
表彰先进的通报
2014/01/31 职场文书
捐助倡议书范文
2014/04/15 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
在人间读书笔记
2015/06/30 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB