真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP反序列化中如何尋找POP鏈

PHP反序列化中如何尋找POP鏈,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、蓮都網(wǎng)站維護(hù)、網(wǎng)站推廣。

環(huán)境搭建

運(yùn)行環(huán)境要求

  • PHP >= 7.1.3

  • OpenSSL PHP Extension

  • PDO PHP Extension

  • Mbstring PHP Extension

安裝題目環(huán)境

PHP反序列化中如何尋找POP鏈

運(yùn)行題目代碼

PHP反序列化中如何尋找POP鏈

更多請參考:https://laravel-china.org/docs/lumen/5.7/installation/2402

PS:更新P牛制作的docker環(huán)境 https://github.com/phith0n/code-breaking

漏洞點(diǎn)

routes/web.php文件中,定義了 web程序的路由,當(dāng)我們以 GETPOST方法訪問 http://website/server/editor的時候,程序就會調(diào)用 app/Http/Controllers/EditorController.php類中的 main方法。

PHP反序列化中如何尋找POP鏈

我們進(jìn)而看 app/Http/Controllers/EditorController.php文件,很快便會發(fā)現(xiàn)有一個 download方法中的 $url變量沒有經(jīng)過任何處理用在了 file_get_contents函數(shù)中, download方法代碼如下:

PHP反序列化中如何尋找POP鏈

這時我們便考慮 $url變量是否可控,如果可控,便可以利用 phar反序列化。我們回溯尋找 $url變量來源,會發(fā)現(xiàn)在 doCatchimage方法中,該變量值是從 $sources變量來。而 $sources變量由用戶傳來的 source參數(shù)決定(通過 http://website/server/editor/?action=Catchimage&source[]=phar://xxx.gif即可控制 $url變量),相關(guān)代碼如下:

PHP反序列化中如何尋找POP鏈

那么接下來,我們就要尋找可利用的類方法,然后通過 phar反序列化觸發(fā)漏洞。

了解PHPGGC

在尋找 pop鏈之前,我們不妨先看看 phpggc中已有的 4種關(guān)于 Laravel框架 RCEpayload生成方法,以便我們更快速的找出本題的 pop鏈,其 4種 Laravel框架 RCEpayload生成方法分別如下:

第1種

PHP反序列化中如何尋找POP鏈

其反序列化時,類方法調(diào)用過程如下:

PHP反序列化中如何尋找POP鏈

第2種

PHP反序列化中如何尋找POP鏈

其反序列化時,類方法調(diào)用過程如下:

PHP反序列化中如何尋找POP鏈

第3種

PHP反序列化中如何尋找POP鏈

其反序列化時,類方法調(diào)用過程如下:

PHP反序列化中如何尋找POP鏈

第4種

PHP反序列化中如何尋找POP鏈

其反序列化時,類方法調(diào)用過程如下:

PHP反序列化中如何尋找POP鏈

這里我選取 第1種phar反序列化執(zhí)行結(jié)果圖(題目環(huán)境為 PHP7.1.16):

PHP反序列化中如何尋找POP鏈

然而本題目的環(huán)境還有一些額外的限制,例如 PHP版本為 7.2.14,且設(shè)置了禁用了如下函數(shù)和類(這個通過 phpggc的第一個  Laravel框架 RCE生成 phpinfo函數(shù)的利用 phar即可看到):

disable_functions:
system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,mail,apache_setenv,mb_send_mail,dl,set_time_limit,ignore_user_abort,symlink,link,error_log

disable_classes:
GlobIterator,DirectoryIterator,FilesystemIterator,RecursiveDirectoryIterator

由于在 PHP7.x版本中,很多函數(shù)禁止動態(tài)調(diào)用了,加上上面的這些限制,所以我們還需要尋找其他利用點(diǎn),結(jié)合上述 POP鏈,完成寫 shell。

開始尋找pop鏈

我們可以發(fā)現(xiàn)上面的4種 RCE入口點(diǎn)都是從 PendingBroadcast類的 __destruct方法開始的,那么我們著重搜索 dispatch方法和 __call方法。經(jīng)過一番搜索,發(fā)現(xiàn) ValidGenerator類中的 __call比較好利用。

PHP反序列化中如何尋找POP鏈

我們可以看到其代碼中先調(diào)用了 call_user_func_array函數(shù),然后將 call_user_func_array函數(shù)的執(zhí)行結(jié)果又傳入  call_user_func函數(shù),只要我們能控制住 call_user_func_array函數(shù)的執(zhí)行結(jié)果,相當(dāng)于  call_user_func函數(shù)的兩個參數(shù)都可控,這樣我們便可以調(diào)用任意類方法。

我們接著搜索可以用于控制 call_user_func_array函數(shù)執(zhí)行結(jié)果的類,這里我找到了 DefaultGenerator類的 __call方法,我們可以看到返回值 $this->default完全可控。

PHP反序列化中如何尋找POP鏈

現(xiàn)在 call_user_func(res)中的兩個參數(shù)都可控了。那么如果我們想寫shell,就要調(diào)用 file_put_contents函數(shù),而這個函數(shù)需要兩個參數(shù),所以直接通過 call_user_func函數(shù)是無法使用該函數(shù)的,我們需要通過 call_user_func_array函數(shù)來使用 file_put_contents函數(shù),用法形如: call_user_func_array('file_put_contents',array('shell.php','test'))。

通過直接搜索 call_user_func_array函數(shù),我們會發(fā)現(xiàn)兩個比較好利用的類函數(shù)。但是這里的第一個 ClosureWrapper類我們無法利用,所以得利用 ReturnCallback類的 invoke方法,具體代碼如下:

PHP反序列化中如何尋找POP鏈

很明顯 invoke方法兩個參數(shù)都可控,現(xiàn)在我們只要構(gòu)造好一個 Invocation類對象即可。通過搜索,我們會發(fā)現(xiàn) Invocation是一個接口,那么我們找到他的實(shí)現(xiàn)類即可。這里我找到了 StaticInvocation類來實(shí)現(xiàn)上訴功能,其代碼具體如下:

PHP反序列化中如何尋找POP鏈

這樣子,我們的整個 POP鏈就構(gòu)造好了。下面是 exp

 {
     {
         ;
         ;
         (, ){
              ;
              ;
        }
    }
};
 {
     {
         ;
          (  ){
              ;
        }
    }
     {
         ;
         ;
         ;
        
          (,   ,   )
        {
              ;
              ;
              ;
        }
    }
};
 {
     
    {
         ;
          ()
        {
              ;
        }
    }
};
 {
     {
         ;
          (){
              ;
        }
    }
};
{
      ;
      (,);
       ();
       ();
       ();
       (,(,),);
       (,);
      ;
      ;
    ()  () : ;
     ();
    ();
    ();
    ();
    (,);
    ();
};

最后

我們再通過下面這張圖片,來理清整個 POP鏈 的調(diào)用過程。

PHP反序列化中如何尋找POP鏈

看完上述內(nèi)容,你們掌握PHP反序列化中如何尋找POP鏈的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前名稱:PHP反序列化中如何尋找POP鏈
網(wǎng)址分享:http://weahome.cn/article/ppoeig.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部