CVE-2014-8959根本原因是pma_gis_factory.php中factory()函数未过滤用户输入的$_REQUEST['gis_type'],直接拼接路径导致LFI;影响4.0.x–4.2.x版本,可无需登录触发,修复需彻底替换GIS目录并启用白名单校验。
为什么GIS操作会触发LFI漏洞(CVE-2014-8959)
根本原因在 libraries/gis/pma_gis_factory.php 中,factory() 函数直接拼接用户传入的 $_request['gis_type'] 参数构造文件路径,未过滤 ../ 和点号,导致任意文件包含。攻击者可构造类似 ?gis_type=../../../../etc/passwd%00 的请求读取敏感文件。该漏洞影响 4.0.x–4.2.x 多个分支,且无需登录即可触发。
升级时必须替换并清理旧版GIS相关文件
仅覆盖主目录无法清除漏洞载体,旧版 libraries/gis/ 下的残留文件仍可能被调用。实操中需特别注意:
- 删除整个
libraries/gis/目录,再从新版包中完整复制过去 - 确认新版已移除或重写
pma_gis_factory.php,其修复逻辑是用白名单校验$gis_type(如只允许'POINT'、'POLYGON'等固定值) - 检查是否还存在废弃的
gis_data_editor.php入口文件——新版已弃用该页面,若残留则需手动删除 - 验证
phpmyadmin/index.php?route=/gis(新版路由)能否正常加载,而旧路径gis_data_editor.php返回 404
临时缓解:Web服务器层拦截可疑GIS参数
若暂无法升级,可在 Nginx 或 Apache 配置中直接阻断含路径遍历特征的 gis_type 请求:
- Nginx:添加
if ($args ~* "gis_type=.*\.\.") { return 403; }到 phpMyAdmin location 块 - Apache:在 .htaccess 或虚拟主机配置中加入
RewriteCond %{QUERY_STRING} gis_type=.*\.\. [NC]+RewriteRule ^ - [F] - 注意:该规则不能替代升级,仅防基础扫描;绕过方式很多(编码、双写、空字节等)
验证修复是否生效的关键动作
很多人以为升级完就万事大吉,但漏洞是否真正修复,必须用原始PoC复测:
- 访问
/phpmyadmin/libraries/gis/pma_gis_factory.php?gis_type=../../../../etc/passwd%00,应返回 500 或空白,而非文件内容 - 检查响应头中是否含
X-Powered-By: phpMyAdmin/4.2.12(或更高),确认版本号已更新 - 手动测试合法GIS类型(如
?gis_type=POINT)是否仍能正常渲染地图控件,避免误伤功能 - 翻查 Web 服务器错误日志,确认无
file_get_contents(): Failed to open stream: No such file or directory类报错——这说明白名单机制已在运行
GIS相关的溢出漏洞本质是输入未校验,不是内存或计算溢出;修复核心永远落在参数过滤和版本替换上,任何“加内存”“改超时”的操作都无效。
立即学习“PHP免费学习笔记(深入)”;



















