abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
类别: Cookie 泄露 / 植入 可达性: 远程
CakePHP 5.4.2 (887b641) - Cake Software Foundation
CookieCollection::findMatchingCookies 使用了 preg_match('/' . preg_quote($domain) . '$/', $host)。这是字符串后缀匹配,而非 RFC 6265 的域名匹配。为 api.partner.com 设置的 Cookie 会被发送到 evilapi.partner.com。为 bank.com 设置的 Cookie 会被发送到 notbank.com。
Cookie::createFromHeaderString() 还会复制 Set-Cookie 的 Domain=,且不检查响应主机。来自 attacker.test 的 addFromResponse 携带 Domain=victim.internal 会存储该 Cookie,并在之后将其附加到 victim.internal。
一个使用 Cake\Http\Client 且默认 Cookie jar 跨多个主机的应用,可能会将合作伙伴的会话 Cookie 泄露给后缀混淆的同级域名,或在获取攻击者 URL 后将 Cookie 植入内部主机。 other.com 不匹配。这不是浏览器 Cookie 漏洞。原版 cakephp/app 自身不会调用第二个主机。
| ID | 暂无 CVE |
| 类别 | Cookie 泄露 / 植入(正则后缀域名匹配) |
| 可达性 | 远程(应用跨主机使用 Http Client jar) |
| CWE | CWE-565, CWE-201 |
| CVSS | 高危:8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N |
| 产品 | CakePHP |
| 受影响版本 | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| 认证 | 应用跨主机使用 Cake\Http\Client 且采用默认 Cookie jar |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
需要一个在多个主机之间保留 Cake\Http\Client Cookie 的应用程序(OAuth、webhook、用户提供的 URL、第二个 API)。
| 权限 | 方法 / 汇聚点 | 实验验证或推断 |
|---|---|---|
| 将存储的 Cookie 泄露给后缀混淆的同级域名 | 在存在域为 api.partner.com 的 Cookie 后,对 https://evilapi.partner.com/ 调用 CookieCollection::addToRequest | 实验验证。请求的 Cookie 为 sid=SECRET。RFC 6265 不会匹配 |
| 对可注册后缀的相同泄露 | Cookie 域为 bank.com,请求主机为 notbank.com | 实验验证。请求的 Cookie 为 sid=SECRET |
| 阴性对照 | 请求主机 other.com | 实验验证。无 Cookie 头 |
| 为内部主机植入 Cookie | 从 https://attacker.test/ 对 Set-Cookie: sid=x; Domain=victim.internal 调用 addFromResponse | 实验验证。存储的域为 victim.internal;下一次对该主机的请求会发送 sid=x |
| 在下一次 Client 调用中实施会话固定 / 窃取合作伙伴会话 | 将植入或泄露的 sid 用作 API 会话 | 推断。实验止步于 Cookie 头预言机 |
| 同主机发送仍然有效 | Cookie 域为 api.partner.com,主机为 api.partner.com | 实验验证。符合预期,并非漏洞 |
已排除的遗留问题:other.com 不匹配。浏览器 Cookie jar 不存在此漏洞。无 shell。并非对骨架应用的未认证 RCE。
在 GHSA-2qh5、GHSA-fxf7、GHSA-vjqc 以及 5.4.2 的 filename= 说明之后,我锁定了 cakephp/cakephp 5.4.2。Http Client 的 Cookie 匹配是一个正则后缀:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
addFromResponse 仅将请求主机作为默认值传入。来自 Set-Cookie 的 Domain= 属性会覆盖它并被存储。
已记录的弯路:将此视为浏览器 Cookie 漏洞;声称 other.com 也会匹配;在没有跨主机使用 jar 的应用的情况下,将 Cookie 头预言机夸大为账户接管。作秀:反弹 shell。
python3 cakephp-cookie-suffix-Abraxas-Labs.py
或
cd lab
./run.sh
在 PHP 8.3 中 Git clone 标签 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)。回环预言机 HTTP 位于 127.0.0.1:19420。无需额外的 HTTP 源;预言机运行锁定版本的 CookieCollection。
sid=SECRET 域 api.partner.com。对 https://evilapi.partner.com/ 调用 addToRequest -> Cookie: sid=SECRET。https://other.com/ -> 无 Cookie 头。https://api.partner.com/ 仍发送 sid=SECRET。bank.com -> https://notbank.com/ 发送 sid=SECRET。https://attacker.test/ 对 Set-Cookie: sid=x; Domain=victim.internal; Path=/ 调用 addFromResponse。下一次 https://victim.internal/ 发送 sid=x。SUCCESS cakephp-cookie-suffix suffix-leak=yes control-other=yes plant-domain=yes how=cakephp-5.4.2 CAKEPHP-COOKIE-SUFFIX-WITNESS
RFC 6265 域名匹配(host === domain || str_ends_with($host, '.' . $domain))。当省略 Domain 时使用仅主机 Cookie。拒绝与请求主机不域名匹配的 Domain。拒绝公共后缀。
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。