
CakePHP 5.4.2 - عالي - عن بُعد - Cookie - وعاء ملفات تعريف الارتباط لعميل Http يطابق النطاقات كسابقة regex
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
المقال: https://abraxaslabs.tech/research/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 مع المخزن الافتراضي عبر أكثر من مضيف واحد يمكنه تسريب ملف تعريف ارتباط جلسة شريك إلى مضيف شقيق ملتبس باللاحقة، أو زرع ملف تعريف ارتباط على مضيف داخلي بعد جلب رابط يتحكم به المهاجم. لا يطابق 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، أو رابط يوفره المستخدم، أو واجهة 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 إلى ATO دون وجود تطبيق يستخدم الجرة عبر المضيفين. المسرح: صدفة عكسية.
python3 cakephp-cookie-suffix-Abraxas-Labs.py
أو
cd lab
./run.sh
Git clone tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) في PHP 8.3. Loopback oracle HTTP على 127.0.0.1:19420. لا يُشترط أصل HTTP إضافي؛ يشغّل الـ oracle فئة CookieCollection من الـ pin.
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 فقط. دون أي ضمان.