文章目录
0. 前言
我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。
我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该是从0开始找到漏洞所在,包括思路!
所以这里不管有没有漏洞,我都会把审计过程写出来,因此篇幅会很长,但我认为这样对你会很有帮助。
知其然亦知所以然。
由于篇幅较长,因此我会分几篇进行,本篇是整个系列的第3篇,讲解1个内容:
- 文件上传漏洞审计
本系列文章:
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
搭建好环境,确定好项目结构之后,按我思路是应该审计项目所使用框架漏洞的,这里关于框架漏洞就放最后篇章来说了,我们先了解下基础漏洞的审计~
文章中有错误点,或者思路上有什么问题的,欢迎师傅们留言指出~
1. 文件上传代码审计【有1处】
文件上传漏洞我们需要着重关注的是文件在被java代码解析到保存下来之间有无验证过滤,因此什么样的上传方式,什么样的保存方式都不重要,大家着重关注代码对文件的验证过滤手段即可。
文件上传代码审计常搜索的关键字如下:
file
upload
write
fileName
filePath
getPart
FileOutputStream
transferTo
getRealPath
FileItem
ServletFileUpload
DiskFileItemFactory
....
1.1 可疑点1【无漏洞】
1.1.1 直接搜索upload关键字
1.1.2 选择第一个,点进去分析一下
类名为UeditorAction
可以在当前页面搜索upload关键字,也可以同时参考该类的所有方法名称。
大概看一下,四个方法的写法是差不多的:
- getFile()方法的第2个参数不太相同,通过参数名称uploadPath可以大概判断出来,这个参数表示的是文件上传路径,也就是说调用不同的方法会保存到不同的目录。
通过下方的msg.put("url", "/upload/image/" + file.getFileName())
也可以大体确定这一点;
当然msg.put不是用来保存文件用的,只是返回的信息而已。
以uploadImage()
方法为例进行分析,可以看到,这个方法内部与保存文件相关的代码就前面两行(后面的都是关于返回的消息相关了),即
UploadFile file = this.getFile("file", "image");
file.getFile().createNewFile();
我们先分析下this.getFile()
方法
1.1.3 分析this.getFile()方法
点击进入看一下:
getFile()
方法,首先调用了getFiles(uploadPath)
,跟进之下:就在上面
可以看到这里先做了个判断,判断request
对象是否是MultipartRequest
类型的对象,如果不是则创建一个新的MultipartRequest