一次代码审计实战案例【思路流程】
前言:
利用這個 CMS 看看能不能挖到漏洞,運氣還是不錯的挖到了兩個,分別是 SSRF 與文件覆蓋 GETSHELL,下面給大家講解一下這次審計的思路過程。該 CMS 版本是 4.2。以下漏洞均被 CNVD 收錄。
環境說明:
PHP版本用 7.0.9 就好了。
SSRF:
根據功能點定向審計,在后臺的工具欄有一個采集功能,根據經驗這種功能一般存在 SSRF。
使用 python3 在本地開啟簡易的 http 服務。
點擊下一步,果不其然存在 SSRF。
進行漏洞分析。
【→所有資源關注我,私信回復“資料”獲取←】
1、網絡安全學習路線
2、電子書籍(白帽子)
3、安全大廠內部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經典題目解析
7、全套工具包
8、應急響應筆記
根據 burpsuite 抓到的請求包很容易定位到代碼位置。
在文件 upload/plugins/sys/admin/Collect.php#Collect->add,POST 的參數cjurl 未做安全處理被傳入到 $this->caiji->str 方法。
那么我們跟進到 $this->caiji->str 方法,但是 phpstorm 找不到定義該方法的位置。
解決辦法,我們可以連續按兩下 Shift 鍵直接尋找。
跟進到 str 方法后,發現 url 參數被傳入 htmlall 方法,繼續跟進該方法。
可以看到 htmlall 方法使用了 curl 請求 url。
基本上有調用 $this->caiji->str 方法的地方都存在 SSRF 漏洞。
文件覆蓋導致 GETSHELL:
通過敏感函數回溯參數過程的方式找到該漏洞。
在 upload/cscms/app/helpers/common_helper.php#write_file 使用了文件寫入的敏感函數,跟 SSRF 的 htmlall 是同一個文件。
使用 Ctrl+Shift+F 查找哪些位置調用了 write_file,在 upload/plugins/sys/admin/Plugins.php#Plugins->_route_file 調用了 write_file函數,并且 note[note[note[key][‘name’] 和 note[note[note[key][‘url’] 的值是以字符串方式拼接到文件內容的,該內容是注釋,我們可以使用換行繞過。
查找哪些位置調用了 _route_file,跟蹤 $note 的值是否可控,調用該函數的位置有很多,最終找到一處可利用。在 upload/plugins/sys/admin/Plugins.php#Plugins->setting_save 調用了 _route_file,由于該函數內容有點多,所以我將它拆分成兩個界面,一些不重要的內容進行閉合。畫紅線的位置是調用到 _route_file 必須設置的,可以看到在標藍色3的位置獲取到了 $note 的值,分析到這里可以開始復現了。
使用 burpsuite 抓取請求包。
修改請求包內容寫入構造好的代碼,可以看到我使用了 %0a 換行去繞過注釋。
在 upload/cscms/config/dance/rewrite.php 可以看到成功寫入。
尋找引用 rewrite.php 的位置,懶得去看代碼了,通過點擊各個頁面,經過不懈努力終于在個人中心的音樂頁面找到,所以你需要注冊一個會員用戶。
重放 burpsuite 抓到的請求包,成功輸出內容。
到這里其實事情還沒有結束,當我嘗試寫入惡意內容發現被轉義了。
試了 eval、shell_exec 等均被轉義,但是 assert 沒有被轉義,考慮到 assert 在PHP7版本之后的問題,我還是需要找一個更好的辦法。懶得去看轉義的代碼了,我根據PHP的動態特性使用以下方法成功 RCE。
總結:
此次代碼審計使用了通用代碼審計思路的兩種,第一種:根據功能點定向審計、第二種:敏感函數回溯參數過程,沒有用到的是通讀全文代碼。活用 phpstorm 可以讓代碼審計的效率大大增加。
總結
以上是生活随笔為你收集整理的一次代码审计实战案例【思路流程】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RMI、JNDI、LDAP介绍+log4
- 下一篇: 通过蜜罐技术获取攻击者手机号、微信号【网