前言
最近想提升一下自己的代審能力,雖然之前復(fù)現(xiàn)分析了挺多漏洞的念秧,TP,Laravel,Typcho凉驻,yii,但一直感覺對(duì)代碼審計(jì)能力提升用處不太大范咨,很多時(shí)候鏈子和利用點(diǎn)都非常簡(jiǎn)單逾条,可是如何發(fā)現(xiàn)的這確實(shí)一個(gè)難題,所以就拿熊海CMS為例宴合,如何自己挖它里面的漏洞焕梅,看看自己能否發(fā)現(xiàn)和利用,最后在和網(wǎng)上存在的漏洞進(jìn)行對(duì)比卦洽,再看哪里沒有發(fā)現(xiàn)贞言,為什么沒有發(fā)現(xiàn),希望這也能給才入門代碼審計(jì)的師傅們一點(diǎn)思路吧
【資料】
審計(jì)流程
先看一下入口文件index.php阀蒂,這個(gè)文件一般會(huì)定義很多變量该窗,包含很多路徑弟蚀,文件進(jìn)來,我們只需要注意它和用戶的交互的點(diǎn)酗失,入口文件一般會(huì)先判斷你是否存在安裝鎖或者配置文件义钉,如果不存在就跳轉(zhuǎn)到安裝目錄,開始安裝整個(gè)網(wǎng)站规肴。然后打開文件監(jiān)控捶闸,首先判斷是否存在重裝漏洞,然后再分析目錄結(jié)構(gòu)拖刃,大概知道每個(gè)文件夾中放的文件功能是什么就行了鉴嗤,比如熊海CMS:
然后安裝成功后我習(xí)慣先瀏覽下網(wǎng)站的主要功能,大致了解這些之后就可以靜下心來看代碼了
重裝漏洞
重裝漏洞可以以下幾種類型:
-
自動(dòng)刪除這個(gè)安裝文件
通過生成一個(gè) lock 文件來判斷程序是否安裝過
-
根本無驗(yàn)證
安裝完成后不會(huì)自動(dòng)刪除文件序调,又不會(huì)生成 lock 判斷是否安裝過
-
安裝file
直接用GET提交step繞過醉锅,直接進(jìn)入下一步
-
變量覆蓋導(dǎo)致重裝
可以GET,POST,COOKIE任意提交一個(gè)變量名
insLockfile硬耍,從而讓file_exists為false就不會(huì)退出
-
判斷l(xiāng)ock后,無exit
判斷是否存在lock文件边酒,如果存在lock文件经柴,就會(huì)header到index.php,但是header后并沒有exit墩朦,所以
并不會(huì)退出坯认,類似的還有javascript彈個(gè)框 -
解析漏洞
在安裝完成后會(huì)將install.php
重命名為index.php.bak,但是由于Apache的解析漏洞:如果無法識(shí)別到最后一個(gè)后綴的話氓涣,就會(huì)向上解析牛哺,那么就又變成了php了,然后結(jié)合安裝時(shí)的變量覆蓋又成重裝了劳吠。 滿足一些條件不會(huì)退出的
危害:
- 因?yàn)樵诎惭b時(shí)我們可控一些變量引润,因?yàn)闆]有exit,導(dǎo)致配置信息沒有過濾的傳入安裝后痒玩,從而寫入文件getshell
- 重裝之后修改管理員信息淳附,進(jìn)入后臺(tái)getshell
install/index.php:
并沒有發(fā)現(xiàn)存在重裝漏洞
SQL注入漏洞1
首先就要去查看數(shù)據(jù)庫使用的編碼方式,如果是GBK則可能造成寬字節(jié)注入蠢古,從而直接繞過addslashes這類函數(shù)奴曙,然后去有對(duì)數(shù)據(jù)庫操作的地方查看傳入數(shù)據(jù)是否可控,我們可以注意下草讶,在注入前是否對(duì)參數(shù)進(jìn)行了解碼洽糟,如果進(jìn)行了解碼,可以二次編碼注入,在熊海CMS安裝的時(shí)候就發(fā)現(xiàn)它有寫入管理員信息的操作脊框,而且是在安裝前的操作颁督,并沒有對(duì)參數(shù)進(jìn)行任何過濾践啄,
insatll\index.php:
而且它是有報(bào)錯(cuò)輸出的浇雹,所以可以報(bào)錯(cuò)注入:
然后就是安裝之后了,
文件包含漏洞
首先就從網(wǎng)站入口跟進(jìn)屿讽,發(fā)現(xiàn)是一個(gè)單入口模式:
這里就存在文件包含漏洞昭灵,只是說暫時(shí)還沒有發(fā)現(xiàn)危險(xiǎn)文件能夠利用,看道這里那就聯(lián)想到能不能把后面的php后綴截?cái)喾ヌ福缓笕ド蟼饕粋€(gè)圖片馬來包含呢烂完,或者是否存在一個(gè)文件寫入的點(diǎn)來利用呢,可是我試了一下第一個(gè)思路诵棵,好像并沒有成功抠蚣,但是存在疑惑,因?yàn)樵赑HP<5.3.4的時(shí)候履澳,我們是可以利用%00來截?cái)嗪缶Y的嘶窄,但是當(dāng)我本地將版本調(diào)低到5.3.29,按理說是可以截?cái)嗪缶Y從而包含任意文件距贷,但是卻出了問題柄冲,我先在根目錄寫了一個(gè)phpinfo,
這樣是可以的忠蝗,但是:
這樣缺不行现横,然后我又使用長(zhǎng)度截?cái)嘁参闯晒?/p>
然后就跟進(jìn)files文件夾下的頁面文件,首先就是files/index.php阁最,里面很多都是echo數(shù)據(jù)庫里面的信息戒祠,但是我們并不可控,因?yàn)槔锩嬉M(jìn)了template里面的文件速种,所以也先看一下得哆,發(fā)現(xiàn)里面有沒有能利用的,查看fiels/list.php哟旗,看起來存在SQL注入漏洞贩据,但是存在addslashes函數(shù),無法注入闸餐,然后繼續(xù)審計(jì)饱亮,直到看到fiels/download.php的時(shí)候,發(fā)現(xiàn)了一個(gè)XSS漏洞舍沙,然后fiels/list.php同理
反射型XSS漏洞1
XSS也分為反射型近上、存儲(chǔ)型以及DOM型,當(dāng)我們想挖掘反射型XSS漏洞時(shí)拂铡,需要重點(diǎn)關(guān)注程序的輸出壹无,比如echo/print等葱绒,當(dāng)程序直接將未經(jīng)過濾的用戶輸入輸出除了,就會(huì)造成反射型XSS斗锭。
而存儲(chǔ)型XSS是由于網(wǎng)站將用戶輸入存儲(chǔ)進(jìn)數(shù)據(jù)庫中地淀,當(dāng)用戶再次瀏覽某頁面時(shí),從數(shù)據(jù)庫中獲取之前的輸入并輸出岖是,如果在輸入->數(shù)據(jù)庫這塊過程中沒有進(jìn)行實(shí)體化編碼以及輸出->頁面的過程中沒進(jìn)行實(shí)體化編碼帮毁,則很容易產(chǎn)生存儲(chǔ)型XSS。所以對(duì)于這類XSS豺撑,重點(diǎn)關(guān)注insert烈疚,查找insert表內(nèi)數(shù)據(jù)的輸出位。
fiels/download.php:
直接echo可控變量聪轿,所以存在XSS漏洞爷肝,
然后繼續(xù)往后看,點(diǎn)擊下載會(huì)跳轉(zhuǎn)到files/content.php陆错,跟進(jìn)灯抛,發(fā)現(xiàn)存在SQL注入漏洞,
SQL注入漏洞2
files/content.php:
這里的原因就是沒有使用單引號(hào)閉合用戶可控變量危号,導(dǎo)致繞過addslashes函數(shù)牧愁,
繼續(xù)跟進(jìn),發(fā)現(xiàn)調(diào)用files/submit.php提交評(píng)論外莲,
跟進(jìn)files/submit.php猪半,
都可控,且未經(jīng)過addslashes函數(shù)偷线,
很明顯的一個(gè)SQL注入漏洞磨确,但是需要注意的是后面還有一個(gè)插入語句:
開始我也卡了一下,因?yàn)槟阒婚]合前面声邦,后面是會(huì)報(bào)錯(cuò)的:
閉合后面:
還是不行乏奥,但是突然想到只需要用報(bào)錯(cuò)注入,讓前面報(bào)錯(cuò)了亥曹,后面自然就不用管了:
name=1&mail=1') or updatexml(1,concat(0x7e,(select(database())),0x7e),1)#&content=哈哈
往后走還有SQL注入邓了,
后面相同利用的地方就不贅敘了,因?yàn)榘l(fā)現(xiàn)這里有可控?cái)?shù)據(jù)插入數(shù)據(jù)庫的操作媳瞪,那是否存在存儲(chǔ)型XSS呢骗炉?
存儲(chǔ)型XSS1
分析已經(jīng)在上面的流程分析了
在files/content.php,我們能提交昵稱蛇受、郵箱句葵、網(wǎng)址、評(píng)論內(nèi)容,但是在files/submit.php中乍丈,
他過濾了$content的HTML代碼剂碴,所以不能利用,而且在顯示評(píng)論和留言的地方有昵稱轻专,所以我們只能利用昵稱處進(jìn)行存儲(chǔ)XSS
還有一個(gè)files/contact.php忆矛,存在和files/content.php一樣的留言框,大概看了下代碼铭若,也是存在存儲(chǔ)型XSS
最后還有一個(gè)files/software.php文件洪碳,在下載的時(shí)候會(huì)跳轉(zhuǎn)到該界面递览,
又存在明顯的SQL注入漏洞叼屠,
這里就不再重復(fù)講述了
審計(jì)到這里差不多前端的代碼就審?fù)炅耍┒淳蚐QL注入漏洞和XSS漏洞绞铃,然后就是去審計(jì)后臺(tái)的代碼了
首先對(duì)于后臺(tái)代碼镜雨,我會(huì)先查看是否存在越權(quán)漏洞,是否存在CSRF漏洞儿捧,然后登錄后臺(tái)荚坞,尋找PHP文件寫入,尋找命令執(zhí)行菲盾,
首先查看login.php颓影,
又是重復(fù)的SQL注入,后面就不重復(fù)這些漏洞了懒鉴,在審計(jì)代碼的時(shí)候诡挂,并未發(fā)現(xiàn)admin/login.php存在什么越權(quán)漏洞,但是后面查看存在漏洞的時(shí)候临谱,他卻存在這個(gè)漏洞璃俗,因?yàn)樵诔晒Φ卿浬蟖dmin賬號(hào)后,他是存在一個(gè)user的cookie的悉默,但是退出之后又沒有了城豁,所以他就是通過cookie中的user值來判斷登錄是否成功的,所以只需要偽造一個(gè)cookie即可:
成功越權(quán)登錄
然后就是./inc/checklogin.php中存在越權(quán)漏洞了抄课,:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
所以只要調(diào)用了該文件都存在越權(quán)漏洞
后面的話其實(shí)就是前面提到過的漏洞了唱星,這里就不再贅敘了,
總結(jié)
其實(shí)這個(gè)CMS很簡(jiǎn)單跟磨,我主要想講的并不是這個(gè)CMS如何審計(jì)间聊,而是一個(gè)思路,希望能幫到剛?cè)腴T代審的師傅們吱晒,其實(shí)很多漏洞甸饱,利用點(diǎn)都很簡(jiǎn)單,難的就是去發(fā)現(xiàn)它的思路
關(guān)注我,持續(xù)更新······