本篇为代码审计系列文件上传基础理论篇第二篇,看完本篇你将掌握关于文件上传漏洞的代码视角原理剖析、基础挖掘漏洞核心能力,看完如有技术错误欢迎评论区指正。
-
漏洞原理
-
业务视角DEMO代码
-
漏洞校验DEMO代码
-
某CMS管理系统文件上传分析
内部学员投稿。
学代码审计就找闪石星曜CyberSecurity。
详情可点击下方链接了解。
《JavaWeb代码审计企业级项目实战》课程2.0升级版,新增10节实战课!依旧低至499,加量不加价!招生!
另外,我公开了一份面向零基础小白的 JavaWeb代码审计入门文档。
欢迎一起来学习,感觉不错别忘了分享给身边的好哥们。
https://www.yuque.com/power7089/ekvyga
文件上传
一
漏洞原理
1.1业务原理视⻆
用户使用电脑浏览器操作企业Web站点某些功能的背后逻辑业务逻辑是在文件上传功能,例如:注册上传头像、后台中模版文件上传等。企业用户使用的是正常的文件上传,恶意用户使用恶意文件对站点进行攻击及后续渗透。用户会对上传的文件进行后续业务使用。
1.2漏洞原理视⻆
文件上传漏洞是与服务器进行控制和通信前的一种攻击方式。
相关技战术:初始访问阶段 | QT1190.012 文件上传,主要是在文件上传代码逻辑过程中未对文件后缀进行校验或校验逻辑不足被绕过,导致恶意类型文件上传一般属于Websehll类型文件持久化 | T1505.003 Web 命令执行环境
二
业务视⻆DEMO代码
常见文件上传内置方法有MultipartFile或ServletFileUpload,文件上传功能流程如下:
-
获取文件类型且内容不为空
-
校验文件类型
-
设置保存文件路径与文件名
-
保存文件
2.1Multipartfile 方式文件上传
MultipartFile 是 Spring 框架中的一个接口,处理文件上传。 它可以处理从表单中上传的文件,并提供了访问文件名称、大小、类型以及内容等信息的方法。public class multipartfileController {@Value("${file.upload.path}")private String path;@GetMapping("/")public String uploadPage() {return "upload";}@PostMapping("/upload")@ResponseBodypublicStringcreate(@RequestPartMultipartFile file) throws IOException {String fileName = file.getOriginalFilename();String filePath = path + fileName;File dest = new File(filePath);Files.copy(file.getInputStream(), dest.toPath());return"Uploadfilesuccess:"+dest.getAbsolutePath();}
2.2ServletFileUpload 方式文件上传
ServletFileUpload方式文件上传依赖 commons-fileupload 组件。解析出FileItem对象。每个FileItem都有我们可能所需的属性:获contentType,获取原本的文件名,获取文件大小,获取FiledName
publicclassFileUploadServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponse resp)throws ServletException, IOException {try {StringrealPath=this.getServletContext().getRealPath("/upload");String tempPath = "C:\Users\powerful\Desktop";File f = new File(realPath);if(!f.exists()&&!f.isDirectory())System.out.println("目录或文件不存在! 创建目标目录。");f.mkdir();}DiskFileItemFactory factory = new DiskFileItemFactory();factory.setRepository(f1);ServletFileUpload upload = new ServletFileUpload(factory);if(ServletFileUpload.isMultipartContent(req)){System.out.println("不是上传文件,终止");return;}
三
漏洞校验DEMO代码
针对业务代码两种方式做上传操作,对应也有不同的审计“关键词”。文件上传漏洞限制:
-
Web容器限制:部署方式War包部署支持Jsp,Jar包部署不支持
-
项目限制:Pom.xml中引入Jsp依赖
-
文件类型限制:项目文件类型校验
-
文件路径限制:存储路径路径可控涉及是否能解析JSP
3.1文件类型限制
3.1.1 获取文件文件后缀名:注意获取位置 StringSuffix=fileName.substring(fileName.lastIndexOf("."));
3.1.2 文件后缀名白名单内容:
String[] SuffixList = {".jpg", ".png", ".jpeg", ".gif"};
3.2文件路径限制
文件保存路径及保存文件名称逻辑:以下路径可解析JSP文件备注:在获取文件名后,大多会进行路径拼接操作。在这里我们可以检查拼接路径是有相关防护,如果没有限制 ../ 那么极有可能存在目录穿越漏洞。
-
Web根目录
-
WEB-INF目录
-
Web.xml配置其他路径
四
实战审计案例
-
文件上传ZIP等压缩文件,后端代码解压后,未对解压后文件内容做校验,直接写入Webshell,利用条件参考Webshell
-
文件上传Html存在2个前提条件即可,使用Html可以构造XSS,相当于存储型XSS利用条件如下:
-
上传文件类型可控
-
Html文件内容过滤
-
文件上传Webshell漏洞利用存在两个前提条件,代码审计目标也是如此。利用条件如下:
-
Web容器使用War包部署
-
项目可解析JSP
-
存在文件上传功能
-
上传文件类型可控
-
文件保存路径可解析JSP
4.1某CMS管理系统文件上传分析
4.1.1Pom.xml文件分析
可关键字搜索“javax”即可,如下项目可解析JSP:
4.1.2文件上传功能
文件上传可关键字搜索全文搜索如下:
`` File`` FileUpload`` FileUploadBase`` FileItemIteratorImpl`` FileItemStreamImpl`` FileUtils`` UploadHandleServlet`` FileLoadServlet`` FileOutputStream`` DiskFileItemFactory`` MultipartRequestEntity`` MultipartFile`` com.oreilly.servlet.MultipartRequest
4.1.3上传文件类型校验逻辑
未发现文件类型限制代码,直接发包测试即可
4.1.4文件上传漏洞测试
-
前端文件html上传表单构造
-
BurpSuite测试
发包测试成功,但返回信息错误Error,上传失败
-
后端代码注释判断fileType.contains(ext)判断文件格式导致上传错误
跟进发现是由于发包时fileType值为空导致
增加fileType类型为"jspx"发现返回了URL
访问URL发现上传并解析成功
END
原文始发于微信公众号(闪石星曜CyberSecurity):JavaWeb代码审计 | 文件上传基础篇
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论