天天看點

CatfishCMS任意指令執行導緻getshell目錄

CatfishCMS任意指令執行導緻getshell

  • 目錄
    • 一、 漏洞說明
    • 二、 漏洞測試
    • 三、漏洞修複

目錄

測試環境:windows + php5.4.45 +apache (phpStudy 內建環境)

CMS 版本: v4.8.54(釋出于2019年1月)

漏洞挖掘後送出了CNVD,在CNVD公示後,才發表本文。

漏洞已經修複。

CNVD-ID: CNVD-2019-06255

一、 漏洞說明

完整的payload為:

s=dir&_method=__construct&method=*&filter[]=system

結合源代碼詳細說明如下:

  1. _method=__construct

    CatfishCMS基于thinkPHP5開發。

    Request類(catfish/library/think/Request.php)用于處理請求。

    它的成員函數method用于擷取請求的類型。

    CatfishCMS任意指令執行導緻getshell目錄
    application/config.php 中定義了“表單請求類型僞裝變量”:
    CatfishCMS任意指令執行導緻getshell目錄
    POST請求參數 “ _method=__construct ”,将 __construct 傳給了var_method ,在Request類的method函數中執行後,實作了對Request類的 __construct 構造函數的調用;并且将完整的POST參數傳給了構造函數。
  2. 2、 method=*&filter[]=system

    catfish/library/think/Request.php子產品中的Request類的構造函數:

    CatfishCMS任意指令執行導緻getshell目錄

    該函數中循環取出參數,如果是本類中存在的參數,就取使用者傳入的值為其指派。

    _method=__construct 使得 method 函數調用了 __construct 構造函數, 并且将完整的POST參數傳遞過去。實作了對本類中的 $method 和 $filter 兩個全局變量的覆寫。

    CatfishCMS任意指令執行導緻getshell目錄
    CatfishCMS任意指令執行導緻getshell目錄

    filter[]=system 的補充說明:

    filter[]=system 或者 filter=system都可以,[]符号可有可無;system意為執行系統指令。

    Method=* 的補充說明:

    method參數的取值限定為:catfish/library/think/Route.php 子產品中定義的路由規則。如:GET、POST、PUT、* 等任何一個值都可以;如果值不在此表或為空,都會報錯。

    CatfishCMS任意指令執行導緻getshell目錄
  3. s=dir

    application/config.php 中定義PATHINFO變量名為’ s ’。可用s傳入需要執行的指令,如s=dir

    CatfishCMS任意指令執行導緻getshell目錄

    最終的的payload:

    s=dir&_method=__construct&method=&filter[]=system

    _method=__construct 使得 Request類的method函數調用 __construct 構造函數,并且将完整的payload傳遞給構造函數;構造函數中對 method 和filter 兩個全局變量進行覆寫,method=&filter[]=system ;參數s=dir傳入需要執行的系統指令 dir 。

二、 漏洞測試

發現漏洞後,在申請CNVD的同時,我在廠商的github項目中送出了issue,位址為: https://github.com/xwlrbh/Catfish/issues/4 廠商确認了該漏洞。并且立即對産品打了更新檔,然後釋出了新版本v4.8.57。也可聯系廠商确認原版本v4.8.54(釋出于2019年1月)的該漏洞。

更新檔見附錄。

  1. 攔截首頁請求,并改變請求方法為POST
    CatfishCMS任意指令執行導緻getshell目錄
  2. 構造POST請求
    CatfishCMS任意指令執行導緻getshell目錄

    a、 method的值必須等于 “ * ”

    b、 method=* 後面不能有任何參數,包括\r\n回車換行。

    這兩條任何一條不滿足都不能執行。

  3. 執行一條windows指令,在網站根目錄建立一個shell.php檔案并寫入一句話木馬
    CatfishCMS任意指令執行導緻getshell目錄
  4. 測試執行phpinfo()
    CatfishCMS任意指令執行導緻getshell目錄
    這裡 phpinfo() 後邊一定要跟一個分号,否則不能執行。
  5. 也可以建立一個檔案并寫入一句話木馬,進而執行任意指令
    CatfishCMS任意指令執行導緻getshell目錄
    6. 執行windows 的 dir 指令測試
    CatfishCMS任意指令執行導緻getshell目錄

三、漏洞修複

V4.8.54 的catfish/library/think/Request.php子產品中Request類的method函數:

CatfishCMS任意指令執行導緻getshell目錄

V4.8.57(漏洞修複後)的catfish/library/think/Request.php子產品中Request類的method函數:

CatfishCMS任意指令執行導緻getshell目錄

繼續閱讀