『代码审计』记一次 Java 代码审计

admin 2023年6月13日10:50:52评论99 views字数 2103阅读7分0秒阅读模式
『代码审计』记一次 Java 代码审计

点击蓝字

关注我们


日期:2023-06-12
作者:Corl7
介绍:记录一次对某后台管理系统的审计,使用的框架为 SpringBoot+Mybatis

0x00 前言

最近在学习代码审计,为了写一篇关于代码审计的文章,找了许多源码并在本地搭建,但是大多数都不适合写文章,不是漏洞太少就是没有新颖点。于是就找到了下面的这个系统,在互联网上也见过不少,就开始了对该系统的审计,个人也是刚入门,大佬勿喷。

『代码审计』记一次 Java 代码审计

0x01 Shiro反序列化

通过查看引入的jar包,发现存在Shiro,版本为1.2.3,该版本存在反序列化漏洞,并且在Shiro1.2.4之前版本中使用的是默认密钥KPH+blxk5D2deZilxcaaaA==

『代码审计』记一次 Java 代码审计

查看Shiro配置文件,设置了Cookie名称为rememberMeTest

『代码审计』记一次 Java 代码审计

设置了过滤器,使用/**拦截了所有请求,是不存在Shiro权限绕过的漏洞的。

『代码审计』记一次 Java 代码审计

直接上工具,进行漏洞验证,设置关键字为rememberMeTest,密钥为KPH+blxk5D2deZilxcaaaA==,爆破利用链及回显之后,成功执行命令。

『代码审计』记一次 Java 代码审计

0x02 文件上传漏洞

使用MultipartFile关键字,进行全局搜索,发现在DeveFileInfoController中,存在文件上传的方法,点进行进行查看。

『代码审计』记一次 Java 代码审计

先看upload接口,先判断文件是否为空,然后获取文件名,然后截取文件名最后一个.之后的内容为后缀名,但是没有使用到,然后定义了文件上传路径,在拼接路径名和文件名,在调用file.transferTo方法进行上传文件,因此是存在任意文件上传漏洞的。

『代码审计』记一次 Java 代码审计

查看文件头,确定了最终路由为/deve/deveFileInfo/upload

『代码审计』记一次 Java 代码审计

由于Shiro框架,并且配置了过滤器,因此直接上传是不可能成功。伪造一个上传数据包,使用登录成功后的Cookie,直接上传成功。

『代码审计』记一次 Java 代码审计

E:/test目录中存在上传的文件,因为该项目为SpringBoot项目,默认并不解析jsp,而且上传路径也并非网站目录,因此该上传并没有什么利用价值。

『代码审计』记一次 Java 代码审计

在看另外一个上传点,这里通过断点的方式启动,首先获取上传路径,这里获取到的上传路径还是为E:/test目录,如果不存在的话进行创建,然后接收前端file参数传过来的内容,在进行获取后缀名,在通过UUID拼接.和后缀名,最后通过字节流的方式进行保存,也没有对后缀进行校验,因此也存在任意文件上传。

『代码审计』记一次 Java 代码审计

『代码审计』记一次 Java 代码审计

构造数据包,上传成功。

『代码审计』记一次 Java 代码审计

0x03 目录遍历

在看Controller层的时候,发现了一个查询文件列表的方法,这里首先使用deveExpResourceService.queryFileList方法获取文件列表,然后创建了DataGrid对象,将查询到的文件内容和文件总数赋值给DataGrid对象,然后返回DataGrid对象。

『代码审计』记一次 Java 代码审计

进入到deveExpResourceService查看queryFileList方法,如果dirpath是否是空,则执行File.listRoots,否则执行dir.listFiles方法,进行查询文件列表,最后进行返回文件列表,由于path参数可控,并且绑定读取文件列表的目录,于是存在目录遍历漏洞。

『代码审计』记一次 Java 代码审计

路由为/deve/deveExpResource/listInit

『代码审计』记一次 Java 代码审计

构造请求,可获取任意文件夹中的文件列表。

『代码审计』记一次 Java 代码审计

0x04 任意文件下载

全局搜索download,发现了一个下载文件的方法,简单通一下源码,将paths以逗号进行分割保存到pathArr数组中,然后对数组中的第一个值进行创建File对象。

然后判断是文件还是文件夹,如果是文件的话,downLoadPath的值就为文件的路径,如果是文件夹的话,先获取FileDownloadPath的值,即为E:/test,使用downLoadPath拼接UUID和.zip作为新的downLoadPath,使用for循环的方式读取文件夹中的文件,最后使用zip的方法进行压缩。

如果是文件的话,通过download方法进行下载。

『代码审计』记一次 Java 代码审计

『代码审计』记一次 Java 代码审计

请求路由为/deve/deveExpResource/download,直接构造请求,成功读取C:/windows/win.ini文件。

『代码审计』记一次 Java 代码审计

0x05 总结

这套系统还是存在很多漏洞的,还有任意目录上传文件漏洞、任意文件删除漏洞、XSS等,这里就不再写了。总体来说,这套比较适合新手练手吧,并没有写过多的方法,也没有写过滤器对前端传过来的参数进行过滤。

免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。


点此亲启

ABOUT US

宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。

团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。

对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。

『代码审计』记一次 Java 代码审计

原文始发于微信公众号(宸极实验室):『代码审计』记一次 Java 代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月13日10:50:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『代码审计』记一次 Java 代码审计http://cn-sec.com/archives/1800232.html

发表评论

匿名网友 填写信息