Cache Poisoning via URL discrepancies
यह उस तकनीकों का सारांश है जो https://portswigger.net/research/gotta-cache-em-all में प्रस्तावित की गई हैं ताकि कैश प्रॉक्सी और वेब सर्वर के बीच के भिन्नताओं का दुरुपयोग करते हुए कैश पॉइज़निंग हमले किए जा सकें।
इस हमले का लक्ष्य कैश सर्वर को यह सोचने के लिए मजबूर करना है कि एक स्थिर संसाधन लोड किया जा रहा है ताकि यह इसे कैश करे जबकि कैश सर्वर पथ का एक भाग कैश कुंजी के रूप में संग्रहीत करता है लेकिन वेब सर्वर एक अन्य पथ को हल करता है। वेब सर्वर वास्तविक पथ को हल करेगा जो एक गतिशील पृष्ठ को लोड करेगा (जो उपयोगकर्ता के बारे में संवेदनशील जानकारी, XSS जैसे दुर्भावनापूर्ण पेलोड या हमलावर की वेबसाइट से एक JS फ़ाइल लोड करने के लिए पुनर्निर्देशित कर सकता है)।
Delimiters
URL delimiters फ्रेमवर्क और सर्वर के अनुसार भिन्न होते हैं, जो यह प्रभावित करते हैं कि अनुरोध कैसे रूट किए जाते हैं और प्रतिक्रियाएँ कैसे संभाली जाती हैं। कुछ सामान्य मूल delimiters हैं:
सेमीकोलन: स्प्रिंग में मैट्रिक्स वेरिएबल के लिए उपयोग किया जाता है (जैसे
/hello;var=a/world;var1=b;var2=c
→/hello/world
)।डॉट: रूबी ऑन रेल्स में प्रतिक्रिया प्रारूप निर्दिष्ट करता है (जैसे
/MyAccount.css
→/MyAccount
)नल बाइट: OpenLiteSpeed में पथों को संक्षिप्त करता है (जैसे
/MyAccount%00aaa
→/MyAccount
)।न्यूलाइन बाइट: Nginx में URL घटकों को अलग करता है (जैसे
/users/MyAccount%0aaaa
→/account/MyAccount
)।
अन्य विशिष्ट delimiters इस प्रक्रिया का पालन करते हुए पाए जा सकते हैं:
चरण 1: गैर-कैश करने योग्य अनुरोधों की पहचान करें और यह देखने के लिए उनका उपयोग करें कि संभावित delimiters वाले URLs को कैसे संभाला जाता है।
चरण 2: पथों में यादृच्छिक प्रत्यय जोड़ें और यह निर्धारित करने के लिए सर्वर की प्रतिक्रिया की तुलना करें कि क्या कोई वर्ण delimiter के रूप में कार्य करता है।
चरण 3: संभावित delimiters को यादृच्छिक प्रत्यय से पहले पेश करें ताकि देखें कि क्या प्रतिक्रिया बदलती है, जो delimiter के उपयोग को इंगित करती है।
Normalization & Encodings
उद्देश्य: कैश और मूल सर्वरों में URL पार्सर URLs को सामान्यीकृत करते हैं ताकि एंडपॉइंट मैपिंग और कैश कुंजी के लिए पथ निकाले जा सकें।
प्रक्रिया: पथ delimiters की पहचान करता है, पथ को निकालता है और सामान्यीकृत करता है, वर्णों को डिकोड करके और डॉट-सेगमेंट को हटा देता है।
Encodings
विभिन्न HTTP सर्वर और प्रॉक्सी जैसे Nginx, Node, और CloudFront delimiters को अलग-अलग डिकोड करते हैं, जिससे CDNs और मूल सर्वरों के बीच असंगतता उत्पन्न होती है जिसे शोषित किया जा सकता है। उदाहरण के लिए, यदि वेब सर्वर इस परिवर्तन को करता है /myAccount%3Fparam
→ /myAccount?param
लेकिन कैश सर्वर कुंजी के रूप में पथ /myAccount%3Fparam
को रखता है, तो एक असंगतता है।
इन असंगतताओं की जांच करने का एक तरीका यह है कि पथ को बिना किसी एन्कोडिंग के लोड करने के बाद विभिन्न वर्णों को URL एन्कोडिंग के साथ अनुरोध भेजें और जांचें कि क्या एन्कोडेड पथ की प्रतिक्रिया कैश की गई प्रतिक्रिया से आई थी।
डॉट सेगमेंट
जहाँ डॉट शामिल होते हैं, वहाँ पथ सामान्यीकरण भी कैश पॉइज़निंग हमलों के लिए बहुत दिलचस्प है। उदाहरण के लिए, /static/../home/index
या /aaa..\home/index
, कुछ कैश सर्वर इन पथों को उनके साथ कुंजी के रूप में कैश करेंगे जबकि अन्य पथ को हल करेंगे और /home/index
को कैश कुंजी के रूप में उपयोग करेंगे।
जैसे पहले, इस प्रकार के अनुरोध भेजना और यह जांचना कि क्या प्रतिक्रिया कैश से प्राप्त की गई थी, यह पहचानने में मदद करता है कि क्या /home/index
के लिए प्रतिक्रिया वही है जो उन पथों के अनुरोध किए जाने पर भेजी गई थी।
Static Resources
कई कैश सर्वर हमेशा एक प्रतिक्रिया को कैश करेंगे यदि इसे स्थिर के रूप में पहचाना गया। यह इस कारण हो सकता है:
एक्सटेंशन: Cloudflare हमेशा निम्नलिखित एक्सटेंशन वाले फ़ाइलों को कैश करेगा: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
एक कैश को गतिशील प्रतिक्रिया संग्रहीत करने के लिए मजबूर करना संभव है एक delimiter और एक स्थिर एक्सटेंशन का उपयोग करके जैसे
/home$image.png
का अनुरोध/home$image.png
को कैश करेगा और मूल सर्वर/home
के साथ प्रतिक्रिया देगाअच्छी तरह से ज्ञात स्थिर निर्देशिकाएँ: निम्नलिखित निर्देशिकाएँ स्थिर फ़ाइलें रखती हैं और इसलिए उनकी प्रतिक्रिया को कैश किया जाना चाहिए: /static, /assets, /wp-content, /media, /templates, /public, /shared
एक कैश को गतिशील प्रतिक्रिया संग्रहीत करने के लिए मजबूर करना संभव है एक delimiter, एक स्थिर निर्देशिका और डॉट्स का उपयोग करके जैसे:
/home/..%2fstatic/something
/static/something
को कैश करेगा और प्रतिक्रिया होगी/home
स्थिर निर्देशिकाएँ + डॉट्स:
/static/..%2Fhome
या/static/..%5Chome
का अनुरोध जैसा है वैसा कैश किया जा सकता है लेकिन प्रतिक्रिया/home
हो सकती हैस्थिर फ़ाइलें: कुछ विशिष्ट फ़ाइलें हमेशा कैश की जाती हैं जैसे
/robots.txt
,/favicon.ico
, और/index.html
। जिसे इस तरह से दुरुपयोग किया जा सकता है जैसे/home/..%2Frobots.txt
जहाँ कैश/robots.txt
को संग्रहीत कर सकता है और मूल सर्वर/home
के लिए प्रतिक्रिया देता है।
Last updated