
CakePHP 5.4.2 - عالي - عن بعد - وكيل - trustedProxies يحترم X-Forwarded-* من أي REMOTE_ADDR
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 |
تجاوز قائمة ACL لعناوين 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 غير null. تُستخدم عناوين IP المُدرَجة لاحقًا كـ array_diff على سلسلة XFF، وليس كفحص للنظير المتصل.
المنعطفات الخاطئة المسجّلة مسبقًا: اعتبار الوسيط الافتراضي هذه البقايا (ليس كذلك)؛ تسمية x-forwarded-for في RateLimitMiddleware بنفس الثغرة (5.4.1 bakery نقلت بالفعل هذا الافتراضي إلى remote_addr)؛ الادعاء بأن REMOTE_ADDR نفسه قد تم انتحاله. مسرحية: reverse shell.
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.
/ بدون ترويسات مُمرَّرة -> 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 فقط. لا ضمان.