前言:
這篇文章:該 CMS 版本是 4.2。以下漏洞均被 CNVD 收錄。
環(huán)境說(shuō)明:
php版本用 7.0.9 就好了。
SSRF:
根據(jù)功能點(diǎn)定向?qū)徲?jì),在后臺(tái)的工具欄有一個(gè)采集功能,根據(jù)經(jīng)驗(yàn)這種功能一般存在 SSRF。
【一>所有資源關(guān)注我,私信回復(fù)"資料"獲取<一】
1、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2、電子書(shū)籍(白帽子)
3、安全大廠內(nèi)部視頻
4、100份src文檔
5、常見(jiàn)安全面試題
6、ctf大賽經(jīng)典題目解析
7、全套工具包
8、應(yīng)急響應(yīng)筆記
使用 Python3 在本地開(kāi)啟簡(jiǎn)易的 http 服務(wù)。
點(diǎn)擊下一步,果不其然存在 SSRF。
進(jìn)行漏洞分析。
根據(jù) burpsuite 抓到的請(qǐng)求包很容易定位到代碼位置。
在文件
upload/plugins/sys/admin/Collect.php#Collect->add,POST 的參數(shù)cjurl 未做安全處理被傳入到 $this->caiji->str 方法。
那么我們跟進(jìn)到 $this->caiji->str 方法,但是 phpstorm 找不到定義該方法的位置。
解決辦法,我們可以連續(xù)按兩下 Shift 鍵直接尋找。
跟進(jìn)到 str 方法后,發(fā)現(xiàn) url 參數(shù)被傳入 htmlall 方法,繼續(xù)跟進(jìn)該方法。
可以看到 htmlall 方法使用了 curl 請(qǐng)求 url。
基本上有調(diào)用 $this->caiji->str 方法的地方都存在 SSRF 漏洞。
文件覆蓋導(dǎo)致 GETSHELL:
通過(guò)敏感函數(shù)回溯參數(shù)過(guò)程的方式找到該漏洞。
在
upload/cscms/App/helpers/common_helper.php#write_file 使用了文件寫入的敏感函數(shù),跟 SSRF 的 htmlall 是同一個(gè)文件。
使用 Ctrl+Shift+F 查找哪些位置調(diào)用了 write_file,在
upload/plugins/sys/admin/Plugins.php#Plugins->_route_file 調(diào)用了 write_file函數(shù),并且 note[note[key][‘name’] 和 note[note[key][‘url’] 的值是以字符串方式拼接到文件內(nèi)容的,該內(nèi)容是注釋,我們可以使用換行繞過(guò)。
查找哪些位置調(diào)用了 _route_file,跟蹤 $note 的值是否可控,調(diào)用該函數(shù)的位置有很多,最終找到一處可利用。在
upload/plugins/sys/admin/Plugins.php#Plugins->setting_save 調(diào)用了 _route_file,由于該函數(shù)內(nèi)容有點(diǎn)多,所以我將它拆分成兩個(gè)界面,一些不重要的內(nèi)容進(jìn)行閉合。畫紅線的位置是調(diào)用到 _route_file 必須設(shè)置的,可以看到在標(biāo)藍(lán)色3的位置獲取到了 $note 的值,分析到這里可以開(kāi)始復(fù)現(xiàn)了。
使用 burpsuite 抓取請(qǐng)求包。
修改請(qǐng)求包內(nèi)容寫入構(gòu)造好的代碼,可以看到我使用了 %0a 換行去繞過(guò)注釋。
在
upload/cscms/config/dance/rewrite.php 可以看到成功寫入。
尋找引用 rewrite.php 的位置,懶得去看代碼了,通過(guò)點(diǎn)擊各個(gè)頁(yè)面,經(jīng)過(guò)不懈努力終于在個(gè)人中心的音樂(lè)頁(yè)面找到,所以你需要注冊(cè)一個(gè)會(huì)員用戶。
重放 burpsuite 抓到的請(qǐng)求包,成功輸出內(nèi)容。
到這里其實(shí)事情還沒(méi)有結(jié)束,當(dāng)我嘗試寫入惡意內(nèi)容發(fā)現(xiàn)被轉(zhuǎn)義了。
試了 eval、shell_exec 等均被轉(zhuǎn)義,但是 assert 沒(méi)有被轉(zhuǎn)義,考慮到 assert 在PHP7版本之后的問(wèn)題,我還是需要找一個(gè)更好的辦法。懶得去看轉(zhuǎn)義的代碼了,我根據(jù)PHP的動(dòng)態(tài)特性使用以下方法成功 RCE。
總結(jié):
此次代碼審計(jì)使用了通用代碼審計(jì)思路的兩種,第一種:根據(jù)功能點(diǎn)定向?qū)徲?jì)、第二種:敏感函數(shù)回溯參數(shù)過(guò)程,沒(méi)有用到的是通讀全文代碼。活用 phpstorm 可以讓代碼審計(jì)的效率大大增加。






