某商城系统的Log4j2shell的探索之路
1
项目安装
迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。
A、基础环境部署
1、Java环境部署
Java版本如下图所示:
JDK下载链接:
https://www.oracle.com/java/technologies/downloads/#java8-windows
安装步骤操作简单,只需下一步即可,不过多赘述。
2、Maven环境部署
关于Maven环境部署与安装,可参考下面的文章,安装最新版即可。
https://www.runoob.com/maven/maven-setup.html
在IDEA中内置了Maven,对于我们来说足够用了。
Maven加速配置
配置国内源下载一些依赖组件会非常快,但会有极个别情况,有些组件使用国内源无法下载,则需要再更改配置,大家留有印象就好。
①、访问c:\Users\当前用户\.m2
目录,当前用户文件夹需要根据当前用户来定,如下图所示:
②、打开settings.xml
文件,复制粘贴以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<localRepository>C:\Users\当前用户\.m2\repository</localRepository>
<servers>
</servers>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
注意代码中的当前用户
该位置路径应与你当前用户一致。
3、Mysql环境部署
个人偏好于使用phpstudy,它集成了很多常用组件,如apache,mysql等。作为练习,方便至极,一键启动即可使用。
官方下载链接:
https://www.xp.cn/
下载完成后,双击进入软件。进入首页处,选择mysql套件,点击启动即可,如下图所示:
点击左侧数据库
,可以对数据库进行密码修改
操作。
4、IDEA
https://www.jetbrains.com/zh-cn/idea/download/#section=windows
B、环境搭建
1、Windows 10
系统。
2、Java版本为1.8.0_261
。
3、Mysql版本为5.7
。我用的是PHPstudy集成的。
4、IDEA版本随意。
1、环境要求
1、Windows 10
系统。
2、Java版本为1.8.0_261
。
3、Mysql版本为5.7
。我用的是PHPstudy集成的。
4、IDEA版本随意。
2、项目部署流程
①、命令行进入Mysql后,创建数据库名为tmalldemodb
,并切换使用该数据库,如下图所示:
②、将项目文件中的/sqls/tmalldemodb.sql
的数据导入到tmalldemodb
数据库,注意导入路径中应使用正斜杠/
,如下图所示:
③、使用IDEA打开本项目,等待Maven自动加载依赖项,如果时间较长需要自行配置Maven加速源。几个现象表明项目部署成功。pom.xml
文件无报错,项目代码已编译为class
,Run/Debug Configurations...
处显示可以运行。如下图所示:
④、修改src/main/resouces/application.properties
配置文件内容,具体如下图所示:
⑤、点击启动Run/Debug Configurations...
本项目,启动成功如下图所示:
2
代码审计漏洞挖掘
“环境部署完成后,
通过代码审计深入发现安全漏洞”
1、第三方组件漏洞审计
本项目是基于Maven构建的。对于Maven项目,我们首先从pom.xml
文件开始审计引入的第三方组件是否存在漏洞版本,然后进一步验证该组件是否存在漏洞点。
本项目引入的组件以及组件版本整理如下。
组件名称 | 组件版本 |
---|---|
SpringBoot | 2.1.6.RELEASE |
Fastjson | 1.2.58 |
Mysql | 5.1.47 |
Druid | 1.1.19 |
Taglibs | 1.2.5 |
Mybatis | 3.5.1 |
Log4j | 2.10.0 |
整理完成后,如何确定该组件版本存在漏洞?最简单的方法无疑于从搜索引擎进行搜索,比如关键字:Fastjson 漏洞
。进一步可从组件官网,CVE,CNVD,CNNVD等网站查询。
2、组件漏洞代码审计
通过查看pom.xml
文件中引入的第三方插件,且经过搜索查询,发现Fastjson、Log4j、Mybatis引入存在漏洞的版本,我们进一步验证是否存在漏洞。
2.1、Fastjson漏洞代码审计
本项目引入的Fastjson版本为1.2.58,该版本存在反序列化漏洞。我们进一步探索一番。
2.1.1、Fastjson简述
Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对象之间相互转换。
两个主要接口是JSON.toJSONString和JSON.parseObject/JSON.parse,分别实现序列化和反序列化操作。
2.1.1、Fastjson反序列化简述
Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。
攻击者可以传入一个恶意构造的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。
2.1.2、寻找漏洞触发点
已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。我们关注两个函数JSON.parse()
和JSON.parseObject()
。
全局搜索两个关键字,发现本项目存在JSON.parseObject()
,如下图所示:
双击进入ProductController.java
文件,问题代码出现在了第151行
,使用JSON.parseObject()
方法反序列化了propertyJson
参数,我们向上追踪propertyJson
参数,该参数是添加产品信息
接口中产品属性JSON
字段。如下图所示:
通过代码审计,找到了Fastjson反序列化漏洞点。我们通过渗透测试进一步验证。
2.2、Log4j漏洞代码审计
本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞。我们进一步探索一下。
2.2.1、Log4j简述
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2.2.2、Log4j远程代码执行漏洞(CVE-2021-44228)简述
由于Apache Log4j2某些功能存在递归解析,攻击者可在未经身份验证的情况下构造发送带有攻击语句的数据请求包,最终造成在目标服务器上执行任意代码。
其中涉及到的lookup的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。
该组件漏洞主要发生在引入的log4j-core
,log4j-api
是不存在该问题的。log4j-core
是源码,log4j-api
是接口。
pom.xml
文件引入Log4j组件情况如下图所示,引入了log4j-core
,以及版本为2.10.0
。基本确定存在问题,验证还需进一步寻找能触发的漏洞点。
由于SprinBoot默认自带日志记录框架,一般不需要引入,在pom.xml
中剔除出去。如下图所示:
2.2.3、寻找漏洞触发点
全局搜索关键字logger
,如下图可以看出,本项目使用logger.info
级别记录日志方式居多。
大多漏洞分析文章使用logger.error
去做调试。两者区别在于默认记录信息不同。这块内容留个作业,大家自行搜索下,不难理解。
经过一番探索,发现有几处日志记录拼接了变量参数,让我们看看这些参数是否是从前端传来的。如下图所示:
双击即可进入该代码文件,该文件位于src\main\java\com\xq\tmall\controller\admin\AccountController.java
。该代码文件位于Controller层,主要用于和视图交互,处理用户输入的数据等操作。
关键代码如下图所示:
对上述代码进行分析。触发漏洞点的代码为65行的logger.info("获取图片原始文件名:{}", originalFileName);
。向上追踪,发现通过file.getOriginalFilename();
获取file的文件名后赋值给originalFileName
。在向上追踪,file参数来自admin/uploadAdminHeadImage
接口,通过注释我们可以知道此处为管理员头像上传
功能。
总结来说:访问管理员头像上传功能,将文件名改为攻击语句,即可触发Log4j漏洞。
关于该漏洞验证,需跳转到四、渗透测试漏洞挖掘与验证
部分学习,从实战渗透测试角度进行攻击验证。
3
渗透测试漏洞验证
“在代码审计阶段发现漏洞后,
通过渗透测试进一步验证。”
2.4、SQL注入漏洞验证
从代码审计处,我们发现了存在SQL注入的漏洞功能点用户管理-点击下一页按钮
,会向后端发送查询数据包,其中存在漏洞参数orderBy
。
现在,我们从渗透测试角度,对该漏洞进行验证。
首先,我们访问该功能,再点击下一页的时候,使用BurpSuite抓取数据包,如下图所示:
用户管理处测试数据本身不多,无法点击下一页,大家可以自行构造上述数据包。
2.4.1、初步判断
使用orderBy子句,猜解列数。
orderBy=1
,返回正常数据
http://127.0.0.1:8088/tmall/admin/user/1/10?user_name=&user_gender_array=&orderBy=1&isDesc=true
orderBy=99
,返回错误页面
http://127.0.0.1:8088/tmall/admin/user/1/10?user_name=&user_gender_array=&orderBy=99&isDesc=true
基本确定存在order by类型的SQL注入
。
2.4.2、进一步验证判断
①、使用rand函数结果显示排序方式不同
orderBy=rand(1=1)
orderBy=rand(1=2)
②、利用regexp(正则表达式)
orderBy=(select+1+regexp+if(1=1,1,0x00)) 正常
orderBy=(select+1+regexp+if(1=2,1,0x00)) 错误
③、利用updatexml(更新选定XML片段的内容)
orderBy=updatexml(1,if(1=1,1,user()),1) 正确
orderBy=updatexml(1,if(1=2,1,user()),1) 错误
④、利用extractvalue(从目标XML中返回包含所查询值的字符串)
orderBy=extractvalue(1,if(1=1,1,user())) 正确
orderBy=extractvalue(1,if(1=2,1,user())) 错误
⑤、时间盲注
orderBy=if(1=1,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test)) 正常响应时间
orderBy=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test)) sleep 2秒
2.4.3、使用SQLmap
①、将数据包保存放入txt文件中,在orderBy参数处键入*
,表示只对该地方进行探测注入。如下图所示:
③、回车,进行SQL注入攻击,最终得到结果如下:
在平时工作授权黑盒渗透测试时,对于Mybatis项目,可以多多关注不能使用#{}
转义的场景,就比如上述order by
语句。
第三套课程完整目录
推荐阅读
查看更多精彩内容,还请关注橘猫学安全:
每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看”