迷你天喵商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天喵数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。
1、Windows 10
系统。
2、Java版本为1.8.0_261
。
3、Mysql版本为5.7
。我用的是PHPstudy集成的。
4、IDEA版本随意。
然后使用source命令导入数据库。
然后启动环境。
本项目是基于Maven构建的。对于Maven项目,我们首先从pom.xml文件开始审计引入的第三方组件是否存在漏洞版本,然后进一步验证该组件是否存在漏洞点。
本项目引入的组件以及组件版本整理如下。
通过查看pom.xml
文件中引入的第三方插件,且经过搜索查询,发现Fastjson、Log4j、Mybatis引入存在漏洞的版本,我们进一步验证是否存在漏洞。
本项目引入的Fastjson版本为1.2.58,该版本存在反序列化漏洞。
fastjson简介:
Fastjson是一个Java语言编写的高性能JSON处理器和序列化/反序列化库。它支持Java对象到JSON字符串的转换,以及JSON字符串到Java对象的转换。Fastjson具有以下特点:
总之,Fastjson是一个功能强大、性能优异、易于使用的JSON处理器和序列化/反序列化库。
3.1 Fastjson反序列化简述:
Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。
攻击者可以传入一个恶意构造的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。
寻找漏洞触发点
全局搜索两个关键字JSON.parseObject()
和JSON.parse()
,发现本项目存在JSON.parseObject()
。
进入ProductController.java这个文件。
找到了问题代码,发现使用JSON.parseObject()方法反序列化了propertyJson参数。
接着我们向上追踪propertyJson参数。
进入于所有产品-添加一件产品。
然后使用dnslog进行验证。
发现收到了回显。
也可以使用burp自带的dnslog进行验证。
本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞。
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
由于Apache Log4j2某些功能存在递归解析,攻击者可在未经身份验证的情况下构造发送带有攻击语句的数据请求包,最终造成在目标服务器上执行任意代码。
其中涉及到的lookup的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。
该组件漏洞主要发生在引入的log4j-core,log4j-api是不存在该问题的。log4j-core是源码,log4j-api是接口。
pom.xml文件引入Log4j组件情况如下图所示,引入了log4j-core,以及版本为2.10.0。
由于SprinBoot默认自带日志记录框架,一般不需要引入。
寻找漏洞触发点
全局搜索关键字logger。
进入src\main\java\com\xq\tmall\controller\admin\AccountController.java。该代码文件位于Controller层。
同样也可以使用burpsuite的dnslog进行漏洞验证。
也可以使用JDNI反弹shell。
本项目引入的Mybatis版本为3.5.1,该版本存在远程命令执行漏洞。
Mybatis < 3.5.6存在远程代码执行漏洞,CVE编号为CVE-2020-26945。
在满足以下三个条件的时候,攻击者可以触发远程代码执行:
1、用户启用了内置的二级缓存(默认不开启,需手动配置)
2、用户未设置JEP-290过滤器
3、攻击者找到了一种修改私有Map字段条目的方法,即修改org.apache.ibatis.cache.impl.PerpetualCache.cache有效的缓存密钥
所谓二级缓存,也就是将查询结果放到缓存中,下次查询时结果相同的话直接从缓存中获取结果。
经过探索src\main\resources\mybatis下面的配置文件,本项目并未开启二级缓存。
Mybatis开启二级缓存语句
<setting name = "cacheEnabled" value = "true" />
关键条件被否定,即不存在该漏洞,故忽略。
全局搜索关键字$,确实存在几处order by使用了$拼接SQL语句,因为order by是没办法使用#{}的。
以UserMapper.xml
文件为例,进行逆向追踪。
1、双击进入UserMapper.xml
文件,第78行存在问题。向上查看根据select id
追踪该dao层的代码文件。追踪select函数。
然后全局搜索之后,进入UserServiceImpl.java文件。
getList方法中需要orderUtil参数,我们继续逆向追踪getlist函数。
发现UserController.java使用了该方法。
发现先实例化OrderUitl工具类,该类需要两个参数即,orderyBy和isDesc。点击进入查看该类的代码,该类文件位于src\main\java\com\xq\tmall\util\OrderUtil.java
通过注释了解该类用于排序/倒序字段。
然后追踪orderBy函数。
然后去定位功能点。
使用sqlmap验证。
我们去看filter层是否存在XSS过滤代码。发现filter层并没有关于防护XSS的代码。
经过搜索之后,我们发现filter层并没有对xss漏洞进行防护。
直接在登录框进弹xss。
然后进行我的账户处也可以弹框。
我们先去查看一下引入的相关依赖。
这次,我们先关注本项目的管理员头像上传文件上传功能,进行代码审计。
代码分析:
我们通过功能点定位到源代码。
首先在第62行,通过@RequestMapping注解,得到一些信息。
1.上传接口为admin/uploadAdminHeadImage(如果找不到前端页面,可以直接向该接口发送构造好的数据包)
2.上传方法为POST
3.produces = "application/json;charset=UTF-8,定义了返回格式为JSON
关键信息为接口地址
发现uploadAdminHeadImage方法接受绑定的file参数和session参数,我们查看file参数。然后接着进入第64行,获取到文件名称后赋值给originalFileName。然后获取文件后缀名,先看括号内originalFileName.lastIndexOf('.'),获取originalFileName字符串最后一次出现.的地方。然后通过substring截取子串的方式得到文件后缀名,赋值给变量extension。发现传入.jsp.jsp.jsp这种形式后缀名,最后得到的结果也只有.jsp。第69行,随机命名文件,采用UUID+extension方式,并赋值给fileName参数。第71行,获取上传路径,赋值给filePath。第76到80行,上传文件关键代码,创建文件流将文件上传到filePath路径中,上传成功后,会返回该文件的文件名。
然后获取文件路径。
/tmall/res/images/admin/loginPage/default_profile_picture-128x128.png
/tmall/res/images/item/adminProfilePicture/c23e0597-2f15-4d3b-ac9c-153697362b82.jsp
成功getshell。
REF:
https://wx.zsxq.com/dweb2/index/topic_detail/418584815822128
https://cbatl.gitee.io/2022/03/25/minitmallshop/