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中使用PDF文档功能
Oct 09 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
php中curl和file_get_content的区别
May 10 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
php生成word并下载代码实例
Mar 15 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 PHP
通过PHP实现获取访问用户IP
May 09 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
PHP数字格式化
2006/12/06 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
详解Vue的ref特性的使用
2020/01/24 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python插入数据到列表的方法
2015/04/30 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python下载的库包存放路径
2020/07/27 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
高中毕业生生活的自我评价
2013/12/08 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
亮剑观后感500字
2015/06/05 职场文书
创业计划书之甜品店
2019/09/18 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
从原生JavaScript到React深入理解
2022/07/23 Javascript