
CakePHP 5.4.2 - عالي - عن بُعد - Cookie - وعاء ملفات تعريف الارتباط لعميل Http يطابق النطاقات كسابقة regex
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
الفئة: تسريب / زرع ملف تعريف ارتباط الوصول: عن بُعد
CakePHP 5.4.2 (887b641) - Cake Software Foundation
تستخدم CookieCollection::findMatchingCookies التعبير preg_match('/' . preg_quote($domain) . '$/', $host). هذا لاحقة نصية، وليس مطابقة النطاق وفق RFC 6265. يتم إرسال ملف تعريف ارتباط الخاص بـ api.partner.com إلى evilapi.partner.com. ويتم إرسال ملف تعريف ارتباط الخاص بـ bank.com إلى notbank.com.
كما تنسخ Cookie::createFromHeaderString() قيمة Domain= من Set-Cookie دون أي تحقق مقابل مضيف الاستجابة. تقوم addFromResponse من attacker.test مع Domain=victim.internal بتخزين ملف تعريف الارتباط هذا ثم إرفاقه لاحقًا بـ victim.internal.
يمكن لتطبيق يستخدم Cake\Http\Client مع الجرة الافتراضية عبر أكثر من مضيف واحد أن يسرّب ملف تعريف ارتباط جلسة شريك إلى مضيف شقيق مرتبك باللاحقة، أو أن يزرع ملف تعريف ارتباط على مضيف داخلي بعد جلب عنوان URL للمهاجم. لا تتطابق other.com. هذا ليس خطأ في ملفات تعريف ارتباط المتصفح. لا يستدعي cakephp/app القياسي مضيفًا ثانيًا من تلقاء نفسه.
| المعرّف | لا يوجد CVE بعد |
| الفئة | تسريب / زرع ملف تعريف ارتباط (مطابقة نطاق بلاحقة regex) |
| الوصول | عن بُعد (التطبيق يستخدم جرة Http Client عبر المضيفين) |
| 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 مع جرة ملفات تعريف الارتباط الافتراضية عبر المضيفين |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يحتاج إلى تطبيق يحتفظ بملفات تعريف ارتباط Cake\Http\Client عبر أكثر من مضيف واحد (OAuth، webhooks، عنوان URL يوفره المستخدم، واجهة API ثانية).
| الصلاحية | الطريقة / نقطة الوصول | مُثبت مختبريًا أو مُستنتج |
|---|---|---|
| تسريب ملف تعريف ارتباط مخزّن إلى مضيف شقيق مرتبك باللاحقة | CookieCollection::addToRequest لـ https://evilapi.partner.com/ بعد ملف تعريف ارتباط بنطاق api.partner.com | مُثبت مختبريًا. ترويسة Cookie في الطلب هي sid=SECRET. RFC 6265 لن يطابق |
| نفس التسريب للاحقة قابلة للتسجيل | نطاق ملف تعريف الارتباط bank.com، مضيف الطلب notbank.com | مُثبت مختبريًا. ترويسة Cookie في الطلب هي sid=SECRET |
| ضبط سلبي | مضيف الطلب other.com | مُثبت مختبريًا. لا توجد ترويسة Cookie |
| زرع ملف تعريف ارتباط لمضيف داخلي | addFromResponse لـ Set-Cookie: sid=x; Domain=victim.internal من https://attacker.test/ | مُثبت مختبريًا. النطاق المخزّن هو victim.internal؛ الطلب التالي إلى ذلك المضيف يرسل sid=x |
| تثبيت الجلسة / سرقة جلسة شريك في استدعاء Client التالي | sid مزروع أو مسرّب يُستخدم كجلسة API | مُستنتج. يتوقف المختبر عند أوراكل ترويسة Cookie |
| الإرسال لنفس المضيف لا يزال يعمل | نطاق ملف تعريف الارتباط api.partner.com إلى المضيف api.partner.com | مُثبت مختبريًا. متوقع، وليس خطأ |
مغلق على هذه البقايا: other.com لا يتطابق. جرات ملفات تعريف ارتباط المتصفح ليست هذا الخطأ. لا shell. ليس RCE غير مُصادق عليه على تطبيق هيكلي.
ثبّتت cakephp/cakephp 5.4.2 بعد GHSA-2qh5 وGHSA-fxf7 وGHSA-vjqc وملاحظة filename= في 5.4.2. مطابقة ملفات تعريف ارتباط Http Client هي لاحقة regex:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
تمرر addFromResponse مضيف الطلب فقط كقيمة افتراضية. سمة Domain= من Set-Cookie تستبدلها ويتم تخزينها.
المنعطفات الخاطئة المسجلة مسبقًا: التعامل مع هذا كخطأ في ملفات تعريف ارتباط المتصفح؛ الادعاء بأن other.com يتطابق أيضًا؛ تضخيم أوراكل ترويسة Cookie إلى استيلاء كامل على الحساب دون تطبيق يستخدم الجرة عبر المضيفين. مسرحية: reverse shell.
python3 cakephp-cookie-suffix-Abraxas-Labs.py
أو
cd lab
./run.sh
استنساخ Git للوسم 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) في PHP 8.3. أوراكل HTTP على loopback عند 127.0.0.1:19420. لا يلزم أصل HTTP إضافي؛ يشغّل الأوراكل CookieCollection من التثبيت.
sid=SECRET للنطاق api.partner.com. addToRequest لـ https://evilapi.partner.com/ -> Cookie: sid=SECRET.https://other.com/ -> لا ترويسة Cookie.https://api.partner.com/ لا يزال يرسل sid=SECRET.bank.com -> https://notbank.com/ يرسل sid=SECRET.addFromResponse من https://attacker.test/ مع Set-Cookie: sid=x; Domain=victim.internal; Path=/. الطلب التالي 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. رفض Domain الذي لا يطابق نطاق مضيف الطلب. رفض اللواحق العامة.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.