क्या PHP विकल्प 'cgi.fix_pathinfo' वास्तव में Nginx + PHP-FPM के साथ खतरनाक है?


51

हुई है एक बहुत की बात कर के बारे में कोई सुरक्षा समस्या रिश्तेदार cgi.fix_pathinfoNginx (आमतौर पर पीएचपी-एफ पी एम, तेजी से सीजीआई) के साथ प्रयोग किया पीएचपी विकल्प।

परिणामस्वरूप, डिफ़ॉल्ट nginx कॉन्फ़िगरेशन फ़ाइल कहने के लिए उपयोग की जाती है:

# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

हालाँकि, अब, "आधिकारिक" Nginx विकी बताता है कि PATH_INFO को उपरोक्त PHP विकल्प को अक्षम किए बिना सही ढंग से संभाला जा सकता है। तो क्या?

प्रशन

  • क्या आप स्पष्ट रूप से बता सकते हैं कि क्या करता cgi.fix_pathinfoहै? ( आधिकारिक डॉक केवल कहता है : "PATH_INFO के बारे में अधिक जानकारी के लिए, CGI चश्मा देखें")
  • PHP वास्तव में इन PATH_INFOऔर SCRIPT_FILENAMEचर के साथ क्या करेगा ?
  • Nginx के साथ क्यों और कैसे खतरनाक हो सकता है? ( विस्तृत उदाहरण)
  • क्या इन कार्यक्रमों के हाल के संस्करणों में अभी भी समस्या मौजूद है?
  • क्या अपाचे असुरक्षित है?

मैं प्रत्येक चरण पर मुद्दे को समझने की कोशिश कर रहा हूं। उदाहरण के लिए, मुझे समझ में नहीं आ रहा है कि php-fpm यूनिक्स सॉकेट का उपयोग करने से इस समस्या से क्यों बचा जा सकता है।


1
आप PATH_INFO और PATH_TRANSLATED: blogs.msdn.com/b/david.wang/archive/2005/08/04/…
Giovanni Tathoni

जवाबों:


79

टीएल; डीआर - फिक्स (जिसकी आपको आवश्यकता भी नहीं हो सकती है) बहुत ही सरल है और इस उत्तर के अंत में है।

मैं आपके विशिष्ट प्रश्नों को संबोधित करने का प्रयास करूंगा, लेकिन PATH_INFO की आपकी गलतफहमी सवालों को खुद ही थोड़ा गलत कर देती है।

  • पहला सवाल यह होना चाहिए कि "यह पथ सूचना व्यवसाय क्या है?"

    • यूआरआई में स्क्रिप्ट के बाद पथ की जानकारी सामान है (आगे की स्लैश के साथ शुरू होनी चाहिए, लेकिन क्वेरी तर्कों से पहले समाप्त हो जाती है, जो एक से शुरू होती है ?)। सीजीआई के बारे में विकिपीडिया लेख के अवलोकन अनुभाग में अंतिम पैराग्राफ इसे अच्छी तरह से गाया जाता है। नीचे PATH_INFO"/ THIS / IS / PATH / INFO" है:

      http://example.com/path/to/script.php/THIS/IS/PATH/INFO?query_args=foo

  • आपका अगला प्रश्न यह होना चाहिए: "PHP कैसे निर्धारित करता है PATH_INFOऔर क्या SCRIPT_FILENAMEहैं?"

    • PHP के पहले के संस्करण भोले थे और तकनीकी रूप से भी समर्थन नहीं करते थे PATH_INFO, इसलिए माना जाता था कि PATH_INFOजिस पर मंगाया गया था SCRIPT_FILENAME, हाँ, कई मामलों में टूट गया है। मेरे पास परीक्षण करने के लिए PHP का पुराना पर्याप्त संस्करण नहीं है, लेकिन मेरा मानना ​​है कि उसने SCRIPT_FILENAMEपूरे शेबंग के रूप में देखा : "/ path/ to/ script.php/THIS/IS/PATH/INFO" उपरोक्त उदाहरण में (पहले से docroot हमेशा की तरह)।
    • Cgi.fix_pathinfo सक्षम होने के साथ, पीएचपी अब सही तरीके से पाता है "/ यह / है / path / जानकारी" के ऊपर के उदाहरण के लिए और इसे में डालता है PATH_INFOऔर SCRIPT_FILENAMEसिर्फ बात यह है कि अनुरोध किया जा रहा स्क्रिप्ट (बेशक docroot उपसर्ग के साथ) के लिए अंक हो जाता है।
    • नोट: जब PHP वास्तव में समर्थन करने के लिए चारों ओर हो गया PATH_INFO, तो उन्हें नई सुविधा के लिए कॉन्फ़िगरेशन सेटिंग जोड़ना पड़ा ताकि पुराने व्यवहार पर निर्भर स्क्रिप्ट चलाने वाले लोग नए PHP संस्करण चला सकें। इसलिए इसके लिए कॉन्फ़िगरेशन स्विच भी है। इसे शुरू से ही अंतर्निहित ("खतरनाक" व्यवहार के साथ) होना चाहिए था।
  • लेकिन PHP कैसे जानती है कि स्क्रिप्ट किस भाग की है और यह पथ की जानकारी क्या है? क्या होगा यदि URI कुछ इस तरह है:

    http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo

    • यह कुछ वातावरणों में एक जटिल प्रश्न हो सकता है। PHP में क्या होता है कि यह URI पथ का पहला भाग पाता है जो सर्वर के डॉक्रोट के तहत किसी भी चीज के अनुरूप नहीं है। इस उदाहरण के लिए, यह देखता है कि आपके सर्वर पर आपके पास "/droroot/path/to/script.php/THIS" नहीं है, लेकिन आपके पास निश्चित रूप से "/ docroot/path/to/script.php" है, इसलिए अब SCRIPT_FILENAMEनिर्धारित किया गया है और PATH_INFOबाकी मिलता है।
    • तो अब खतरे का अच्छा उदाहरण है जो कि नग्नेक्स डॉक्स में और हिरोज़े ( पोलर के जवाब में विस्तृत है (आप इस तरह के स्पष्ट उदाहरण के बारे में उधम मचाते नहीं हो सकते हैं) और भी स्पष्ट हो जाता है: हर्जो के उदाहरण (" http " // उदाहरण। com / foo.jpg / nonexistent.php "), PHP आपके docroot" /foo.jpg "पर एक फ़ाइल देखता है, लेकिन इसमें" /foo.jpg/nonexistent.php "नामक कुछ भी नहीं दिखता है, इसलिए इसे" /foo.jpg "कहा SCRIPT_FILENAMEजाता है। (फिर से, डॉक्रोट के साथ उपसर्ग किया गया) और PATH_INFO"/nonexistent.php" हो जाता है।
  • क्यों और कैसे खतरनाक हो सकता है यह अब स्पष्ट होना चाहिए:

    • वेब सर्वर वास्तव में गलती पर नहीं है - यह केवल यूआरआई को PHP के लिए प्रॉक्सी कर रहा है, जो सहज रूप से पाता है कि "foo.jpg" में वास्तव में PHP सामग्री शामिल है, इसलिए यह इसे निष्पादित करता है (अब आपको pwned किया गया है!)। यह विशेष रूप से प्रति से Nginx के लिए नहीं है।
  • असली समस्या यह है कि आप जाने अविश्वसनीय सामग्री sanitizing के बिना कहीं अपलोड किया और आप एक ही स्थान है, जो पीएचपी खुशी से जब यह कर सकते हैं कार्यान्वित करने के लिए अन्य मनमाना अनुरोध अनुमति देते हैं।
  • इस छलावे का उपयोग करके अनुरोधों को रोकने के लिए नेगनेक्स और अपाचे को बनाया या कॉन्फ़िगर किया जा सकता है, और ऐसा करने के लिए बहुत सारे उदाहरण हैं, जिसमें user2372674 का जवाब भी शामिल हैयह ब्लॉग लेख अच्छी तरह से समस्या की व्याख्या करता है, लेकिन यह सही समाधान याद आ रहा है।

  • हालांकि, सबसे अच्छा समाधान यह सुनिश्चित करना है कि PHP-FPM को सही ढंग से कॉन्फ़िगर किया गया है ताकि यह ".pp" के साथ समाप्त होने तक किसी फ़ाइल को निष्पादित न करे। यह ध्यान देने योग्य है कि PHP-FPM (~ 5.3.9 +?) के हाल के संस्करणों में यह डिफ़ॉल्ट रूप से है, इसलिए यह खतरा इतना अधिक समस्या नहीं है।

समाधान

यदि आपके पास PHP-FPM (~ 5.3.9 +?) का हालिया संस्करण है, तो आपको कुछ भी करने की आवश्यकता नहीं है, क्योंकि नीचे सुरक्षित व्यवहार पहले से ही डिफ़ॉल्ट है।

अन्यथा, php-fpm की www.confफ़ाइल ढूंढें (हो सकता है /etc/php-fpm.d/www.conf, आपके सिस्टम पर निर्भर करता है)। सुनिश्चित करें कि आपके पास यह है:

security.limit_extensions = .php

फिर, यह इन दिनों कई स्थानों पर डिफ़ॉल्ट है।

ध्यान दें कि यह एक हमलावर को ".php" फ़ाइल को वर्डप्रेस अपलोड फ़ोल्डर में अपलोड करने और उसी तकनीक का उपयोग करने से रोक नहीं सकता है। आपको अभी भी अपने अनुप्रयोगों के लिए अच्छी सुरक्षा की आवश्यकता है।


5
अच्छा जवाब! स्पष्ट करने के लिए: यदि, जैसा कि आप कहते हैं, PHP निर्धारित करता SCRIPT_FILENAMEहै कि fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;मेरे nginxविश्वास में एक रेखा क्यों है ? क्या यह PHP के प्रयास को SCRIPT_FILENAMEस्वयं के मूल्य का पता लगाने में मदद करता है?
1

का मान प्राप्त करने के लिए कोई कार्य है security.limit_extensions? मैंने कोशिश की phpinfo(), ini_get(security.limit_extensions)और ini_get_all()कोई सफलता नहीं मिली।
elbowlobstercowstand

धन्यवाद, अगर PHP-FPM (~ 5.3.9 +?) के हाल के संस्करणों में यह डिफ़ॉल्ट रूप से है, तो php7.1 को इसकी आवश्यकता क्यों है? या यह लेख गलत है?
येवगेनी अफानसेयेव

14

इसके बिना आप वेब सर्वर के लिए 'foo.jpg' जैसे php कोड के साथ फाइल अपलोड कर सकते हैं; फिर इसे http: //domain.tld/foo.jpg/nonexistent.php और वेब सर्वर स्टैक गलती से ओह कहेंगे; यह एक PHP है; मुझे इसे संसाधित करने की आवश्यकता है, यह foo.jpg / nonexistent.php खोजने में विफल रहेगा, इसलिए यह foo.jpg पर वापस आ जाएगा और phoo कोड के रूप में foo.jpg को संसाधित करेगा। यह खतरनाक है क्योंकि यह बहुत आसान घुसपैठ के लिए सिस्टम खोलता है; उदाहरण के लिए छवि अपलोड की अनुमति देने वाला कोई भी वेब एप्लिकेशन पिछले दरवाजे को अपलोड करने का उपकरण बन जाता है।

इससे बचने के लिए यूनिक्स सॉकेट के साथ php-fpm का उपयोग करने के बारे में; IMO यह समस्या को हल नहीं करेगा।


आप केवल वही दोहराते हैं जो मेरे द्वारा दिए गए लिंक पर पढ़ा जा सकता है। आप असली तंत्र की व्याख्या नहीं करते हैं। आपके उत्तर के लिए मूल्य वर्धित IMHO की आवश्यकता है।
टॉटर

6
यह सच हो सकता है, लेकिन आपके शीर्षक में सवाल है और उस सवाल का जवाब मेरी प्रतिक्रिया में है। यदि आप इसे स्पष्ट रूप से चाहते हैं; हाँ यह खतरनाक है; बहूत खतरनाक।
ह्रविजे

1 / मेरा उत्तर इसके शीर्षक तक सीमित नहीं है: इसमें एक निकाय है। 2 / user109322 ने आपको गलत साबित कर दिया है: जो भी मूल्य के लिए उपयोग किया जाता cgi.fix_pathinfoहै वह खतरनाक नहीं है, क्योंकि डिफ़ॉल्ट मान php-fpmसुरक्षित है (यह केवल .phpएक्सटेंशन के साथ फ़ाइलों को निष्पादित करेगा )।
टॉटर

2

सुरक्षा उपाय के रूप में नेग्नेक्स विकी में

if (!-f $document_root$fastcgi_script_name) {
    return 404;
}

स्थान ब्लॉक में शामिल है। अन्य ट्यूटोरियल में

try_files $uri =404;

का उपयोग किया जाता है, जिसे वैसा ही करना चाहिए, लेकिन नग्नेक्स विकी के अनुसार समस्याएं दे सकता है। इन विकल्पों के साथ, cgi.fix_pathinfo=1अब कोई समस्या नहीं होनी चाहिए। यहां और अधिक जानकारी मिल सकती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.