
CakePHP 5.4.2 - عالي - عن بعد - وكيل - trustedProxies يحترم X-Forwarded-* من أي REMOTE_ADDR
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-trusted-proxies
المقال التقني: https://abraxaslabs.tech/research/cakephp-trusted-proxies
الفئة: تجاوز إعادة توجيه HTTPS / انتحال IP-host النطاق: عن بُعد
CakePHP 5.4.2 (887b641) - Cake Software Foundation
HttpsEnforcerMiddleware مع trustedProxies => ['10.0.0.1'] يستدعي setTrustedProxies، الذي يضبط trustProxy = true ولا يقارن القائمة بـ REMOTE_ADDR أبدًا. بعد ذلك، تحترم scheme() وhost() وclientIp() ترويسات المهاجم X-Forwarded-Proto / X-Forwarded-For / X-Forwarded-Host / X-Real-IP.
الوسيط الافتراضي لديه trustedProxies بقيمة null ولا يفعّل هذا السلوك. إعداد موازن التحميل الموثّق هو الحالة المكشوفة. يمكن لعميل HTTP غير مصادَق عليه، ليس هو الوسيط المدرج، تجاوز إعادة توجيه HTTPS وانتحال IP العميل وHost.
| المعرّف | لا يوجد CVE بعد |
| الفئة | تجاوز إعادة توجيه HTTPS / انتحال IP-host |
| النطاق | عن بُعد (HTTP غير مصادَق عليه؛ التطبيق ضبط trustedProxies) |
| CWE | CWE-441، CWE-346 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N |
| المنتج | CakePHP |
| المتأثر | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| المصادقة | لا شيء. التطبيق ضبط HttpsEnforcerMiddleware trustedProxies |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يحتاج إلى تطبيق فعّل trustedProxies (عادةً فرض HTTPS عبر وكيل عكسي). لا يحتاج إلى الاتصال من عنوان IP وسيط مدرج.
| الصلاحية | الطريقة / نقطة الوصول | مُثبت مختبريًا أو مُستنتج |
|---|---|---|
| تجاوز إعادة توجيه HTTPS / مسار HSTS | GET / عبر HTTP مع X-Forwarded-Proto: https | مُثبت مختبريًا. 200، scheme=https، دليل في JSON |
انتحال clientIp() | X-Forwarded-For: 203.0.113.50 | مُثبت مختبريًا. client_ip=203.0.113.50 |
انتحال host() | X-Forwarded-Host: spoof.invalid | مُثبت مختبريًا. host=spoof.invalid |
الانتحال عبر X-Real-IP | X-Real-IP: 198.51.100.9 | مُثبت مختبريًا. client_ip=198.51.100.9 |
تجاوز قائمة التحكم بالوصول IP / حد المعدل المعتمد على clientIp() | نفس الانتحال | مُستنتج. القيمة الافتراضية remote_addr في RateLimitMiddleware ليست هذه الثغرة |
| الضابط السلبي | نفس الترويسات المُمرَّرة على /control (بدون trustedProxies) | مُثبت مختبريًا. لا يزال 301 إلى https |
مغلق على هذه البقايا: الافتراضي trustedProxies => null؛ REMOTE_ADDR نفسه لا يزال عنوان IP لجسر Docker في المختبر (192.168.208.1، وليس 10.0.0.1 المدرج). ليس RCE. ليس ثغرة cookie-jar.
ثبّتُ cakephp/cakephp 5.4.2. ServerRequest::setTrustedProxies():
public function setTrustedProxies(array $proxies): void
{
$this->trustedProxies = $proxies;
$this->trustProxy = true;
$this->uri = $this->uri->withScheme($this->scheme());
}
يستدعي HttpsEnforcerMiddleware ذلك كلما كانت trustedProxies غير فارغة. تُستخدم عناوين IP المدرجة لاحقًا في array_diff على سلسلة XFF، وليس كفحص للنظير المتصل.
المسارات الخاطئة المسجّلة مسبقًا: اعتبار الوسيط الافتراضي من بقايا هذا (وهو ليس كذلك)؛ ووصف x-forwarded-for في RateLimitMiddleware بأنه نفس الخلل (فقد نقل مخبز 5.4.1 ذلك الافتراضي بالفعل إلى remote_addr)؛ والادعاء بأن REMOTE_ADDR نفسه قد جرى انتحاله. المسرح: صدفة عكسية.
python3 cakephp-trusted-proxies-Abraxas-Labs.py
أو
cd lab
./run.sh
Composer cakephp/cakephp 5.4.2 في PHP 8.3. تطبيق صغير: / يستخدم trustedProxies => ['10.0.0.1']؛ بينما /control لا يستخدمه. HTTP عبر loopback على 127.0.0.1:19430.
/ بدون ترويسات forwarded -> 301 https./control مع proto/for/host/real-ip -> 301 https./ مع X-Forwarded-Proto: https -> 200، scheme https، trust_proxy=true، REMOTE_ADDR ليس 10.0.0.1./ مع XFF + Host -> client_ip=203.0.113.50، host=spoof.invalid./ مع X-Real-IP -> client_ip=198.51.100.9.SUCCESS cakephp-trusted-proxies pin=5.4.2 how=app remote-addr=192.168.208.1 listed-proxy=10.0.0.1 proto-bypass=200 control-redirect=301 client-ip=203.0.113.50 host=spoof.invalid x-real-ip=198.51.100.9 CAKEPHP-TRUSTED-PROXIES-WITNESS
لا يتم اعتماد الرؤوس المُمرَّرة إلا عندما يكون REMOTE_ADDR ضمن قائمة الوكلاء الموثوقين (Symfony isFromTrustedProxy()). يجب ألا تؤدي القائمة الفارغة إلى تفعيل الثقة.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/ServerRequest.php · src/Http/Middleware/HttpsEnforcerMiddleware.phpGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.