代碼審計|Discuz最新版代碼執行漏洞

0×00概述

近期審計discuz最新版的時候發現配置文件寫入導致代碼執行的問題。cms安裝的時候一般會分為幾個步驟去進行,其中有對配置文件config進行寫入的步驟,當寫入的時候未嚴格限制傳入的參數就存在代碼執行問題。

0×01 白盒審計

源碼信息:Discuz_X3.4_GIT_SC_UTF8

問題文件: \\\\upload\\install\\index.php

漏洞類型:配置文件寫入導致代碼執行

站點地址:http://www.discuz.net/forum-10-1.html

直接看配置信息寫入的代碼段為 \\\\upload\\install\\index.php

代碼審計|Discuz最新版代碼執行漏洞

看到save_config_file()函數是保存寫入配置信息的,配置信息為$_config這個數組,我們跟蹤下這個數組;

還是這個文件,代碼段為第266行;

代碼審計|Discuz最新版代碼執行漏洞

這裡的$forceinstall參數即為通過POST接收的配置信息數值為二維數組,看到裡面的dbinfo了,這裡程序本身未對傳入的POST值進行任何過濾,也就存在代碼執行問題了。

0×02 漏洞利用

直接安裝到寫入配置信息的步驟;

代碼審計|Discuz最新版代碼執行漏洞

填入正確的數據庫用戶名賬號和密碼之後抓包;

代碼審計|Discuz最新版代碼執行漏洞

這時候看下具體配置文件,代碼段為/upload/uc_server/data/config.inc.php;

代碼審計|Discuz最新版代碼執行漏洞

我們以前綴dbinfo[table_pre]參數為利用,看到使用單引號和括號括起來,所以payload為;

payload = pre_’);phpinfo();//

發到上述抓包裡點擊安裝即可寫入配置文件;

這時候看這個配置文件;

代碼審計|Discuz最新版代碼執行漏洞

直接訪問這個文件即可執行;

http://127.0.0.1/Discuz_X3.4_GIT_SC_UTF8/dir_SC_UTF8/upload/uc_server/data/config.inc.php

代碼審計|Discuz最新版代碼執行漏洞

0×03 防禦

這個漏洞原理比較簡單,針對其防禦方法是需要對傳入的配置信息進行轉義處理,這裡只要轉義單引號就可以了,但是剛開始我有疑惑的點就是這裡的payload在實際情況下,我們需要通過類似“爆破”的思路去測試大量payload,但是由於“安裝鎖”的存在,安裝一次就會鎖定程序生成install.lock文件防止重裝,也就是“爆破”不了,那麼這個漏洞是不是就利用不了呢?為了解決這個疑問,我重新看了下安裝時候的源碼信息,發現這個漏洞還是可以利用的;

代碼審計|Discuz最新版代碼執行漏洞

還是在安裝的文件裡,第478行,可以看到在寫入配置信息到config文件之後,下面還會判斷當methon為ext_info的時候進行其他操作即生成安裝鎖文件進行鎖定,到這個步驟才是完整的安裝操作,也就是和之前的寫入配置信息是“分開”進行的,也可通過抓包去看,比較明顯,是兩個不同的數據包,互相不會干涉,寫入配置信息的數據包不會鎖定安裝程序,所以導致可通過“爆破”去利用,程序這麼去設計也是業務邏輯的需求吧,如果寫入配置信息的步驟即可生成安裝鎖文件並且結束安裝的話,這個漏洞就利用不了了,除非存在任意文件刪除漏洞可以去刪除install.lock這個文件。


分享到:


相關文章: