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 Squid中可缓存的动态网页设计
Sep 17 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
PHP两种快速排序算法实例
Feb 15 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
PHP eval函数使用介绍
2013/12/08 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
js实现轮播图特效
2020/05/28 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
python set集合使用方法解析
2019/11/05 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
Python requests模块session代码实例
2020/04/14 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python实现马丁策略的实例详解
2021/01/15 Python
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
2014年医务科工作总结
2014/12/18 职场文书
2014年英语工作总结
2014/12/20 职场文书
平遥古城导游词
2015/02/03 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
导游词之阆中古城
2019/12/23 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP