某网络智能防御系统文件上传代码审计分析与挖掘
前言
前段时间,某网络智能防御系统爆出文件上传漏洞,地址:/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即存在。
文末
安全厂商的产品,并不一定安全,甚至可以说很不安全。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论