『代码审计』记一次 Java 代码审计
发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370
日期:2023-06-12作者:Corl7介绍:记录一次对某后台管理系统的审计,使用的框架为 SpringBoot+Mybatis。 0x00 前言 最近在学习代码审计,为了写一篇关于代码审计的文章,找了许多源码并在本地搭建,但是大多数都不适合写文章,不是漏洞太少就是没有新颖点。于是就找到了下面的这个系统,在互联网上也见过不少,就开始了对该系统的审计,个人也是刚入门,大佬勿喷。 0x01 Shiro反序列化 通过查看引入的jar包,发现存在Shiro,版本为1.2.3,该版本存在反序列化漏洞,并且在Shiro的1.2.4之前版本中使用的是默认密钥KPH+blxk5D2deZilxcaaaA==。 查看Shiro配置文件,设置了Cookie名称为rememberMeTest。 设置了过滤器,使用/**拦截了所有请求,是不存在Shiro权限绕过的漏洞的。 直接上工具,进行漏洞验证,设置关键字为rememberMeTest,密钥为KPH+blxk5D2deZilxcaaaA==,爆破利用链及回显之后,成功执行命令。 0x02 文件上传漏洞 使用MultipartFile关键字,进行全局搜索,发现在DeveFileInfoController中,存在文件上传的方法,点进行进行查看。 先看upload接口,先判断文件是否为空,然后获取文件名,然后截取文件名最后一个.之后的内容为后缀名,但是没有使用到,然后定义了文件上传路径,在拼接路径名和文件名,在调用file.transferTo方法进行上传文件,因此是存在任意文件上传漏洞的。 查看文件头,确定了最终路由为/deve/deveFileInfo/upload。 由于Shiro框架,并且配置了过滤器,因此直接上传是不可能成功。伪造一个上传数据包,使用登录成功后的Cookie,直接上传成功。 在E:/test目录中存在上传的文件,因为该项目为SpringBoot项目,默认并不解析jsp,而且上传路径也并非网站目录,因此该上传并没有什么利用价值。 在看另外一个上传点,这里通过断点的方式启动,首先获取上传路径,这里获取到的上传路径还是为E:/test目录,如果不存在的话进行创建,然后接收前端file参数传过来的内容,在进行获取后缀名,在通过UUID拼接.和后缀名,最后通过字节流的方式进行保存,也没有对后缀进行校验,因此也存在任意文件上传。 构造数据包,上传成功。 0x03 目录遍历 在看Controller层的时候,发现了一个查询文件列表的方法,这里首先使用deveExpResourceService.queryFileList方法获取文件列表,然后创建了DataGrid对象,将查询到的文件内容和文件总数赋值给DataGrid对象,然后返回DataGrid对象。 进入到deveExpResourceService查看queryFileList方法,如果dirpath是否是空,则执行File.listRoots,否则执行dir.listFiles方法,进行查询文件列表,最后进行返回文件列表,由于path参数可控,并且绑定读取文件列表的目录,于是存在目录遍历漏洞。 路由为/deve/deveExpResource/listInit。 构造请求,可获取任意文件夹中的文件列表。 0x04 任意文件下载 全局搜索download,发现了一个下载文件的方法,简单通一下源码,将paths以逗号进行分割保存到pathArr数组中,然后对数组中的第一个值进行创建File对象。 然后判断是文件还是文件夹,如果是文件的话,downLoadPath的值就为文件的路径,如果是文件夹的话,先获取FileDownloadPath的值,即为E:/test,使用downLoadPath拼接UUID和.zip作为新的downLoadPath,使用for循环的方式读取文件夹中的文件,最后使用zip的方法进行压缩。 如果是文件的话,通过download方法进行下载。 请求路由为/deve/deveExpResource/download,直接构造请求,成功读取C:/windows/win.ini文件。 0x05 总结 这套系统还是存在很多漏洞的,还有任意目录上传文件漏洞、任意文件删除漏洞、XSS等,这里就不再写了。总体来说,这套比较适合新手练手吧,并没有写过多的方法,也没有写过滤器对前端传过来的参数进行过滤。 免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。