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学习 函数 课件
Jun 15 PHP
php更改目录及子目录下所有的文件后缀的代码
Sep 24 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
详解Window7 下开发php扩展
Dec 31 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 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去除重复字的实现代码
2011/09/16 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
python实现识别相似图片小结
2016/02/22 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python 异或加密字符串的实例
2018/10/14 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
python实现批量文件重命名
2019/10/31 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
门诊手术室工作制度
2014/01/30 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
建党伟业的观后感
2015/06/01 职场文书
甲午大海战观后感
2015/06/02 职场文书
宿舍管理制度范本
2015/08/07 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书