YxtCMF後台的注入和getshell分析

文章源自【位元組脈搏社區】-位元組脈搏實驗室

作者-sher10ck

目錄結構

說明: 這攤源碼是基於thinkphp3.2.3開發的,然後有幾個重要的目錄記錄一下:

index.php

首先會判斷是否開啟了 magic_quotes_gpc 函數

若開啟了的話,則會對GET、POST接受的參數進行 stripslashesRecursive(實質上就是stripslashes) 轉義:

判斷是否已經安裝了,若沒有安裝進行安裝:

最後引用了一個文件,還不知道是幹嘛用的:

前台登錄處的一個注入

這個注入點主要是由於thinkphp框架漏洞所導致的一個注入點,又學到了

這裡進行抓包:

登陸成功

把payload直接放出來:

報錯注入將資料庫爆出來了

我們分析一下這個漏洞形成的原因。

首先我們請求的url:

然後我們就找application/user下面的controller:

當然有的時候我們可能無法根據名稱來辨別是否是我們需要找的腳本,我的方法就是在這個application/user/controller目錄下面用關鍵詞來查找了

可以挨個看一下裡面的內容,最終我找到了LoginController.class.php:

首先驗證了驗證碼是否正確,然後初始化了一個Users模組,最後檢測是用手機號登錄還是用郵箱登錄:

我們跟蹤mobile函數,這裡兩個登錄的方式都有注入:

裡面其他的程式碼都不用看,注意上面的程式碼有個where函數,而:

這是thinkphp的一個框架漏洞,我們先來看一下where函數的功能和用法:

也就是說,where裡面包含的內容就是我們要查找的where後面的語句,那麼我們這裡是不是只要直接寫入語句進去就行啦~

但是你要觀察到我們這裡where裡面的$where變數是數組的形式,而並非字元串形式。

這裡我們看下exp表達式,看了你就懂啦:

也就是說,array的第一個值為exp,第二個值為我們要執行的sql語句,就可以繞過利用了,所以我們的exp就是:

分析好了exp之後,我們來看下I函數(/yxtedu/Core/Mode/Api/finctions.php)中的過濾,官方是這樣解釋的:

意思就是說,我們過濾的主要方法是array_walk_recursive(data,filter),data代表我們要過濾的內容,fileter代表我們要過濾的方法

I函數中的array_walk_recursive(),採用的是think_filter,跟蹤這個函數:

這裡要是匹配到了以上的函數,值就會為空了,所以說沒有I函數的where是存在注入點的。

後台的一個注入

我們知道這套cms有上面的一個漏洞之後,通過關鍵詞搜索可以跟蹤到更多的注入點:

就直接跟進這個39行的程式碼,來到了application/admin/controller/adcontroller.class.php

這裡通過I函數獲取id值,但是沒有選擇過濾的方法,所以默認應該是沒有過濾函數的,id直接拼湊到語句當中了

但是我這裡還是不知道這個函數用在哪個功能里,最後我通過搜索ad_id找到了

我們訪問這個頁面

函數命名為edit,肯定就是編輯了

然後發現是個偽靜態

這樣我們在後面添加語句試試:

and 1=1 正確 and 1=2 就報錯了

GETSHELL

這裡是設置路由這裡的問題,RouteController.class.php:

跟進這個sp_get_routes函數,我這裡貼出關鍵的程式碼:

這裡我們通過上面的程式碼可以看出,過濾的函數就是三個:

跟蹤這三個函數,沒什麼作用,等於將我們的route直接寫入到route.php中。 route.php:

後台添加url規則,填寫:

然後訪問:

我們打開route.php,程式碼已經寫入進去了

審計就到這裡啦

推薦閱讀

Thinkphp中的where函數

ThinkPHP框架架構上存在SQL注入

ThinkPHP函數詳解:I方法

PHP程式碼審計入門篇二 ——MVC結構審計