abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
类别: SQLi 可达性: 远程
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql 绑定字符串值并拼接排序规则。IdentifierExpression 也是如此。没有 ensureSimpleString。Postgres 的 quoteIdentifier 是 '"' . trim($collation, '"') . '"',因此嵌入的引号会提前闭合 CAST。
一个将请求/区域设置的排序规则转发到 new StringExpression($term, $collation) 的应用,会将该字符串放入 COLLATE。值保持绑定。排序规则则不会。
| ID | 暂无 CVE |
| 类别 | SQLi |
| 可达性 | 远程(将排序规则/区域设置转发到 StringExpression / IdentifierExpression 的应用) |
| CWE | CWE-89 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 产品 | CakePHP (cakephp/database) |
| 受影响版本 | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| 认证 | 将排序规则/区域设置转发到这些构造函数中的应用 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
需要一个将用户/区域设置的排序规则传入这些构造函数的应用。原版 cakephp/app 本身不会在公开表单上暴露排序规则。
| 权限 | 方法 / 汇聚点 | 类型 | 实验验证或推断 |
|---|---|---|---|
在 COLLATE 之后拼接 SQL | StringExpression::sql 拼接 $this->collation | 编译后 SQL 的完整性 | 实验验证。原始 SQL 中包含未绑定的载荷 |
| 对标识符进行同样的拼接 | IdentifierExpression note COLLATE <payload> | 编译后 SQL 的完整性 | 实验验证。id_raw_sql 包含该载荷 |
突破 Postgres 的 "..." 包裹 | quoteIdentifier = '"' . trim($collation, '"') . '"' | 编译后 SQL 的完整性 | 实验验证。编译后的 SQL 为 COLLATE "C" AS text)) || (SELECT ... |
| 执行突破并读取另一张表 | CAST(... ) || (SELECT note FROM lab_secret ...) | 数据库侦察 | 实验验证。结果为 xCAKEPHP-COLLATE-SQLI-WITNESS,无执行错误 |
| 以连接角色修改行 / 执行更多 SQL | 同一注入 | 数据库完整性 | 推断。实验环境为 SELECT 预言机 |
| 阴性对照 | 排序规则 C | 已闭合 | 实验验证。结果为 x,无见证,编译后为 COLLATE "C" |
本次遗留问题已闭合:绑定的字符串值(:c0 保持字面量 x);能通过 ensureSimpleString(^[a-zA-Z0-9]+$)的排序规则不是此载荷。不是对骨架应用的未认证 RCE。不是 shell。
同一版本遗留问题:window SQLi、attachment CRLF、cache unserialize。
在 FunctionsBuilder / filename= 的笔记之后,我锁定了 5.4.2。十次搜寻。剩余 SQLi 这一轮就是本次。StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres 的 quoteIdentifier 用 ASCII 引号包裹并使用 trim($collation, '"')。嵌入的 " 会闭合标识符。-- 会吃掉 Cake 仍然追加的剩余闭合符。
已记录的弯路:将 SQLite 作为唯一驱动(拼接是真实的,包裹突破是 Postgres 特有的);将绑定值视为注入点;声称 ensureSimpleString 已在此处运行(实际没有);反弹 shell。都是表演。
python3 cakephp-collate-sqli-Abraxas-Labs.py
或
cd lab
./run.sh
目标仅限 http://127.0.0.1:19450。cakephp/database 5.4.2 加上 Postgres 16。微型应用将 ?collation= 转发到 StringExpression / IdentifierExpression 并执行 CAST(... AS text)。秘密表保存见证。
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
对排序规则参数使用 ensureSimpleString()(或排序规则允许列表)。Postgres 必须正确引用标识符,而不是 trim 加包裹。
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。