某网络智能防御系统文件上传代码审计分析与挖掘

  • A+
所属分类:代码审计 安全漏洞

某网络智能防御系统文件上传代码审计分析与挖掘

前言

前段时间,某网络智能防御系统爆出文件上传漏洞,地址:/xxx/download/uploadfileToPath.htm,简单跟进分析了下,并发现了第二处漏洞,写下本文仅作记录。


分析

基本漏洞信息有了,搜索发现在 com.xxxsoft.common.DownloadController 控制器下的 uploadfileToPath 方法中,定义了文件上传功能,接收参数 uploadpath:


某网络智能防御系统文件上传代码审计分析与挖掘


导致存储目录可自由定义,主要原因是在 uploadFile 方法:


String result = uploadFile(fileItem, (String)null, uploadPath, strFileName);


在其存储文件过程中,直接将存储名带入:


某网络智能防御系统文件上传代码审计分析与挖掘


File fullFile = new File((saveName == null) ? fileName : saveName);


这就导致可以直接利用 uploadpath 参数控制上传路径,从而实现任意文件上传。


挖掘

寻找调用了 uploadFIle 方法的相关方法,发现相同的文件上传问题。

在 com.xxxsoft.xxx.devinfo.controller.NewDevRegistController 的 NewDevRegistController 控制器下定义了一处方法 updateDevUploadinfo:


public void updateDevUploadinfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
log.info("NewDevRegist begin Upload 1...");
logger.info("NewDevRegist begin Upload 2...");
List<FileItem> fileList = new ArrayList<>();
Map<String, String> params = getMultiParamterMap(request, fileList);
String strseparator = System.getProperty("file.separator");
String uploadPath = "../webapps/notifymsg/devreport/";
String linkPath = String.valueOf(strseparator) + "notifymsg" + strseparator + "devreport" + strseparator;
String uidagentid = params.get("uidagentid");
logger.info("uidagentid=" + uidagentid);
if (StringUtils.isNotBlank(uidagentid)) {
Map<String, String> queryparams = new HashMap<>();
logger.info("fileList.size()=" + fileList.size());
for (FileItem fileItem : fileList) {
String strSourceFileName = SysUtils.getSimpleName(fileItem.getName());
String strDirFileName = String.valueOf(uidagentid) + "." + strSourceFileName.substring(strSourceFileName.lastIndexOf(".") + 1);
if ((new File(String.valueOf(uploadPath) + strDirFileName)).exists())
(new File(String.valueOf(uploadPath) + strDirFileName)).delete();
logger.info("+ uploadPath + ",strDirFileName=" + strDirFileName);
String result = uploadFile(fileItem, (String)null, uploadPath, strDirFileName);
logger.info(");
if (StringUtils.isNotBlank(result)) {
logger.info("NewDevRegist Upload success...");
queryparams.put("uidagentid", uidagentid);
queryparams.put("strreportlink", String.valueOf(linkPath) + strDirFileName);
this.newDevRegistDao.updateDevUploadinfo(queryparams);
databaseChanged(new String[] { "Tbl_DevBaseInfo" });
}
}
}


主要体现在第20行,调用了 uploadFile 方法,其中变量 uploadpath 已经被定义为了 ../webapps/notifymsg/devreport/,文件最终存储在该目录下,变量 strDirFileName 为文件存储名。


根据流程走下去,在第9行发现其会接收一个参数 uidagentid:


String uidagentid = params.get("uidagentid");


而变量 strDirFileName 的值为 uidagentid+上传文件的后辍名:


String.valueOf(uidagentid) + "." + strSourceFileName.substring(strSourceFileName.lastIndexOf(".") + 1);


最后由于 uploadFile 方法未进行文件效验操作,导致任意文件上传:


String result = uploadFile(fileItem, (String)null, uploadPath, strDirFileName);


漏洞无损检测方法:POST请求,返回状态200即存在。


某网络智能防御系统文件上传代码审计分析与挖掘

某网络智能防御系统文件上传代码审计分析与挖掘


文末

安全厂商的产品,并不一定安全,甚至可以说很不安全。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: