• 从某达OA到Yii2框架的cookie反序列化漏洞研究


    序言

    近期网上流传的某达OA存在PHP反序列化漏洞,导致命令执行。因为该漏洞底层是Yii2框架的漏洞,所以搭建好了Yii2框架环境,在Yii2框架的环境下来进行模拟研究,希望能达到举一反三和类比分析学习的目的。该cookie处反序列化漏洞属于通用型漏洞,如果使用了Yii2框架进行应用开发,若泄露了config/web.php中的cookieValidationKey值、且符合特定Yii2漏洞版本以及PHP版本小于7,那么可能存在此反序列化漏洞,从而导致恶意代码执行。笔者能力有限,如有理解不当之处,希望大师傅们批评指正!

    CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

    一、反序列化的入口与条件

    1.hash验证数据

    我们在cookie处提交的参数,被送到了这个validateData方法处,在这里$data的内容会被拆分。在期间其经历了一次hash值校验。我们只要用它提供的加密算法和密钥进行加密,生成数据,就能通过所有的校验,然后进入我们期望的**return $pureData;**环节。

    1695352559_650d06efa152204f4d3f6.png!small?1695352557969

    源代码如下:

    public function validateData($data, $key, $rawHash = false)
        {
            $test = @hash_hmac($this->macHash, '', '', $rawHash);
            if (!$test) {
                throw new InvalidConfigException('Failed to generate HMAC with hash algorithm: ' . $this->macHash);
            }
            $hashLength = StringHelper::byteLength($test);
            if (StringHelper::byteLength($data) >= $hashLength) {
                $hash = StringHelper::byteSubstr($data, 0, $hashLength);
                $pureData = StringHelper::byteSubstr($data, $hashLength, null);
    
                $calculatedHash = hash_hmac($this->macHash, $pureData, $key, $rawHash);
    
                if ($this->compareString($hash, $calculatedHash)) {
                    return $pureData;
                }
            }
    
            return false;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.php版本限制

    上面的validateData方法,返回结果后,就回到了loadCookies方法。这里存在一个反序列化入口,就是下图else分支的内容,我们上一方法得到的反序列化数据会进入我们的反序列化入口(注意,allowed_classes 被设置为 false,则在反序列化过程中不会创建对象,只会还原基本数据类型,例如字符串、整数、数组等)。所以我们可以发现,在Yii2框架默认的环境下要进行这个反序列化操作,对php的版本是有所限制的,如下图,可以发现我们的版本中PHP_VERSION_ID 要小于70000才能到达我们期望的反序列化入口

    1695352569_650d06f971f242e402384.png!small?1695352568206

    源代码如下:

    protected function loadCookies()
        {
            $cookies = [];
            if ($this->enableCookieValidation) {
                if ($this->cookieValidationKey == '') {
                    throw new InvalidConfigException(get_class($this) . '::cookieValidationKey must be configured with a secret key.');
                }
                foreach ($_COOKIE as $name => $value) {
                    if (!is_string($value)) {
                        continue;
                    }
                    $data = Yii::$app->getSecurity()->validateData($value, $this->cookieValidationKey);
                    if ($data === false) {
                        continue;
                    }
                    if (defined('PHP_VERSION_ID') && PHP_VERSION_ID >= 70000) {
                        $data = @unserialize($data, ['allowed_classes' => false]);
                    } else {
                        $data = @unserialize($data);
                    }
                    ......
                }
            } else {
                ......
            }
    
            return $cookies;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    下面我们先直接展示漏洞利用结果。我们可以从调用栈看到已经在进行我们的反序列化过程了。最终弹出计算机验证确实存在此漏洞。

    1695352583_650d070734cedae52437f.png!small?1695352581916

    run方法如下:

    public function run()
    {
        if ($this->checkAccess) {
            call_user_func($this->checkAccess, $this->id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

  • 相关阅读:
    贪吃蛇小游戏
    pytorch之文本篇项目——聊天机器人(一)数据预处理
    代码随想录算法训练营第四十四天|km46. 携带研究材料、 416. 分割等和子集
    Java获取数组最大值、Java8的Arrays.sort()原理
    SQL:CASE WHEN THEN ELSE END语句
    VueUI Day03(8.2)MintUI、Header 组件、Field 组件、Navbar 组件、脚手架项目图片的访问方式、Tabbar 组件
    SpringBoot整合dubbo(二)
    秋招硬件设计岗,offer拿到手软,是一种什么体验?
    算法比赛常识
    GESP:2024-6月等级5-T1-黑白格
  • 原文地址:https://blog.csdn.net/HUANGXIN9898/article/details/133585267