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导出
标准输出为测试网页相应包
本文章/代码/程序仅作为测试可用,禁止使用其做违法的事