freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

JAVA代码审计-天喵商城
pony686 2023-04-23 10:17:43 374827
所属地 北京

一、项目简介

迷你天喵商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天喵数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。

二、项目搭建

1、环境要求

1、Windows 10系统。

2、Java版本为1.8.0_261

3、Mysql版本为5.7。我用的是PHPstudy集成的。

4、IDEA版本随意。

2、项目部署流程

1682215595_644492ab94831636f8284.png!small?1682215594771


然后使用source命令导入数据库。

1682215606_644492b6e77a349e91124.png!small?1682215606418


然后启动环境。

1682215617_644492c11a7cb266371bd.png!small?1682215616468


三、代码审计:

1、第三方组件漏洞

本项目是基于Maven构建的。对于Maven项目,我们首先从pom.xml文件开始审计引入的第三方组件是否存在漏洞版本,然后进一步验证该组件是否存在漏洞点。

本项目引入的组件以及组件版本整理如下。

1682215627_644492cbd5083d70268a6.png!small?1682215627003


2、组件漏洞

通过查看pom.xml文件中引入的第三方插件,且经过搜索查询,发现Fastjson、Log4j、Mybatis引入存在漏洞的版本,我们进一步验证是否存在漏洞。

3、Fastjson命令执行漏洞

本项目引入的Fastjson版本为1.2.58,该版本存在反序列化漏洞。

fastjson简介:

Fastjson是一个Java语言编写的高性能JSON处理器和序列化/反序列化库。它支持Java对象到JSON字符串的转换,以及JSON字符串到Java对象的转换。Fastjson具有以下特点:

  1. 高性能:Fastjson采用了一系列优化策略,如缓存、预编译等,使得它在JSON处理方面具有非常高的性能表现。
  2. 功能丰富:Fastjson支持多种JSON数据格式,如JSON对象、JSON数组、JSON字符串等。同时,它还支持自定义序列化和反序列化器,可以满足各种复杂的业务需求。
  3. 易用性:Fastjson的API设计简洁明了,易于使用。用户可以通过简单的几行代码就可以完成JSON数据的序列化和反序列化操作。
  4. 安全性:Fastjson采用了一系列安全策略,如防止JSON注入攻击等,保证了数据的安全性。

总之,Fastjson是一个功能强大、性能优异、易于使用的JSON处理器和序列化/反序列化库。

3.1 Fastjson反序列化简述:

Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。

攻击者可以传入一个恶意构造的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。


寻找漏洞触发点

全局搜索两个关键字JSON.parseObject()JSON.parse(),发现本项目存在JSON.parseObject()

1682215660_644492ec87537fd071b05.png!small?1682215659871

进入ProductController.java这个文件。

找到了问题代码,发现使用JSON.parseObject()方法反序列化了propertyJson参数。

1682215670_644492f64112a78383a33.png!small?1682215669485

接着我们向上追踪propertyJson参数。

1682215679_644492ffcf48d3fc8ae60.png!small?1682215679240


3.2 漏洞复现:

进入于所有产品-添加一件产品。

1682215689_64449309ac1c82697b98b.png!small?1682215689209


然后使用dnslog进行验证。

1682215698_64449312affbdfa3c2982.png!small?1682215697974


发现收到了回显。

1682215707_6444931b5e1558885b9ff.png!small?1682215706591


也可以使用burp自带的dnslog进行验证。

1682215718_64449326bc4c7f4b174be.png!small?1682215719512

1682215731_644493336fcac17baebc4.png!small?1682215730670


4、Log4j命令执行漏洞

本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞。

4.1 Log4j简述

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

4.2 漏洞简述:

由于Apache Log4j2某些功能存在递归解析,攻击者可在未经身份验证的情况下构造发送带有攻击语句的数据请求包,最终造成在目标服务器上执行任意代码。

其中涉及到的lookup的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。

该组件漏洞主要发生在引入的log4j-core,log4j-api是不存在该问题的。log4j-core是源码,log4j-api是接口。

pom.xml文件引入Log4j组件情况如下图所示,引入了log4j-core,以及版本为2.10.0。

1682215753_64449349b843e52e162ba.png!small?1682215752958


由于SprinBoot默认自带日志记录框架,一般不需要引入。

1682215761_6444935186e75ac2fd607.png!small?1682215760752


寻找漏洞触发点

全局搜索关键字logger。

进入src\main\java\com\xq\tmall\controller\admin\AccountController.java。该代码文件位于Controller层。

1682215771_6444935ba7340c78d21ef.png!small?1682215770984


4.3 漏洞复现:

1682215786_6444936af12b8c0bf4b3b.png!small?1682215786673

1682215802_6444937a99ff3d8c01517.png!small?1682215801762

同样也可以使用burpsuite的dnslog进行漏洞验证。

1682215811_64449383e991661bdab61.png!small?1682215811109


也可以使用JDNI反弹shell。

1682215822_6444938e8bd3427d43014.png!small?1682215821930

5、Mybatis漏洞代码审计

本项目引入的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" />

关键条件被否定,即不存在该漏洞,故忽略。

6、SQL注入漏洞

全局搜索关键字$,确实存在几处order by使用了$拼接SQL语句,因为order by是没办法使用#{}的。

1682215843_644493a3623eaceca93a2.png!small?1682215842698


UserMapper.xml文件为例,进行逆向追踪。

1、双击进入UserMapper.xml文件,第78行存在问题。向上查看根据select id追踪该dao层的代码文件。追踪select函数。

1682215853_644493ad18c54f70607cd.png!small?1682215852273


然后全局搜索之后,进入UserServiceImpl.java文件。

1682215861_644493b5e365197563b75.png!small?1682215861339


getList方法中需要orderUtil参数,我们继续逆向追踪getlist函数。

1682215869_644493bde17ed1fd5fd99.png!small?1682215869139


发现UserController.java使用了该方法。

1682215876_644493c4ebac013adc630.png!small?1682215876421


发现先实例化OrderUitl工具类,该类需要两个参数即,orderyBy和isDesc。点击进入查看该类的代码,该类文件位于src\main\java\com\xq\tmall\util\OrderUtil.java

1682215884_644493ccc06ac3d0c5f6d.png!small?1682215884121


通过注释了解该类用于排序/倒序字段。

1682215892_644493d45c1d20ab270b4.png!small?1682215891589


然后追踪orderBy函数。

1682215902_644493de1a437a759e543.png!small?1682215901343


然后去定位功能点。

1682215910_644493e62eec3b1a83d25.png!small?1682215909477


6.1 漏洞复现:

1682215917_644493edaa700f655f555.png!small?16822159169811682215930_644493fa4c8dc16227429.png!small?1682215929590
使用sqlmap验证。

1682215939_64449403a3fa0809ae814.png!small?1682215939246

7、 XSS漏洞

我们去看filter层是否存在XSS过滤代码。发现filter层并没有关于防护XSS的代码。

1682215948_6444940c21e3bf1a633b4.png!small?1682215947484

经过搜索之后,我们发现filter层并没有对xss漏洞进行防护。

1682215956_644494140685adf33de5e.png!small?1682215955521

7.1漏洞复现:

直接在登录框进弹xss。

1682215964_6444941c02834a3907227.png!small?1682215963417

然后进行我的账户处也可以弹框。

1682215971_64449423e94da5bcb48e8.png!small?1682215971161

8、任意文件上传漏洞

我们先去查看一下引入的相关依赖。

1682215982_6444942e00fe587be1c42.png!small?1682215981443

这次,我们先关注本项目的管理员头像上传文件上传功能,进行代码审计。

代码分析:

我们通过功能点定位到源代码。

1682215990_64449436b6a0661170851.png!small?1682215989936

首先在第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路径中,上传成功后,会返回该文件的文件名。

1682216003_6444944331b1e09ee84f8.png!small?1682216002410

8.1、漏洞复现:

1682216011_6444944b600dad843b76f.png!small?1682216010846

然后获取文件路径。

/tmall/res/images/admin/loginPage/default_profile_picture-128x128.png

/tmall/res/images/item/adminProfilePicture/c23e0597-2f15-4d3b-ac9c-153697362b82.jsp

1682216020_64449454de5131b73eb84.png!small?1682216020233

成功getshell。

1682216028_6444945c72b0f0d0e645a.png!small?1682216027714

REF:

https://wx.zsxq.com/dweb2/index/topic_detail/418584815822128

https://cbatl.gitee.io/2022/03/25/minitmallshop/

# 渗透测试 # 网络安全 # web安全 # 数据安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 pony686 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
红队攻防演练
相关推荐
pony686 LV.6
公众号:亿人安全
  • 65 文章数
  • 429 关注者
记一次域渗透实战之从边界突破到域内ADCS-9漏洞利用
2025-04-09
Java安全红队面试详解 | servlet 内存马原理分析和POC编写和查杀
2025-03-25
记一次域内渗透实战之Cragty
2025-03-10
文章目录