0x01 技术文章仅供参考学习,请勿使用本文中所提供的任何技术信息或代码工具进行非法测试和违法行为。若使用者利用本文中技术信息或代码工具对任何计算机系统造成的任何直接或者间接的后果及损失,均由使用者本人负责。本文所提供的技术信息或代码工具仅供于学习,一切不良后果与文章作者无关。使用者应该遵守法律法规,并尊重他人的合法权益。
0x02 代码分析
文件上传一些常见的审计参数:
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
com.oreilly.servlet.MultipartRequest
漏洞位置出现于kqFile.mob接口,在全局搜索kqfile.mob接口并追进代码中进行分析。
阅读代码进行漏洞分析使用RequestMapping请求获取method=uploadFile然后boby回显在界面,随后获取fj_file上传请求。然后使用getParameter("fileName");从请求中获取名为"fileName"的参数,并将其赋值给fileName变量。setOperatTime这里表示使用当前日期和时间。
(
params = {"method=uploadFile"}
)
public Object upload(HttpServletRequest request, HttpServletResponse response, (value = "fj_file",required = false) MultipartFile fj_file) {
InfResultVO ir = new InfResultVO();
String fileName = request.getParameter("fileName");
PtFjkView ptFjk = new PtFjkView();
ptFjk.setOperator("接口处理打卡图片");
ptFjk.setOperatTime(new Date());
接着往下过,if判断是否有上传文件,如果fj_file
为空会返回没有上传文件。然后抛出一个RuntimeException
异常。如果fj_file
不为空就继续执行。检查fileName
是否为空或者为空白字符串。如果fileName
为空或为空白字符串,则获取上传文件的原始文件名,并通过SecurityUtil.cleanXSS
方法进行XSS过滤。(当然这个xss过滤并没有起到什么作用)
try {
if (fj_file == null) {
throw new RuntimeException("未上传文件");
} else {
InputStream inputStream = fj_file.getInputStream();
if (StringUtils.isBlank(fileName)) {
fileName = SecurityUtil.cleanXSS(fj_file.getOriginalFilename());
}
随后调用FileUtil.generateFolder
方法生成文件保存路径wjlj
该方法使用服务器目录中的文件名、文件夹类型("normalfolder")和操作时间生成路径。使用ptFjk.setSavePath(wjlj)
设置savePath
属性为生成的文件路径 wjlj。接着获取文件保存的真实路径
realPath
。
String wjlj = FileUtil.generateFolder(ServerUtils.getServerRoot(), fileName, "normalfolder", ptFjk.getOperatTime());
ptFjk.setFileName(fileName);
File file = new File(wjlj);
FileUtils.copyInputStreamToFile(inputStream, file);
ptFjk.setFileSize(new BigDecimal(file.length()));
ptFjk.setSavePath(wjlj);
String realPath = SystemConfigFactory.getConfigBean().getFileSavePath();
if (wjlj.replace(realPath, "").indexOf("/") > 0) {
ptFjk.setHerfUrl(File.separator + wjlj.replace(realPath, ""));
} else {
ptFjk.setHerfUrl(wjlj.replace(realPath, ""));
}
其实分析完上面的代码基本就可以判断是存在任意文件上传漏的了而且没有校验没有白名单黑名单等等。后面的就是使用UUID生成一个随机的字符串,使用InUse
属性为1
表示该文件记录当前正在使用等等。
ptFjk.setId(UUID.randomUUID().toString());
ptFjk.setInUse("1");
IPtFjkService ptFjkService = (IPtFjkService)BeanTool.getBean("ptFjkService");
ptFjkService.insertPtFjk(ptFjk);
ir.setResult(ptFjk.getHerfUrl());
return ir;
0x03漏洞补丁
在漏洞爆出来之后厂商修复代码的速度很快且暴力省事。为什么说暴力省事呢?因为厂商直接把method=uploadFile接口处的代码删掉了不要这个功能点了,而且把kqfile.mob接口换成了kqfile.mc后台访问接口。
原文始发于微信公众号(Kokoxca安全):红海云ehr任意文件上传分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论