
Nginx CVE-2013-4547 URI पार्सिंग भेद्यता प्रदर्शित करने वाली Docker-आधारित प्रयोगशाला, विशेषाधिकार बाईपास और कोड निष्पादन के लिए चरण-दर-चरण शोषण के साथ।
प्रभावित संस्करण: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
संदर्भ लिंक:
यह भेद्यता वास्तव में कोड निष्पादन से बहुत अधिक संबंधित नहीं है। इसका मुख्य कारण अनुरोध के URI का गलत तरीके से पार्स करना और उपयोगकर्ता द्वारा अनुरोधित फ़ाइल नाम को गलत तरीके से प्राप्त करना है, जिससे अनुमति बाईपास और कोड निष्पादन जैसे संबंधित प्रभाव उत्पन्न होते हैं।
उदाहरण के लिए, जब Nginx .php से समाप्त होने वाले अनुरोध को मैच करता है, तो वह उसे fastcgi द्वारा पार्स करने के लिए भेज देता है। सामान्य कॉन्फ़िगरेशन इस प्रकार है:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
सामान्य परिस्थितियों में (जब pathinfo बंद हो), केवल .php एक्सटेंशन वाली फ़ाइलें ही fastcgi को पार्स करने के लिए भेजी जाती हैं।
जबकि CVE-2013-4547 मौजूद होने पर, हम 1.gif[0x20][0x00].php का अनुरोध करते हैं; यह URI रेगेक्स \.php$ से मैच कर सकता है, इसलिए यह इस Location ब्लॉक में प्रवेश कर सकता है। लेकिन प्रवेश के बाद, Nginx गलती से यह मान लेता है कि अनुरोधित फ़ाइल 1.gif[0x20] है, और उसे SCRIPT_FILENAME के मान के रूप में fastcgi को भेज देता है।
fastcgi SCRIPT_FILENAME के मान के आधार पर पार्स करता है, जिसके परिणामस्वरूप अंततः पार्सिंग भेद्यता उत्पन्न होती है।
इसलिए, हमें केवल एक ऐसी फ़ाइल अपलोड करनी होती है जिसके अंत में स्पेस हो, और PHP उसे पार्स कर लेगी।
एक और उदाहरण लें: कई वेबसाइटें बैकएंड तक पहुंच के लिए IP प्रतिबंध लगाती हैं:
location /admin/ {
allow 127.0.0.1;
deny all;
}
हम निम्न URI का अनुरोध कर सकते हैं: /test[0x20]/../admin/index.php। यह URI location के बाद वाले /admin/ से मैच नहीं होगा, जिससे उसका IP सत्यापन बायपास हो जाता है; लेकिन अंततः यह /test[0x20]/../admin/index.php फ़ाइल, यानी /admin/index.php, का अनुरोध करता है और बैकएंड तक सफलतापूर्वक पहुंच जाता है। (इसके लिए एक test नामक निर्देशिका होनी चाहिए — यह Linux प्रणाली की विशेषता है। यदि ऐसी निर्देशिका मौजूद नहीं है, तो पिछले स्तर पर जाने पर भी 'फ़ाइल मौजूद नहीं है' त्रुटि उत्पन्न होगी; Windows में यह सीमा नहीं है।)
भेद्यता वातावरण प्रारंभ करें:
docker-compose build
docker-compose up -d
वातावरण प्रारंभ होने के बाद, http://your-ip:8080/ पर जाकर एक अपलोड पेज देखा जा सकता है।
यह वातावरण ब्लैकलिस्ट सत्यापन का उपयोग करता है; हम php एक्सटेंशन वाली फ़ाइल अपलोड नहीं कर सकते, अतः हमें CVE-2013-4547 का उपयोग करना होगा। हम एक 1.gif अपलोड करते हैं, ध्यान दें कि अंत में स्पेस है:

http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php पर पहुंचने पर, आप पाएंगे कि PHP पार्स हो चुका है:

ध्यान दें, [0x20] स्पेस है, [0x00] \0 है, और इन दोनों वर्णों को एन्कोड करने की आवश्यकता नहीं है।