abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-csrf-sql
类别: CSRF 影响范围: 远程
phpMyAdmin 5.2.3(标签 RELEASE_5_2_3,提交 962857e)。Common.php 在 checkTokenRequestParam 之前从全局变量构建 PSR-7 请求。当校验不匹配时,Sanitize::removeRequestVars 会清除 $_POST 和 $_GET,但不会清除该快照。随后 $sql_query 会从 $request->getParsedBodyParam('sql_query') 复制而来。AJAX POST 在令牌不匹配时会中止。非 AJAX POST 则会继续执行。SqlController 优先使用已被剥离的 $_POST['sql_query'],否则保留全局变量。
只需一个持有 phpMyAdmin 会话 cookie 的受害者即可。向 index.php?route=/sql 发送 POST 请求,携带 sql_query 且没有有效令牌,并且不带 ajax_request。该 SELECT 会以该 MySQL 用户身份执行。5.2.3 中默认的 CookieSameSite=Strict 会阻止许多跨站浏览器。同站、Lax、None 或 HTTP 认证仍会触发该漏洞。无论哪种情况,这都是一个失效的 CSRF 防护。
| ID | 暂无 CVE |
| 类别 | CSRF |
| 影响范围 | 远程。默认 CookieSameSite=Strict 会阻止许多跨站浏览器。同站 / Lax / None / HTTP 认证仍然可行。 |
| CWE | CWE-352 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| 产品 | phpMyAdmin |
| 受影响版本 | 5.2.3 标签 RELEASE_5_2_3(962857e) |
| 认证 | 受害者 phpMyAdmin 会话 cookie(或 HTTP 认证)。无需有效 CSRF 令牌。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19240 |
任何能够诱使受害者浏览器向 phpMyAdmin 发送不带 ajax_request 的 POST 请求的人,都可以以该 MySQL 用户身份执行 SQL。
| 权限 | 方法 / 路径 | 实验验证或推断 |
|---|---|---|
| 以受害者 MySQL 账户身份运行攻击者 SQL(对该 SQL 主机的完整性破坏 + 侦察) | POST index.php?route=/sql sql_query=... db=... 无 token,无 ajax_request | 实验验证。响应正文包含 PMA-CSRF-SQL-WITNESS。通用日志显示该 SELECT 以 appuser 身份执行 |
| 在 AJAX 上中止同一处理器 | 相同 POST 但带 ajax_request=1 | 实验验证。Token mismatch。INSERT 标记行不存在。通用日志未执行该 INSERT |
跳过仅读取已剥离 $_POST 的处理器 | POST /database/structure/drop-table 不带令牌 | 实验验证。keepme 仍然存在 |
导出(SaveDir)、分区 DROP/TRUNCATE、账户锁定、/config/set、pmadb 创建上存在相同缺口 | 任何在剥离后读取 PSR-7 请求体的处理器 | 推断。未实际测试 |
本实验环境中已排除:未认证的 PMA(需先进行 cookie 登录)、AJAX 路由(不匹配时会退出)、不带令牌的 drop-table、操作系统 shell。默认的 Strict SameSite 意味着经典的跨站表单通常不会发送 cookie;但在同站以及 Lax/None 部署上,遗留问题仍然是失效的 CSRF 检查。
对 RELEASE_5_2_3 进行了八路并行源码搜索。Common.php 在 checkTokenRequestParam() 之前创建 $request = createFromGlobals()。当校验不匹配时,Sanitize::removeRequestVars() 仅清除 $_POST/$_GET。非 AJAX 请求继续执行。如果 $_POST 为空,SqlController 会使用全局 $sql_query。路由为 GET|POST /sql。
走过的弯路:将 AJAX /sql 视为遗留问题(它会以 Token mismatch 中止);将 drop-table 视为遗留问题(该处理器仅读取已剥离的 $_POST);将默认 Strict SameSite 视为“CSRF 已关闭”(该防护仍然是失效的;同站 / Lax / None 仍然可行)。
python3 phpmyadmin-csrf-sql-Abraxas-Labs.py
或
cd lab
./run.sh
仅限回环地址:http://127.0.0.1:19240。镜像为 phpmyadmin:5.2.3 和 mysql:8.0。Compose 项目为 phpmyadmin-csrf-sql。PoC 是一个同站回环 POST(Strict SameSite 仍会发送 cookie)。见证字符串 PMA-CSRF-SQL-WITNESS。
SUCCESS phpmyadmin-csrf-sql sql-ran=yes ajax-abort=yes drop-held=yes PMA-CSRF-SQL-WITNESS
当校验不匹配时,将请求替换为空请求体,或拒绝所有 POST 请求,而不仅仅是 AJAX。不要从过期的请求中复制 sql_query。像注销一样采用失败关闭(fail closed)策略。
962857e)libraries/classes/Common.php 在令牌剥离之前的请求快照Sanitize::removeRequestVars 仅清除 $_POST/$_GETSqlController 全局 $sql_queryGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。