diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index fdacb0e11..0e81d9f78 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,15 +1,15 @@ -# विशेष HTTP हेडर +# विशेष HTTP हेडर्स {{#include ../../banners/hacktricks-training.md}} -## वर्डलिस्ट और उपकरण +## वर्डलिस्ट्स & टूल्स - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) -## स्थान बदलने के लिए हेडर +## स्थान बदलने वाले हेडर्स -**IP स्रोत** को फिर से लिखें: +IP स्रोत को बदलें: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,110 +26,132 @@ - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` -- `Connection: close, X-Forwarded-For` (हॉप-बाय-हॉप हेडर की जांच करें) +- `Connection: close, X-Forwarded-For` (Check hop-by-hop headers) -**स्थान** को फिर से लिखें: +स्थान पुनर्लेखन: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## हॉप-बाय-हॉप हेडर +## Hop-by-Hop हेडर्स -एक हॉप-बाय-हॉप हेडर एक हेडर है जिसे वर्तमान में अनुरोध को संभालने वाले प्रॉक्सी द्वारा संसाधित और उपभोग करने के लिए डिज़ाइन किया गया है, न कि एक एंड-टू-एंड हेडर। +Hop-by-hop header एक ऐसा header है जिसे वर्तमान में request को संभाल रहे proxy द्वारा प्रोसेस और उपयोग करने के लिए बनाया गया है, न कि एक end-to-end header की तरह। - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} -## HTTP अनुरोध स्मगलिंग +## HTTP Request Smuggling - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} -## कैश हेडर +## Expect हेडर -**सर्वर कैश हेडर**: +क्लाइंट `Expect: 100-continue` हेडर भेज सकता है और फिर सर्वर `HTTP/1.1 100 Continue` के साथ जवाब दे सकता है ताकि क्लाइंट request का body भेजना जारी रख सके। हालाँकि, कुछ proxies इस हेडर को पसंद नहीं करते। + +`Expect: 100-continue` के रोचक परिणाम: +- HEAD request में body भेजने पर सर्वर ने यह ध्यान नहीं रखा कि HEAD requests में आमतौर पर body नहीं होती, और कनेक्शन तब तक खुला रखा जब तक timeout नहीं हुआ। +- कुछ सर्वरों ने अजीब डेटा भेजा: response में socket से पढ़ा गया random data, secret keys या यहां तक कि इससे front-end को header values हटाने से रोका जा सकता था। +- इससे एक `0.CL` desync भी हुआ क्योंकि backend ने 100 की जगह 400 response दिया, लेकिन proxy front-end body भेजने के लिए तैयार था, तो उसने body भेज दी और backend ने इसे एक नए request के रूप में लिया। +- `Expect: y 100-continue` जैसी वैरिएशन ने भी `0.CL` desync पैदा किया। +- एक समान गलती में जहाँ backend ने 404 से जवाब दिया, उसने `CL.0` desync जेनरेट किया क्योंकि malicious request में एक `Content-Length` दर्शाया गया था, तो backend malicious request + अगले request (victim) के `Content-Length` बाइट्स भी भेज देता है; इससे queue में desync होता है क्योंकि backend ने malicious request के लिए 404 भेज दिया + victim request का response, पर front-end ने माना कि केवल 1 request ही भेजा गया था, इसलिए दूसरा response दूसरे victim को भेज दिया गया और उसके response ने अगले को भेजा... + +HTTP Request Smuggling के बारे में अधिक जानकारी के लिए देखें: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + +## Cache हेडर्स + +**सर्वर कैश हेडर्स**: + +- **`X-Cache`** response में मान के रूप में **`miss`** दिखा सकता है जब request cached नहीं था और **`hit`** जब यह cached था। +- समान व्यवहार header **`Cf-Cache-Status`** में भी देखा जा सकता है। +- **`Cache-Control`** बताता है कि कोई resource cache किया जा रहा है और अगली बार कब तक वह resource cached रहेगा: `Cache-Control: public, max-age=1800` +- **`Vary`** अक्सर response में उन अतिरिक्त headers को सूचित करने के लिए इस्तेमाल होता है जिन्हें cache key का हिस्सा माना जाता है, भले ही वे सामान्यतः cache key में शामिल न हों। +- **`Age`** उस समय को सेकेंड में परिभाषित करता है जो ऑब्जेक्ट proxy cache में रहा है। +- **`Server-Timing: cdn-cache; desc=HIT`** भी संकेत देता है कि कोई resource cached था। -- **`X-Cache`** में प्रतिक्रिया का मान **`miss`** हो सकता है जब अनुरोध कैश नहीं किया गया था और मान **`hit`** हो सकता है जब इसे कैश किया गया है -- हेडर **`Cf-Cache-Status`** में समान व्यवहार -- **`Cache-Control`** यह संकेत करता है कि क्या एक संसाधन कैश किया जा रहा है और अगली बार कब संसाधन फिर से कैश किया जाएगा: `Cache-Control: public, max-age=1800` -- **`Vary`** अक्सर प्रतिक्रिया में **अतिरिक्त हेडर** को **कैश कुंजी का हिस्सा** के रूप में संकेत करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः अनकुंजीकृत हों। -- **`Age`** उस समय को परिभाषित करता है जो वस्तु प्रॉक्सी कैश में रही है। -- **`Server-Timing: cdn-cache; desc=HIT`** यह भी संकेत करता है कि एक संसाधन कैश किया गया था {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**स्थानीय कैश हेडर**: +**लोकल कैश हेडर्स**: -- `Clear-Site-Data`: हेडर जो संकेत करता है कि कैश को हटाया जाना चाहिए: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: उस दिनांक/समय को शामिल करता है जब प्रतिक्रिया समाप्त होनी चाहिए: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` -- `Pragma: no-cache` `Cache-Control: no-cache` के समान -- `Warning`: **`Warning`** सामान्य HTTP हेडर संदेश की स्थिति के साथ संभावित समस्याओं के बारे में जानकारी प्रदान करता है। एक प्रतिक्रिया में एक से अधिक `Warning` हेडर दिखाई दे सकते हैं। `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Clear-Site-Data`: कैश जो हटाना चाहिए उसे सूचित करने वाला हेडर: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: response के expire होने की date/time बताता है: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Pragma: no-cache` का व्यवहार `Cache-Control: no-cache` के समान है +- `Warning`: सामान्य HTTP header `Warning` संदेश की स्थिति में संभावित समस्याओं के बारे में जानकारी रखता है। response में एक से ज्यादा `Warning` header दिख सकते हैं। उदाहरण: `Warning: 110 anderson/1.3.37 "Response is stale"` -## शर्तें +## Conditionals -- इन हेडरों का उपयोग करने वाले अनुरोध: **`If-Modified-Since`** और **`If-Unmodified-Since`** केवल तब डेटा के साथ उत्तर दिया जाएगा जब प्रतिक्रिया हेडर **`Last-Modified`** में एक अलग समय हो। -- **`If-Match`** और **`If-None-Match`** का उपयोग करने वाले शर्तीय अनुरोध एक Etag मान का उपयोग करते हैं ताकि वेब सर्वर प्रतिक्रिया की सामग्री भेजे यदि डेटा (Etag) बदल गया है। `Etag` HTTP प्रतिक्रिया से लिया जाता है। -- **Etag** मान आमतौर पर प्रतिक्रिया की **सामग्री** के आधार पर **गणना की जाती है**। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` यह संकेत करता है कि `Etag` **37 बाइट्स** का **Sha1** है। +- ऐसे requests जो इन headers का उपयोग करते हैं: **`If-Modified-Since`** और **`If-Unmodified-Since`** केवल तब डेटा के साथ उत्तर देंगे जब response header **`Last-Modified`** में समय अलग हो। +- Conditional requests जो **`If-Match`** और **`If-None-Match`** का उपयोग करते हैं, वे Etag वैल्यू का उपयोग करते हैं ताकि web server response का content तभी भेजे जब डेटा (Etag) बदल गया हो। `Etag` HTTP response से लिया जाता है। +- **Etag** मान आमतौर पर response की सामग्री पर आधारित होता है। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` सूचित करता है कि `Etag` 37 bytes का Sha1 है। -## रेंज अनुरोध +## Range requests -- **`Accept-Ranges`**: संकेत करता है कि क्या सर्वर रेंज अनुरोधों का समर्थन करता है, और यदि हां, तो रेंज को किस इकाई में व्यक्त किया जा सकता है। `Accept-Ranges: ` -- **`Range`**: उस दस्तावेज़ के भाग को इंगित करता है जिसे सर्वर को लौटाना चाहिए। उदाहरण के लिए, `Range:80-100` मूल प्रतिक्रिया के 80 से 100 बाइट्स को 206 Partial Content स्थिति कोड के साथ लौटाएगा। अनुरोध से `Accept-Encoding` हेडर को हटाना भी याद रखें। -- यह एक प्रतिक्रिया प्राप्त करने के लिए उपयोगी हो सकता है जिसमें मनमाने रूप से परावर्तित जावास्क्रिप्ट कोड हो जो अन्यथा बचाया जा सकता है। लेकिन इसका दुरुपयोग करने के लिए आपको अनुरोध में ये हेडर इंजेक्ट करने की आवश्यकता होगी। -- **`If-Range`**: एक शर्तीय रेंज अनुरोध बनाता है जो केवल तब पूरा होता है जब दिया गया etag या तिथि दूरस्थ संसाधन से मेल खाती है। इसका उपयोग संसाधन के असंगत संस्करणों से दो रेंज डाउनलोड करने से रोकने के लिए किया जाता है। -- **`Content-Range`**: यह इंगित करता है कि एक पूर्ण शरीर संदेश में एक आंशिक संदेश कहाँ संबंधित है। +- **`Accept-Ranges`**: यह बताता है कि server range requests को सपोर्ट करता है या नहीं, और अगर करता है तो किस unit में range व्यक्त किया जा सकता है। `Accept-Ranges: ` +- **`Range`**: यह उस document के हिस्से को दर्शाता है जिसे server को लौटाना चाहिए। उदाहरण के लिए, `Range:80-100` मूल response के बाइट 80 से 100 तक लौटायेगा और status code 206 Partial Content देगा। साथ ही, याद रखें request से `Accept-Encoding` header हटाना। +- यह उपयोगी हो सकता है जब आपको arbitrary reflected javascript code एक response में चाहिए जो अन्यथा escaped होता; लेकिन इसे abuse करने के लिए आपको request में ये headers inject करने होंगे। +- **`If-Range`**: यह एक conditional range request बनाता है जो केवल तभी पूरा किया जाता है जब दिया गया etag या date remote resource से मेल खाता हो। यह दो incompatible संस्करणों से दो ranges डाउनलोड होने से रोकने के लिए उपयोग होता है। +- **`Content-Range`**: यह बताता है कि partial message किस हिस्से में एक full body message में स्थित है। -## संदेश शरीर की जानकारी +## Message body information -- **`Content-Length`:** संसाधन का आकार, दशमलव संख्या में बाइट्स। -- **`Content-Type`**: संसाधन के मीडिया प्रकार को इंगित करता है -- **`Content-Encoding`**: संकुचन एल्गोरिदम को निर्दिष्ट करने के लिए उपयोग किया जाता है। -- **`Content-Language`**: मानव भाषा(ओं) का वर्णन करता है जो दर्शकों के लिए लक्षित है, ताकि यह उपयोगकर्ता को उनके अपने पसंदीदा भाषा के अनुसार भेद करने की अनुमति दे। -- **`Content-Location`**: लौटाए गए डेटा के लिए एक वैकल्पिक स्थान को इंगित करता है। +- **`Content-Length`:** resource का आकार, बाइट्स में दशमलव संख्या। +- **`Content-Type`**: resource का मीडिया प्रकार बताता है। +- **`Content-Encoding`**: compression algorithm निर्दिष्ट करने के लिए उपयोग होता है। +- **`Content-Language`**: दर्शकों के लिए इच्छित मानव भाषा(ओं) का वर्णन करता है, ताकि उपयोगकर्ता अपनी पसंदीदा भाषा के अनुसार अलग कर सकें। +- **`Content-Location`**: returned डेटा के लिए एक वैकल्पिक स्थान दर्शाता है। -पेंटेस्ट के दृष्टिकोण से यह जानकारी आमतौर पर "व्यर्थ" होती है, लेकिन यदि संसाधन **401** या **403** द्वारा **संरक्षित** है और आप इस **जानकारी** को **प्राप्त करने** का कोई **तरीका** खोज सकते हैं, तो यह **दिलचस्प** हो सकता है।\ -उदाहरण के लिए, एक HEAD अनुरोध में **`Range`** और **`Etag`** का संयोजन पृष्ठ की सामग्री को HEAD अनुरोधों के माध्यम से लीक कर सकता है: +pentest दृष्टिकोण से यह जानकारी आम तौर पर "बेकार" होती है, लेकिन अगर resource **protected** है (401 या 403) और आप किसी तरह ये **info** हासिल कर पाते हैं, तो यह **interesting** हो सकता है.\ +उदाहरण के लिए, एक HEAD request में **`Range`** और **`Etag`** के संयोजन से HEAD requests के माध्यम से पेज की सामग्री leak हो सकती है: -- `Range: bytes=20-20` हेडर के साथ एक अनुरोध और एक प्रतिक्रिया जिसमें `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` है यह लीक कर रहा है कि बाइट 20 का SHA1 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` है। +- एक request जिसमें header `Range: bytes=20-20` हो और response में `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` मौजूद हो, यह बताता है कि byte 20 का SHA1 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` है -## सर्वर जानकारी +## Server Info - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` -## नियंत्रण +## Controls -- **`Allow`**: यह हेडर यह संप्रेषित करने के लिए उपयोग किया जाता है कि एक संसाधन कौन से HTTP विधियों को संभाल सकता है। उदाहरण के लिए, इसे `Allow: GET, POST, HEAD` के रूप में निर्दिष्ट किया जा सकता है, जो इंगित करता है कि संसाधन इन विधियों का समर्थन करता है। -- **`Expect`**: क्लाइंट द्वारा उपयोग किया जाता है ताकि अनुरोध को सफलतापूर्वक संसाधित करने के लिए सर्वर को जो अपेक्षाएँ पूरी करनी चाहिए, उन्हें संप्रेषित किया जा सके। एक सामान्य उपयोग मामला `Expect: 100-continue` हेडर से संबंधित है, जो संकेत करता है कि क्लाइंट एक बड़ा डेटा पेलोड भेजने का इरादा रखता है। क्लाइंट ट्रांसमिशन के साथ आगे बढ़ने से पहले `100 (Continue)` प्रतिक्रिया की तलाश करता है। यह तंत्र नेटवर्क उपयोग को अनुकूलित करने में मदद करता है क्योंकि यह सर्वर की पुष्टि की प्रतीक्षा करता है। +- **`Allow`**: यह header बताने के लिए उपयोग होता है कि किसी resource को कौन-कौन से HTTP methods संभाल सकते हैं। उदाहरण: `Allow: GET, POST, HEAD`, जो संकेत देता है कि resource इन methods को सपोर्ट करता है। +- **`Expect`**: क्लाइंट द्वारा सर्वर से ऐसी अपेक्षाएँ बताने के लिए उपयोग होता है जिन्हें request को सफलतापूर्वक process करने के लिए पूरा करना जरूरी है। एक सामान्य उपयोग मामला `Expect: 100-continue` है, जो संकेत देता है कि क्लाइंट एक बड़ा डेटा payload भेजने का इरादा रखता है। क्लाइंट `100 (Continue)` response की प्रतीक्षा करता है इससे पहले कि वह transmission जारी रखे। यह network उपयोग को अनुकूलित करने में मदद करता है क्योंकि यह सर्वर की पुष्टि की प्रतीक्षा करता है। -## डाउनलोड +## Downloads -- HTTP प्रतिक्रियाओं में **`Content-Disposition`** हेडर यह निर्देशित करता है कि क्या एक फ़ाइल **इनलाइन** (वेबपृष्ठ के भीतर) प्रदर्शित की जानी चाहिए या एक **संलग्नक** (डाउनलोड की गई) के रूप में व्यवहार किया जाना चाहिए। उदाहरण के लिए: +- HTTP responses में **`Content-Disposition`** header यह निर्देश देता है कि कोई फाइल **inline** (वेबपेज के भीतर) दिखायी जाए या उसे **attachment** (डाउनलोड) के रूप में माना जाए। उदाहरण के लिए: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -यह मतलब है कि "filename.jpg" नामक फ़ाइल को डाउनलोड और सहेजने के लिए डिज़ाइन किया गया है। +इसका मतलब है कि "filename.jpg" नामक फ़ाइल डाउनलोड करके सेव करने के लिए निर्दिष्ट है। ## सुरक्षा हेडर -### सामग्री सुरक्षा नीति (CSP) +### Content Security Policy (CSP) + {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **विश्वसनीय प्रकार** +### **Trusted Types** -CSP के माध्यम से विश्वसनीय प्रकारों को लागू करके, अनुप्रयोगों को DOM XSS हमलों से सुरक्षित किया जा सकता है। विश्वसनीय प्रकार यह सुनिश्चित करते हैं कि केवल विशेष रूप से तैयार किए गए ऑब्जेक्ट्स, जो स्थापित सुरक्षा नीतियों के अनुरूप हैं, खतरनाक वेब API कॉल में उपयोग किए जा सकते हैं, इस प्रकार डिफ़ॉल्ट रूप से JavaScript कोड को सुरक्षित करते हैं। +Trusted Types को CSP के माध्यम से लागू करने पर एप्लिकेशन को DOM XSS हमलों से सुरक्षित किया जा सकता है। Trusted Types यह सुनिश्चित करते हैं कि केवल खास तरह से बनाए गए ऑब्जेक्ट, जो स्थापित सुरक्षा नीतियों के अनुरूप हों, ही खतरनाक web API कॉल्स में उपयोग किए जाएं, और इस तरह JavaScript कोड डिफ़ॉल्ट रूप से सुरक्षित रहता है। ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -148,19 +170,19 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -यह हेडर MIME प्रकार की स्निफ़िंग को रोकता है, एक प्रथा जो XSS कमजोरियों की ओर ले जा सकती है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME प्रकारों का सम्मान करें। +यह हेडर MIME type sniffing को रोकता है, एक अभ्यास जो XSS vulnerabilities का कारण बन सकता है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME types का सम्मान करें। ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -क्लिकजैकिंग से लड़ने के लिए, यह हेडर यह सीमित करता है कि दस्तावेज़ों को ``, `