通杀系统分析 | 某系统前台文件上传漏洞(可Getshell)

通杀系统分析 | 某系统前台文件上传漏洞(可Getshell)

原创 匿名白帽子 WK安全 2025-04-20 00:31

免责声明
  由于传播、利用WK安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负
责,WK安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除
并致歉。谢谢!

背景

本次系统的审计挖掘过程,借助了阿呆安全的审计辅助插件
CodeAuditAssistant

项目地址我贴在了文末,如果不想下载的,可以直接后台回复”
插件
“获取,我也是第一次使用也是借助这个插件快速出货了,文章如有分析不当的地方,欢迎斧正!(漏洞还未上交相关平台,厚码勿怪!)

挖掘过程

拿到该源码之后,查看下项目结构,经典的Jsp+Servlet,路由访问是通过注解实现的,然后登录认证部分采用的是Shiro,既然是使用Shiro,肯定先查看排除认证部分的路由啦!

从文件名搜索:shiro

从内容搜索:anon (如果是class文件,建议先进行反编译再搜索)

经过搜索,也是成功定位到了配置文件

这个系统的代码量、功能点也是蛮多的,anon对应的路径也非常多,一个一个看的话太耗时间,直接上插件

快速定位了几个漏洞点(sink)

文件上传

结合扫描出的漏洞点,我们再结合刚才shiro的排除认证的路由,定位到了一处

这个控制器实现的功能就一个,处理(批量)文件上传的功能

for(int var10 = 0; var10 < var9; ++var10) {    
MultipartFile file = var8[var10];    
String fileName = file.getOriginalFilename();    
String suffix = fileName.substring(fileName.lastIndexOf("."));    
int num = (int)(Math.random() * 1000.0);    
String fileNewName = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + num + suffix.toLowerCase();    
String dataFormat = (new SimpleDateFormat("yyyyMMdd")).format(new Date());    
String savePath = uploadPath + File.separator + dir + File.separator + dataFormat + File.separator + "lab_report";    
File destDir = new File(savePath);    if (!destDir.exists() || !destDir.isDirectory()) {        destDir.mkdirs();    }    File f;    for(f = new File(savePath + File.separator + fileNewName); f.exists(); f = new File(savePath + File.separator + fileNewName)) {        num = (int)(Math.random() * 1000.0);        fileNewName = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + num + suffix;    }    file.transferTo(f);

设置上传的路径

设置个新的文件名

然后调用

file.transferTo(f);

进行上传

构造数据包发起请求

访问上传文件,成功解析

插件项目地址:

https://github.com/springkill

安全交流