
CakePHP 5.4.2 - उच्च - रिमोट - प्रॉक्सी - trustedProxies किसी भी REMOTE_ADDR से X-Forwarded-* का सम्मान करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-trusted-proxies
राइट-अप: https://abraxaslabs.tech/research/cakephp-trusted-proxies
वर्ग: HTTPS रीडायरेक्ट बायपास / IP-होस्ट स्पूफ पहुँच: रिमोट
CakePHP 5.4.2 (887b641) - Cake Software Foundation
trustedProxies => ['10.0.0.1'] के साथ HttpsEnforcerMiddleware 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 को स्पूफ कर सकता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | HTTPS रीडायरेक्ट बायपास / IP-होस्ट स्पूफ |
| पहुँच | रिमोट (अनप्रमाणित 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 पथ छोड़ें | X-Forwarded-Proto: https के साथ GET / HTTP | लैब-प्रमाणित। 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 |
clientIp() पर आधारित IP ACL / रेट लिमिट को बायपास करें | वही स्पूफ | अनुमानित। RateLimitMiddleware का डिफ़ॉल्ट remote_addr यह बग नहीं है |
| नेगेटिव कंट्रोल | /control पर वही फ़ॉरवर्डेड हेडर (कोई trustedProxies नहीं) | लैब-प्रमाणित। अभी भी https पर 301 |
इस अवशेष पर बंद: डिफ़ॉल्ट trustedProxies => null; लैब में REMOTE_ADDR स्वयं अभी भी Docker ब्रिज IP है (192.168.208.1, सूचीबद्ध 10.0.0.1 नहीं)। RCE नहीं। कुकी-जार बग नहीं।
मैंने 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 non-null हो। सूचीबद्ध IPs को बाद में XFF श्रृंखला पर array_diff के रूप में उपयोग किया जाता है, न कि कनेक्टिंग पीयर की जाँच के रूप में।
पहले से दर्ज गलत मोड़: डिफ़ॉल्ट middleware को इस अवशेष के रूप में मानना (ऐसा नहीं है); RateLimitMiddleware x-forwarded-for को वही बग कहना (5.4.1 bakery ने पहले ही उस डिफ़ॉल्ट को remote_addr पर स्थानांतरित कर दिया है); यह दावा करना कि REMOTE_ADDR स्वयं spoofed था। नाटक: एक 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 नहीं करता। 127.0.0.1:19430 पर लूपबैक HTTP।
/ बिना फ़ॉरवर्डेड हेडर के -> 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
केवल तब forwarded headers को मान्यता दें जब REMOTE_ADDR trusted-proxy सूची में हो (Symfony isFromTrustedProxy())। खाली सूची को विश्वास सक्षम नहीं करना चाहिए।
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/ServerRequest.php · src/Http/Middleware/HttpsEnforcerMiddleware.phpGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।