欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

MyBB unset_globals()函数被绕过导致远程代码执行分析

来源:本站整理 作者:佚名 时间:2014-11-24 TAG: 我要投稿

  昨天在exploit-db上看到Ryat牛发了一个MyBB的远程代码执行漏洞,分析很详细,可惜是英文写的,这里简单翻译下。

        当register_globals=On时,MyBB将调用unset_globals()函数来实现register_globals=Off。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(@ini_get("register_globals") == 1)
        {
            $this->unset_globals($_POST);
            $this->unset_globals($_GET);
            $this->unset_globals($_FILES);
            $this->unset_globals($_COOKIE);
        }
        ...
    }
    ...
    function unset_globals($array)
    {
        if(!is_array($array))
        {
            return;
        }
 
        foreach(array_keys($array) as $key)
        {
            unset($GLOBALS[$key]);
            unset($GLOBALS[$key]); // Double unset to circumvent the zend_hash_del_key_or_index hole in PHP <4.4.3 and <5.1.4
        }
    }

        当我们提交foo.php?_COOKIE=1即$_GET['_COOKIE']=1时,unset_globals()将销毁$GLOBALS['_COOKIE'],这意味着$_COOKIE数组也将被销毁。同理,提交foo.php?GLOBALS=1即$_GET['GLOBALS']=1时,将销毁$GLOBALS['GLOBALS'],即$GLOBALS。

        $GLOBALS数组是一个与全局变量表绑定的自动化超全局变量,你可以使用$GLOBALS['key']在脚本的所有作用域中去访问或控制一个全局变量,当你用$GOBALS['key']时,PHP会直接从全局变量表里寻找$key,如果你把$GOBALS覆盖或者注销,PHP无法寻找$key,最终导致MyBB那个实现register_globals=Off的函数unset_globals()被绕过。

    MyBB可能考虑到变量覆盖的问题,在/inc/class_core.php 134-141行有段代码:

1
2
3
4
5
6
7
8
$protected = array("_GET", "_POST", "_SERVER", "_COOKIE", "_FILES", "_ENV", "GLOBALS");
foreach($protected as $var)
{
if(isset($_REQUEST[$var]) || isset($_FILES[$var]))
{
   die("Hacking attempt");
}
}

        注意上面的判断语句if(isset($_REQUEST[$var]) || isset($_FILES[$var])),$_REQUEST默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。但是在PHP 5.3.0引入 request_order。该指令会影响 $_REQUEST 的内容,默认值为request_order = "GP",即$_REQUEST只处理$_GET,$_POST方式提交的数据,基于此,通过$_COOKIE方式提交即可绕过上面的isset($_REQUEST[$var])限制,因此在PHP >= 5.3 && register_globals=On 时,通过提交$_COOKIE['GLOBALS']即可绕过unset_globals()函数,利用register_globals=On注册任意变量。后面的就不做分析了,有兴趣的朋友可以看下原文。直接上张测试成功的图。如图:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载