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