PHP Session_Regenerate_ID函数双释放内存破坏漏洞

 更新时间:2011年01月27日 21:52:48   作者:  
PHP Session_Regenerate_ID函数存在双释放内容破坏问题,远程攻击者可利用此漏洞对应用程序进行拒绝服务攻击,可能导致任意指令执行。
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-cli简介(不会Shell语言一样用Shell)

    php-cli简介(不会Shell语言一样用Shell)

    刚才说到,我们可以用php来开发Shell程序。有的同学可能会问啦:php不是用来做网页的么?。是的,php可以用来做动态网页,并且当初php就是为做动态网页而开发的语言,但是理论上php可以用来做任何的程序,甚至是桌面程序
    2013-06-06
  • PHP is_numeric()函数用法详解

    PHP is_numeric()函数用法详解

    is_numeric()函数是PHP中的内置函数,用于检查传入函数中作为参数的变量是数字还是数字字符串,该函数返回一个布尔值,本文就给大家讲讲PHP is_numeric()函数使用方法,需要的朋友可以参考下
    2023-07-07
  • php页面跳转代码 输入网址跳转到你定义的页面

    php页面跳转代码 输入网址跳转到你定义的页面

    我先判断一下你是否开启了https,如果是就正常的https页面,如果没有开始则跳转到项目的目录下面,感兴趣的朋友可以参考下哈,希望对你有所帮助
    2013-03-03
  • PHP中explode函数和split函数的区别小结

    PHP中explode函数和split函数的区别小结

    相信大家都知道,explode和split在php中都是可以通过特定字符把字符串转换成数组的,那么explode和split既然是一样的为什么会有两个函数呢,那么explode和split的区别在哪里呢,下面跟着小编我们一起来看看。
    2016-08-08
  • PHP单例模式简单用法示例

    PHP单例模式简单用法示例

    这篇文章主要介绍了PHP单例模式简单用法,结合数据库操作类实例形式分析了php单例模式的具体实现方法与使用技巧,需要的朋友可以参考下
    2017-06-06
  • php 函数中使用static的说明

    php 函数中使用static的说明

    看PW源码的时候发现setHeader()函数中使用static关键字,很奇怪,以前也没这样用过。static用在函数里面,声明一次变量后,如果再次调用这个函数将会在初始值延续,如$sapi这里将累加
    2012-06-06
  • PHP实现查询两个数组中不同元素的方法

    PHP实现查询两个数组中不同元素的方法

    这篇文章主要介绍了PHP实现查询两个数组中不同元素的方法,涉及PHP数组差集运算与数组合并的相关技巧,需要的朋友可以参考下
    2016-02-02
  • PHP stripos()函数及注意事项的分析

    PHP stripos()函数及注意事项的分析

    本篇文章是对PHP中的stripos()函数及注意事项进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php通过rmdir删除目录的简单用法

    php通过rmdir删除目录的简单用法

    这篇文章主要介绍了php通过rmdir删除目录的简单用法,实例分析了rmdir与mkdir函数的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论