abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
类别: SQLi 可达性: 远程
phpMyAdmin 5.2.3(RELEASE_5_2_3 / 962857e)- phpMyAdmin
ImportLdi.php 使用来自 POST 参数 ldi_terminated 和 ldi_new_line 的 FIELDS/LINES TERMINATED BY 构建 LOAD DATA。这两个字符串被拼接进单引号 SQL 中。ldi_enclosed 和 ldi_escaped 会经过 escapeString。phpMyAdmin 在 /import 上设置 PMA_ENABLE_LDI,因此 MYSQLI_OPT_LOCAL_INFILE 处于开启状态。
已登录用户在 ldi_terminated 中携带引号 POST format=ldi。生成的 LOAD DATA 在 TERMINATED BY 中包含原始 POST 内容。SQL 注入进入用户连接,而非控制用户连接。
| ID | 暂无 CVE |
| 类别 | SQLi |
| 可达性 | 远程(已认证 cookie 登录;表导入,格式 ldi) |
| CWE | CWE-89 |
| CVSS | 中危:6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 产品 | phpMyAdmin |
| 受影响版本 | 5.2.3 标签 RELEASE_5_2_3(962857e4f63d42e38f11ff4d63f5e722018add76) |
| 认证 | 已认证 cookie 登录。表导入,格式 ldi |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
一个已登录且能打开表导入功能的 phpMyAdmin 用户,可以在其自身 MySQL 连接上向 LOAD DATA ... TERMINATED BY 注入 SQL。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
突破 FIELDS TERMINATED BY 字面量 | POST index.php?route=/import format=ldi ldi_terminated 携带引号 | PMA 构建语句的完整性 | 实验验证。HTML SQL 框:TERMINATED BY '',PMA-IMPORTLDI-WITNESS' |
保持 ENCLOSED BY 在带内 | 同一 POST,ldi_enclosed 中携带引号 | 阴性对照 | 实验验证。ENCLOSED BY 被转义 |
| 在用户连接上执行额外 SQL(INTO OUTFILE / 若允许则堆叠查询) | 字符串闭合后的同一汇聚点 | 用户连接的完整性 | 推断。实验止于被破坏的分隔符。默认 mysqli::query 为单语句 |
| MySQL 侧文件读写 | 若账户拥有 FILE 或指向 Web 服务器的 LOCAL INFILE,则同一 LOAD DATA | mysqld 可触及文件的完整性 | 推断。此处未授予该权限。不作断言 |
本实验已排除:未认证访问、控制用户 / pmadb、操作系统 include LFI,以及受 FILE 权限限制的读写。已登录用户本就拥有 SQL 框;此遗留问题在于 PMA 为其构建的语句中未转义的分隔符。
同一版本固定点:WebAuthn CustomServer 遗留问题。
我固定了 phpMyAdmin RELEASE_5_2_3。手工构建 LOAD DATA 的导入插件是引号审计的重点。四个分隔符字段中有两个被转义,两个没有:
$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';
ldi_enclosed / ldi_escaped 调用 $dbi->escapeString。Common.php 在 /import + format=ldi 上设置 PMA_ENABLE_LDI。路由为 GET|POST /import 和 GET|POST /table/import。
已记录的弯路:在没有 FILE 授权的情况下声称 LFI;将 SQL 框本身当作发现(遗留问题是 PMA 拼接的未转义分隔符);声称控制用户 / pmadb;反弹 shell。都是表演。
python3 phpmyadmin-importldi-Abraxas-Labs.py
# or: cd lab && ./run.sh
目标仅限 http://127.0.0.1:19290。镜像为 phpmyadmin:5.2.3 和 mysql:8.0。Compose 项目名 phpmyadmin-importldi。运行结束后栈会拆除。
Cookie 登录。POST /import,携带 format=ldi 并在 ldi_terminated 中放入引号。生成的 LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'。同样的引号放在 ldi_enclosed中则存储为转义后的ENCLOSED BY。5.2.3 镜像上的固定源码仍包含 '.$ldi_terminated.'和$dbi->escapeString($ldi_enclosed)`。
SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS
对 ldi_terminated 和 ldi_new_line 调用 escapeString,与 enclosed 和 escaped 一致。对 skip_queries 进行整数强制转换。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。