91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-10-11 10:57:57 來源:億速云 閱讀:135 作者:柒染 欄目:網絡管理

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

環境搭建

運行環境要求

  • PHP >= 7.1.3

  • OpenSSL PHP Extension

  • PDO PHP Extension

  • Mbstring PHP Extension

安裝題目環境

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

運行題目代碼

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

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

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

漏洞點

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

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

我們進而看 app/Http/Controllers/EditorController.php 文件,很快便會發現有一個 download 方法中的 $url 變量沒有經過任何處理用在了 file_get_contents 函數中, download 方法代碼如下:

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

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

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

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

了解PHPGGC

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

第1種

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

其反序列化時,類方法調用過程如下:

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

第2種

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

其反序列化時,類方法調用過程如下:

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

第3種

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

其反序列化時,類方法調用過程如下:

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

第4種

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

其反序列化時,類方法調用過程如下:

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

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

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

然而本題目的環境還有一些額外的限制,例如 PHP 版本為 7.2.14 ,且設置了禁用了如下函數和類(這個通過 phpggc 的第一個  Laravel 框架 RCE 生成 phpinfo 函數的利用 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 版本中,很多函數禁止動態調用了,加上上面的這些限制,所以我們還需要尋找其他利用點,結合上述 POP 鏈,完成寫 shell

開始尋找pop鏈

我們可以發現上面的4種 RCE 入口點都是從 PendingBroadcast 類的 __destruct 方法開始的,那么我們著重搜索 dispatch 方法和 __call 方法。經過一番搜索,發現 ValidGenerator 類中的 __call 比較好利用。

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

我們可以看到其代碼中先調用了 call_user_func_array 函數,然后將 call_user_func_array 函數的執行結果又傳入  call_user_func 函數,只要我們能控制住 call_user_func_array 函數的執行結果,相當于  call_user_func 函數的兩個參數都可控,這樣我們便可以調用任意類方法。

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

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

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

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

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

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

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

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

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

最后

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

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

看完上述內容,你們掌握PHP反序列化中如何尋找POP鏈的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

松阳县| 富顺县| 泽州县| 甘德县| 青阳县| 六盘水市| 松潘县| 边坝县| 临武县| 太康县| 崇州市| 桐城市| 格尔木市| 利辛县| 贞丰县| 兴和县| 淮安市| 通海县| 肃北| 壤塘县| 彭阳县| 木兰县| 桦川县| 德清县| 青冈县| 长阳| 罗源县| 西畴县| 清新县| 嘉义市| 夏河县| 靖边县| 察雅县| 施秉县| 河池市| 嵩明县| 芜湖市| 扎鲁特旗| 松阳县| 涡阳县| 左贡县|