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实现WEB动态网页静态
Oct 09 PHP
打造计数器DIY三步曲(中)
Oct 09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
PHP中数据类型转换的三种方式
Apr 02 PHP
PHP四种基本排序算法示例
Apr 09 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 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 中文乱码解决办法总结分析
2009/07/30 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php中hashtable实现示例分享
2014/02/13 PHP
smarty内置函数section的用法
2015/01/22 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
Python标准库sched模块使用指南
2017/07/06 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
python获取服务器响应cookie的实例
2018/12/28 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
在django中自定义字段Field详解
2019/12/03 Python
Python计算信息熵实例
2020/06/18 Python
Python实现弹球小游戏
2020/08/01 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
二婚主持词
2015/06/30 职场文书
python tqdm用法及实例详解
2021/06/16 Python
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js