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
結合源代碼詳細說明如下:
-
_method=__construct
CatfishCMS基于thinkPHP5開發。
Request類(catfish/library/think/Request.php)用于處理請求。
它的成員函數method用于擷取請求的類型。
application/config.php 中定義了“表單請求類型僞裝變量”: POST請求參數 “ _method=__construct ”,将 __construct 傳給了var_method ,在Request類的method函數中執行後,實作了對Request類的 __construct 構造函數的調用;并且将完整的POST參數傳給了構造函數。 -
2、 method=*&filter[]=system
catfish/library/think/Request.php子產品中的Request類的構造函數:
該函數中循環取出參數,如果是本類中存在的參數,就取使用者傳入的值為其指派。
_method=__construct 使得 method 函數調用了 __construct 構造函數, 并且将完整的POST參數傳遞過去。實作了對本類中的 $method 和 $filter 兩個全局變量的覆寫。
filter[]=system 的補充說明:
filter[]=system 或者 filter=system都可以,[]符号可有可無;system意為執行系統指令。
Method=* 的補充說明:
method參數的取值限定為:catfish/library/think/Route.php 子產品中定義的路由規則。如:GET、POST、PUT、* 等任何一個值都可以;如果值不在此表或為空,都會報錯。
-
s=dir
application/config.php 中定義PATHINFO變量名為’ s ’。可用s傳入需要執行的指令,如s=dir
最終的的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月)的該漏洞。
更新檔見附錄。
- 攔截首頁請求,并改變請求方法為POST
- 構造POST請求
a、 method的值必須等于 “ * ”
b、 method=* 後面不能有任何參數,包括\r\n回車換行。
這兩條任何一條不滿足都不能執行。
- 執行一條windows指令,在網站根目錄建立一個shell.php檔案并寫入一句話木馬
- 測試執行phpinfo() 這裡 phpinfo() 後邊一定要跟一個分号,否則不能執行。
- 也可以建立一個檔案并寫入一句話木馬,進而執行任意指令 6. 執行windows 的 dir 指令測試
三、漏洞修複
V4.8.54 的catfish/library/think/Request.php子產品中Request類的method函數:
V4.8.57(漏洞修複後)的catfish/library/think/Request.php子產品中Request類的method函數: