सारांश
घोषित: 2010-05-20
क्रेडिट: 80 सेकेंड
प्रभावित करता है: fastcgi_pass के साथ निर्देशिकाओं में फ़ाइलों को अपलोड करने की क्षमता के साथ ngnix + php पर साइटें
पृष्ठभूमि
अक्सर, कैसे-कैसे php-fpm / php-cgi के साथ एक nginx बंडल सेट करने पर समान लाइनें होती हैं:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
समस्या का वर्णन
हालाँकि, यदि आप सर्वर से example.com/1px.gif/test.php देने के लिए कहते हैं, तो URI
1px.gif/test.php
जैसा दिखेगा, जो
location \.php$
SCRIPT_FILENAME
location \.php$
सूट करता है, और
SCRIPT_FILENAME
बराबर हो जाता है।
/scripts/1px.gif/test.php
इसके अलावा, अगर
cgi.fix_pathinfo == 1
(डिफ़ॉल्ट रूप से), तो
SCRIPT_FILENAME
बराबर हो जाता है, और
PATH_INFO
बराबर
test.php
हो जाएगा।
नायब! कुछ कॉन्फ़िगरेशन में, भेद्यता
1px.gif%00test.php
जैसे URL को ट्रिगर
1px.gif%00test.php
परिणामस्वरूप, php दुभाषिया /
/scripts/1px.gif
को संसाधित करेगा। वह है,
प्रभाव
कोई भी उपयोगकर्ता सर्वर (उदाहरण के लिए, अवतार) के लिए फाइल अपलोड करने में सक्षम होगा, फिर एक विशेष छवि बना रहा है जो एक साथ जीडी आकारों को मान्य करेगा और पीएचपी दुभाषिया द्वारा निष्पादित किया जाएगा और सर्वर पर मनमाने ढंग से कोड को निष्पादित करने का अधिकार होगा।
वैकल्पिक हल
php.ini
cgi.fix_pathinfo=0
या nginx.conf कॉन्फ़िगरेशन के माध्यम से
location ~ \.php$ { try_files $fastcgi_script_name =404; fastcgi_index index.php; fastcgi_param script_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
यह वास्तव में सभी गैर-मौजूदा
.php
फ़ाइलों तक पहुंच को बंद कर देगा