NginxWEBUI框架RCE任意命令执行漏洞深度分析(含Poc和EXP)

一 影响范围

nginxWebUI <= 3.5.0 

二 漏洞原理

Payload: http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令(需要经过url编码)

2.1 AppFilter过滤器

框架内所有流量均经过AppFilter过滤器进行过滤,相关代码如下

 可以看到在这里doFilter过滤器过滤了相关含有"/adminPage"的请求,但是与Poc中的不同,此过滤器并没有过滤大小写不一样的,含有"AdminPage"的请求(ADMINPAGE等同理)。那按理说请求到的路径也应该是AdminPage,为什么使用AdiminPage也会转到adminPage一样的请求上呢?

2.2Spring中@RequestMap的机制

在spring中,经常使用requestmap+controller的方式去获取请求路径,但是这里的请求路径是不区分大小写的也就是说,你请求AdminPage和请求adminPage是一样的!

 

三 Poc分析

3.1参数走向

都说到这里了,Poc分析也就是这样了

http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令(需要经过url编码)

相关的请求通过AppFilter过滤器,由confController处理相关命令

可以看到当请求runCmd接受后,并没有再去判断这个请求是否合法,并将结果转化为JSON串直接返回给了前端。

3.2 漏洞修复

官方已经在最新版的NginxWEBUI修复了这一漏洞,相关的修复代码如下

在confController层的修复代码如下

	@Mapping(value = "runCmd")
	public JsonResult runCmd(String cmd, String type) {

		if (StrUtil.isNotEmpty(type)) {
			settingService.set(type, cmd);
		}

		// 仅执行nginx相关的命令,而不是其他的恶意命令
		if (!isAvailableCmd(cmd)) {
			return renderSuccess(m.get("confStr.notAvailableCmd"));
		}

		try {
			String rs = "";
			if (SystemTool.isWindows()) {
				RuntimeUtil.exec("cmd /c start " + cmd);
			} else {
				rs = RuntimeUtil.execForStr("/bin/sh", "-c", cmd);
			}

			cmd = "<span class='blue'>" + cmd + "</span>";
			if (StrUtil.isEmpty(rs) || rs.contains("已终止进程") //
					|| rs.contains("signal process started") //
					|| rs.toLowerCase().contains("terminated process") //
					|| rs.toLowerCase().contains("starting") //
					|| rs.toLowerCase().contains("stopping")) {
				return renderSuccess(cmd + "<br>" + m.get("confStr.runSuccess") + "<br>" + rs.replace("\n", "<br>"));
			} else {
				return renderSuccess(cmd + "<br>" + m.get("confStr.runFail") + "<br>" + rs.replace("\n", "<br>"));
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			return renderSuccess(m.get("confStr.runFail") + "<br>" + e.getMessage().replace("\n", "<br>"));
		}
	}

 可以看到在runCmd方法内,也变成只能执行注册过的cmd指令。

四 总结和exp

虽然说确实是开发者的疏忽,但是这种错误感觉也是不能苛责程序员,也许这就是java的多生态带来的负面影响吧,组件之间的配合会有一些小瑕疵会引发一系列的安全问题。

exp:NgnixWebUIrce: NginxWEBUI批量扫描工具 (gitee.com)

仓库右侧有打包好的jar文件,标准输入文件格式为fofa中json导出

标准输出为测试网页相应包

本文章/代码/程序仅作为测试可用,禁止使用其做违法的事