代码审计 | 新蜂商城管理系统漏洞分析

2025-02-14 28 0

一、cms简介:

新蜂是一套电商系统,包括基础版本(Spring Boot+Thymeleaf)、前后端分离版本(Spring Boot+Vue 3+Element-Plus+Vue-Router 4+Pinia+Vant 4) 、秒杀版本、Go语言版本、微服务版本 (Spring Cloud Alibaba+Nacos+Sentinel+Seata+Spring Cloud Gateway+OpenFeign+ELK)。前台 商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物 车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。后台管理系统包含数据 面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。

本文是关于新蜂 CMS漏洞分析学习,大纲:

1、环境搭建
2、漏洞分析(1)后台sql注入(2)前台sql注入(3)后台权限绕过(4)前台越权

二、环境搭建

下载源码,使用idea导入

创建相应的数据库,更改配置信息

访问新蜂商城,前台地址: http://127.0.0.1:28089 ,后台地址: http://127.0.0.1:28089/admin ,登录账号密码为 admin/123456 。如下图所示:

可以访问就表明环境搭建成功

三、代码审计漏洞挖掘

1、第三方组件漏洞审计

maven看pom.xml,整理出来第三方组件以及版本号,并说明存在漏洞组件

经过分析新蜂商城系统的 pom.xml,发现实际引入第三方依赖并不多。

mybatis

1.3.2

kaptcha

2.3.2

没发现关于组件的历史漏洞

2、单点漏洞代码审计

2.1、后台 SQL 注入漏洞 1 代码审计

在对该项目进行简单梳理时,发现该项目使用了 Mybatis 持久层框架,可以简单理解成操作数据的第三方依赖。

在 Mybatis 中有两种常用的拼接 SQL 语句的符号,即 $ 和 # 。

#{} 告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个 ? 来标识,并被传递到一个新的预处理语句中,这样可以有效的防止 SQL 注入漏洞。

${}仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,类似于直接替换字符串,会 导致SQL注入产生。

因此,我们可以在项目中全局搜素关键字 ${ ,查看是否使用了存在风险的拼接方式,共发现四处使用${} 拼接 SQL 语句的地方,如下所示:

我们鼠标单击进入第一个漏洞点,该漏洞位于 src/main/resources/mapper/NewBeeMallGoodsMapper.xml 第 70 行,如下图所示:

下面我们开始分析代码,并逆向追踪触发该漏洞点的功能。

①、第一步:分析 NewBeeMallGoodsMapper.xml 映射文件第 64 至 71 行,该部分中 goodsName 参 数存在 SQL 注入,使用了直接拼接 SQL 语句的方式向数据库进行查询。具体代码分析如下,及如下图所示:

<if test="goodsName!=null and goodsName!=''"> :这是一个条件判断,它检查变量 
goodsName 是否不为 null 且不为空字符串。如果条件为真,下面的 SQL 语句块将会被包含在生成
的查询语句中;否则,该 SQL 语句块将被忽略。
and goods_name like CONCAT('%','${goodsName}','%') :这是在生成的 SQL 查询语句中的
一个条件部分。它使用了 like 关键字来进行模糊匹配,查找包含特定字符串的记录。 CONCAT() 
函数是用于连接字符串的。在这里,它连接了三个部分: '%' 是一个百分号字符,用于匹配任意字
符; ${goodsName} 是一个占位符,它会被实际的 goodsName 变量的值替换;再次使用 '%' 进
fcmit.cc行匹配结尾的任意字符。这样的组合就可以实现在 goods_name 列中模糊匹配指定的字符串。

②、第二步:我们逆向追踪到映射接口,如果安装了类似 Free Mybatis plugin 的插件,我们只需点击左 侧绿色箭头即可跳转过去(或者全局搜索 id findNewBeeMallGoodsList 也是可以的), NewBeeMallGoodsMapper 映射接口代码位于

src/main/java/ltd/newbee/mall/dao/NewBeeMallGoodsMapper.java ,如下图所示:

简单说明下,在 Mybatis 中 XXXMapper.xml 和 XXXMapper.java 的作用。

xxxmapper.xml :这是映射器(Mapper)文件,用于定义 SQL 查询语句和映射关系。它包含了各 种 SQL 语句和对应的参数映射、结果映射等配置信息。 xxxmapper.xml文件中的 SQL 语句可以通 过命名空间和标识符来唯一标识,并与 Java 代码中的对应映射器接口关联起来。这个文件通常是使 用 XML 格式编写的。

xxxmapper.java :这是映射器接口,用于定义数据访问的方法。映射器接口中的方法通常对应于xxxmapper.xml文件中定义的 SQL 查询语句。通过映射器接口,Java 代码可以调用数据库操作, 而不需要直接编写和管理 SQL 查询语句。MyBatis 会在运行时自动实现这些接口的具体实现。映射 器接口通常使用 Java 接口的形式编写。

③、第三步:继续逆向追踪,查看谁调用了 NewBeeMallGoodsMapper.java 接口中的 findNewBeeMallGoodsList 方法,我们只需键盘按住 Ctrl + 鼠标左键点击该方法即可看到调用关系,即 NewBeeMallGoodsServiceImpl.java 中的 getNewBeeMallGoodsPage 方法,如下图所示:

④、第四步:进入 NewBeeMallGoodsServiceImpl.java,位于 src/main/java/ltd/newbee/mall/service/impl/NewBeeMallGoodsServiceImpl.java ,在 getNewBeeMallGoodsPage 方法中使用了 goodsMapper.findNewBeeMallGoodsList 方法,即第 27 行。如下图所示:

⑤、第五步:继续逆向追踪,查看谁调用了 getNewBeeMallGoodsPage 方法,还是只需键盘按住 Ctrl + 鼠标左键点击该方法即可看到调用关系,直接跳到了 NewBeeMallGoodsController,位于 src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallGoodsController.java ,在第 137 行使用了 getNewBeeMallGoodsPage 方法,如下图所示:

⑥、第六步:分析 NewBeeMallGoodsController 中 list 方法代码,即第 127 到 135 行。

首先,点击第 134 行中 pageUtil,该参数来自第 133 行,通过 PageQueryUtil 类创建一个 pageUtil 对 象,传入 params 作为参数。PageQueryUtil 是作者自定义的工具类,是用于处理分页相关的操作。

然后,点击 133 行中 params,可以看到该参数来自第 129 行,是一个 Map 对象,可以简单理解为它 需要从请求中获取参数。

最后,整理代码信息可以的到接口路径为 /goods/list ,请求为 GET 方法,是个列表功能,根据代码路 径来看应该是后台功能,这么看来我们找到了漏洞前端功能点。如下图所示:

有时 SQL 注入防范代码会在过滤器和拦截器中体现,但查看该项目时,并没有发现相关防护代码。

根据审计拼凑出来的信息,我们登录进后台管理,并且使用 BurpSuite 进行抓包。 最终在商品管理功能处找到了该接口,如下图所示:

但是发现没有 goodsName 参数,我们给它手动加上去并尝试使用单引号触发报错,如下图所示:

我们用sqlmap跑一下,看看结果

2.2、前台 SQL 注入漏洞 2 代码审计

使用${关键字进行全局搜索时,发现一共四处存在 SQL 注入,有两处是 goodsName 参数,有两处是 keyword 参数。这里选择一处 keyword 参数进行分析

①、第一步:逆向追踪到 NewBeeMallGoodsMapper.java 映射接口,位于

src/main/java/ltd/newbee/mall/dao/NewBeeMallGoodsMapper.java,点击第 31 行处 findNewBeeMallGoodsListBySearch 方法逆向查看调用关系,如下图所示:

②、第二步:进入到 NewBeeMallGoodsServiceImpl,漏洞点位于第 73 行,由于是

searchNewBeeMallGoods 这个方法下第一行代码,代码通常是逐行按顺序执行的,下面代码就没什么可分析的了,继续向上追踪查看谁嗲用了 searchNewBeeMallGoods 方法,昀终跳转到

GoodsController,位于

src/main/java/ltd/newbee/mall/controller/mall/GoodsController.java,如下图所示:

漏洞点在第 57 行,传入了 pageUtil 参数,而该参数同样通过 PageQueryUtil 类创建一个 pageUtil 对象,传入 params 作为参数,以及 params 同样是个 Map 对象。

主要分析第 31 至 54 行,查看对 params 做了哪些操作,是否有 SQL 注入防范过滤代码,但分析下来发现,并没有任何防范代码。

主要是使用了 params.containsKey 方法检测是否包含指定的键(key),如果包含一些特定的值,比如goodsCategoryId,就做一些特定处理。以及对 keyword 做了过滤,去掉了空格。

最后,整理代码信息可以的到接口路径为/search或/search.html,请求为 GET 方法,应该是个搜索功能,根据代码路径来看应该是前台功能,这么看来我们找到了漏洞前端功能点。如下图所示:

我们进行验证一下

2.3、后台权限绕过漏洞

发现后台系统身份验证拦截器 AdminLoginInterceptor.java 存在权限绕过漏洞。

漏洞代码位于:src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java,第 21 ~ 32 行,代码如下图所示:

漏洞主要发生于第 23 行和第 24 行,下面我们分析下漏洞成因

首先,关键点是第 23 行,使用了 request.getRequestURI() 方法获取路径。如果使用该方法获取的路径进行权限判断是极易出现权限绕过漏洞的。

简单来说,getRequestURI方法返回的路径是未经过服务器端处理的原始路径,可能包含特殊字符或路径跳转,从而绕过服务器端的安全控制。

其次,第 24 行使用了 uri.startsWith("/admin") 判断 Uri 路径中是否以/admin开头,以及获取并判断 Session 中的 loginUser 属性是否为 null,两个条件&&在一起结果为 True 的话进入条件代码,提示需要登录并跳转到后台登录页面中。

既然这样,我们知道 a && b 需要两者都为 True 整体则为 True 才会进入条件判断代码中,如果另其中一个条件为 False 则整体就为 False,就不会进入条件判断中去了。

这两个条件中,Session 部分我们是没办法操纵的。但 uri.startsWith("/admin") 这个条件我们可以搞点小破坏,前面提到了 uri 是使用的 getRequestURI 方法获取的原始路径,那么我们可以找一些特殊字符绕过路径判断,并且不影响整体接口,比如:分号;,正斜杠/等等。

最终,构造结构路径为/;/admin/test或///admin/test,这样路径就不是以 /admin 开头了,并且该路径不会影响结构访问,实现了权限绕过。(当然还有一些其他字符,编码呀也可以进行绕过。)

但我们可以首先使用分号(;)进行尝试,在 URL 中有一个保留字符分号(;),主要作用是作为参数分隔符进行使用的。

首先,我们登陆后台寻找一个后台接口,比如商品管理接口,访问如下图所示:

然后,我们删除 Cookie 后,也就是没有访问权限了,发送数据包,显示需要跳转到登录页面,如下图所示:

最后,我们利用代码审计中权限绕过小技巧,使用分号(;)构造请求接口,昀终为

http://127.0.0.1:28089/;/admin/goods/list?

_search=false&nd=1685517654136&limit=20&page=1&sidx=&order=asc,可以发现成功绕过了权限认证,获取到了商品内容,如下图所示:

2.4前台越权漏洞

在做这部分代码审计分析时,我们需要改动两处代码,打开注册功能。

第一处,访问src/main/java/ltd/newbee/mall/controller/mall/PersonalController.java代码,将注册功能代码注释删除,最终如下图所示:

第二处,访问src/main/resources/templates/mall/register.html,将注册事件按钮改为 register(),如下图所示:

接下来,访问前台注册页面,注册一个账号后,进入个人中心功能,发现存在一个更改个人信息的功能,点此功能,同时使用 BurpSuite 获取数据包,如下图所示:

发现数据包中存在 userId,怀疑存在越权漏洞,我们通过代码审计进行分析。

在项目中全局搜索接口名/personal/updateInfo,最终找到代码位置,如下图所示:

我们进入 PersonalController.java,该代码位于

src/main/java/ltd/newbee/mall/controller/mall/PersonalController.java,该接口的 Controller 层代码如下图所示:

①、第一步:分析第 116 行,通过方法名也可以看出这是更新用户信息的方法,其中传入了 mallUser 和 httpSession 参数,而这两个参数来自用户,MallUser mallUser表示要更新的用户对象,也就是接受用户信息的实体类,HttpSession httpSession表示当前会话的HttpSession对象。

我们可以跟进 MallUser 查看,主要定义了以下内容,其中有个 userId,如下图所示:

②、第二步:返回到 PersonalController 层,Ctrl 加鼠标左键点击第 116 行的 updateUserInfo 跟进该方法,最终跳转到了 NewBeeMallUserService 层,如下图所示:

点击左侧按钮,进行跟进到 NewBeeMallUserServiceImpl 层,updateUserInfo 方法具体代码如下:

③、第三步:分析实现层代码具体做了什么操作

第 73 行,根据根据用户 ID 主键查询用户信息,跟进 selectByPrimaryKey 通过 MallUserMapper.java 接口跳转到 MallUserMapper.xml 映射器代码中。可以看到,通过限制 userId 在

tb_newbee_mall_user 表中查询用户信息。也就是说,我的 userId 是 10,则最终查询语句如下,代码如下图所示:

select refid="Base_Column_List"(在上面定义了具体是哪些列) from tb_newbee_mall_user 
where user_id = 10;

总结来说,第 73 行的作用是通过 ID 查询用户信息并赋值给 user。

第 74 ~ 77 行,如果 user 不为 null,进行了三个 set 操作,其中传入的参数是来自 mallUser。也就是说,将查询到的用户信息中的内容设置成了用户输入的内容了。如下图所示:

第 78 行是关键,通过调用mallUserMapper.updateByPrimaryKeySelective(user)方法,将更新后的用户信息保存到数据库。如果更新操作影响的行数大于 0,则执行下面的代码块。我们跟进该方法,通过 MallUserMapper.java 接口跳转到 MallUserMapper.xml 映射器代码中。在这里面我们主要更新了

nick_name,address 以及 introduce_sign 这三个是我们传入的参数,不为 null。如下图所示:

第 79 ~ 83 行,是上面代码判断操作是否大于 0,符合该条件则进入这几行代码,我们更新个人信息是否符合这个条件的。这几行代码大致意思是,获取更新的用户信息,然后返回更新成功的响应。

④、第四步:整个流程我们追踪完了,总得来说,就是通过传入的 userId 获取用户信息后进行信息更新操作。整个流程没有任何权限校验,没有判断 userId 所属关系,进而造成了越权漏洞。

我们验证一下

首先,访问注册接口http://127.0.0.1:28089/register,自行注册两个用户。

然后,登录其中一个账户,访问个人中心下个人信息功能,点击更改个人信息,键入所需信息后,点击确认,此时使用 BurpSuite 拦截抓取数据包,可以看到该账号的 userId 为 9,如下图所示:

再然后,登录另一个账号,同样访问上述功能,使用 BurpSuite 抓取数据包,将其发到 Repeater 模块下,如下图所示:

再再然后,将数据包中的 userId 改为 9,及另一个账号的 ID,发送数据包,同样显示修改成功,如下图所示:

最后,登录开始的账号,访问个人信息功能,可以看到信息已经被越权修改了,如下图所示:


4A评测 - 免责申明

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

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

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

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

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

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

相关文章

甲方安全何时需要自研安全产品?安全平台工程团队的价值与落地策略
Burpsuite基础使用教程
Kali linux hping3基础使用方法
DouCo DouPHP 安全漏洞(CVE-2024-57599)
9万个WordPress站点面临本地文件包含漏洞攻击
从中国视角看 NSA(方程式组织)的 TTP(攻击套路)

发布评论