ÖNEMLİ NOT: Bu bölüm, güvenlik farkındalığı ve savunma amaçlıdır. Tüm testler yalnızca yetkili ortamlarda, yasal çerçevede gerçekleştirilmelidir.
Güncel SSRF Anlayışı
SSRF (Server-Side Request Forgery) , bir uygulamanın, kullanıcı tarafından kontrol edilen kaynaklara sunucu tarafında istek göndermesine olanak tanıyan bir güvenlik zafiyetidir. Saldırgan, bu açık sayesinde sunucunun erişebildiği iç sistemlere, servislere veya hassas verilere ulaşabilir.
SSRF Türleri ve Güncel Örnekler:
1. Basic SSRF (Temel SSRF)
Sunucu yanıtı doğrudan kullanıcıya gösterilir.
Güncel Örnek:
Bir görsel önizleme servisi
Webhook doğrulama uç noktaları
Doküman önizleme / dönüştürme servisleri
2. Blind SSRF (Kör SSRF)
Sunucu yanıtı gösterilmez ancak harici sistemler üzerinden istekler izlenir.
Güncel Örnek:
Webhook kayıt sistemleri
E-posta doğrulama servisleri (URL doğrulama)
3. Half-Blind SSRF
Sunucu hata mesajları veya zaman farkları ile bilgi sızdırır.
Bulut Ortamlarında SSRF ve IMDSv2:
Eski Yaklaşım (IMDSv1):
text
Basit GET isteği ile erişilebilirdi.
Güncel Yaklaşım (IMDSv2 - AWS, GCP, Azure):
PUT isteği ile token alınması gereklidir.
Token'ın ilgili meta-data isteğinde header olarak gönderilmesi gerekir.
Katmanlı koruma (hop limit, IP filtreleme) içerir.
IMDSv2 Koruma Mekanizmaları:
X-aws-ec2-metadata-token header'ı zorunludur.
X-aws-ec2-metadata-token-ttl-seconds ile token süresi sınırlanır.
Ağ seviyesinde (169.254.169.254) erişim kısıtlanabilir.
Hop limit: Token'ın sadece 1 atlama yapmasına izin verilir.
Güncel Örnek:
bash
# IMDSv2 doğru kullanımı (savunma tarafı)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
"file://" Protokolü Gerçeği
ÖNEMLİ: file:// desteği, SSRF'de her zaman çalışmaz. Bu tamamen şunlara bağlıdır:
HTTP İstemcisi:
curl → file:// desteği var
requests (Python) → file:// desteklemez (hata verir)
java.net.URL → file:// desteği var
http.Client (Go) → file:// desteklemez
axios (Node.js) → file:// desteklemez
Yapılandırma:
Çoğu modern framework varsayılan olarak file:// protokolünü engeller.
Kurumsal uygulamalarda güvenlik politikaları ile kısıtlanır.
Dosya Okuma Koşulları:
Dosya izinleri (read permissions)
Process çalıştırma yetkileri
Kapsülleme (container) kısıtlamaları
Test Yaklaşımı (Yetkili ortamda):
file:///etc/hosts → Çalışırsa risk yüksek
file:///proc/self/environ → Yüksek risk
file:///dev/null → Düşük risk (hata tespiti)
Savunma Odaklı Uygulama Teknikleri:
1. URL Validasyonu ve Filtreleme (Güncel ve Kapsamlı)
python
import ipaddress
from urllib.parse import urlparse
import socket
def validate_url_safely(url):
parsed = urlparse(url)
# Protokol kısıtlaması (SADECE http/https)
if parsed.scheme not in ['http', 'https']:
return False, "Sadece HTTP/HTTPS protokolüne izin verilir"
# Allow list kontrolü (tercih edilen yöntem)
ALLOWED_DOMAINS = ['api.ornek.com', 'cdn.ornek.com']
if parsed.hostname not in ALLOWED_DOMAINS:
return False, "Domain beyaz listede yok"
# Hostname çözümlemesi ve IP kontrolü
try:
ip_list = socket.getaddrinfo(parsed.hostname, None)
for addr in ip_list:
ip = ipaddress.ip_address(addr[4][0])
# IPv6 dahil tüm özel IP aralıklarını kontrol et
if (ip.is_private or
ip.is_loopback or
ip.is_multicast or
ip.is_link_local or
ip.is_unspecified):
return False, "Özel IP adresine erişim engellendi"
# Belirli IP aralıklarını blokla (güvenlik riski)
if ip in ipaddress.ip_network('169.254.0.0/16'): # Link-local
return False, "Metadata IP aralığı engellendi"
except Exception as e:
return False, f"DNS çözümleme hatası: {str(e)}"
return True, "URL güvenli"
# Örnek kullanım (yetkili test ortamında)
is_safe, message = validate_url_safely(user_input)
if not is_safe:
raise SecurityException(message)
2. DNS Rebinding Koruması (İleri Seviye)
python
def validate_with_dns_rebind_protection(url):
# İlk çözümleme
initial_ip = get_ip(url.hostname)
if not is_safe_ip(initial_ip):
return False
# İkinci çözümleme (gecikmeli)
import time
time.sleep(0.5)
second_ip = get_ip(url.hostname)
# IP değiştiyse DNS Rebinding saldırısı olabilir
if initial_ip != second_ip:
return False
return True
3. Ağ Seviyesi Korumaları
Network Segmentation: Sunucunun iç ağa erişimini sınırla
Firewall Kuralları: 169.254.169.254, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 çıkışlarını engelle
Egress Filtering: Sadece belirli IP'lere çıkışa izin ver
Container Security: Pod/Container seviyesinde ağ politikaları
4. Güvenli HTTP İstemcisi Yapılandırması
python
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# Güvenli session yapılandırması (savunma odaklı)
session = requests.Session()
# Protokol kısıtlaması (requests varsayılan olarak file:// desteklemez)
# Ancak yine de önlem:
session.adapters.clear() # Tüm adapter'ları temizle
session.mount('http://', CustomHTTPAdapter())
session.mount('https://', CustomHTTPSAdapter())
# file:// adapter'ı ekleme
# Zaman aşımı
session.timeout = (3, 10) # Bağlantı, okuma zaman aşımı
# Redirect kısıtlaması
session.max_redirects = 0
# Header filtreleme
session.headers.update({
'User-Agent': 'Security-Audit-Bot/1.0',
'Accept': 'application/json'
})
5. WAF'ın Rolü (Evet, tek başına çözüm değil)
WAF, SSRF için:
Yararlı: Bilinen IP aralıklarını engeller, payload'ları filtreler
Yetersiz: DNS rebinding, farklı gösterimler, internal IP'ler gibi durumlarda yetersiz kalabilir
Doğru Yaklaşım: WAF katmanı, uygulama seviyesi validasyon, ağ güvenliği ve izleme ile birlikte kullanılmalıdır.
Güvenlik Ekipleri İçin SSRF Kontrol Listesi (Yetkili Testlerde):
Tüm URL parametrelerini tespit et ve test planına ekle
Protokol kısıtlamalarını test et (http/https dışındakiler engellenmeli)
Domain beyaz listesini kontrol et
IP doğrulama mekanizmasını test et (Private IP'ler engellenmeli)
DNS rebinding korumasını doğrula
Metadata endpoint'lerine erişimi test et (IMDSv2 dahil)
file:// erişimini test et (beklenen davranış: hata veya engelleme)
WAF + Uygulama + Ağ katmanı kombinasyonunu değerlendir
Özet - Güvenli Geliştirme İlkeleri:
Sıfır Güven (Zero Trust): Hiçbir URL'ye varsayılan olarak güvenme
Beyaz Liste (Allow List): Sadece güvenli ve iş gerekliliği olan domain'lere izin ver
Derinlemesine Savunma (Defense in Depth): Uygulama + Ağ + WAF + İzleme
Düzenli Test: Yetkili ekipler tarafından periyodik penetrasyon testleri
Güncel Kal: Bulut ortamları, IMDSv2, yeni saldırı vektörlerini takip et
Güncel SSRF Anlayışı
SSRF (Server-Side Request Forgery) , bir uygulamanın, kullanıcı tarafından kontrol edilen kaynaklara sunucu tarafında istek göndermesine olanak tanıyan bir güvenlik zafiyetidir. Saldırgan, bu açık sayesinde sunucunun erişebildiği iç sistemlere, servislere veya hassas verilere ulaşabilir.
SSRF Türleri ve Güncel Örnekler:
1. Basic SSRF (Temel SSRF)
Sunucu yanıtı doğrudan kullanıcıya gösterilir.
Güncel Örnek:
Bir görsel önizleme servisi
Webhook doğrulama uç noktaları
Doküman önizleme / dönüştürme servisleri
2. Blind SSRF (Kör SSRF)
Sunucu yanıtı gösterilmez ancak harici sistemler üzerinden istekler izlenir.
Güncel Örnek:
Webhook kayıt sistemleri
E-posta doğrulama servisleri (URL doğrulama)
3. Half-Blind SSRF
Sunucu hata mesajları veya zaman farkları ile bilgi sızdırır.
Bulut Ortamlarında SSRF ve IMDSv2:
Eski Yaklaşım (IMDSv1):
text
Basit GET isteği ile erişilebilirdi.
Güncel Yaklaşım (IMDSv2 - AWS, GCP, Azure):
PUT isteği ile token alınması gereklidir.
Token'ın ilgili meta-data isteğinde header olarak gönderilmesi gerekir.
Katmanlı koruma (hop limit, IP filtreleme) içerir.
IMDSv2 Koruma Mekanizmaları:
X-aws-ec2-metadata-token header'ı zorunludur.
X-aws-ec2-metadata-token-ttl-seconds ile token süresi sınırlanır.
Ağ seviyesinde (169.254.169.254) erişim kısıtlanabilir.
Hop limit: Token'ın sadece 1 atlama yapmasına izin verilir.
Güncel Örnek:
bash
# IMDSv2 doğru kullanımı (savunma tarafı)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
"file://" Protokolü Gerçeği
ÖNEMLİ: file:// desteği, SSRF'de her zaman çalışmaz. Bu tamamen şunlara bağlıdır:
HTTP İstemcisi:
curl → file:// desteği var
requests (Python) → file:// desteklemez (hata verir)
java.net.URL → file:// desteği var
http.Client (Go) → file:// desteklemez
axios (Node.js) → file:// desteklemez
Yapılandırma:
Çoğu modern framework varsayılan olarak file:// protokolünü engeller.
Kurumsal uygulamalarda güvenlik politikaları ile kısıtlanır.
Dosya Okuma Koşulları:
Dosya izinleri (read permissions)
Process çalıştırma yetkileri
Kapsülleme (container) kısıtlamaları
Test Yaklaşımı (Yetkili ortamda):
file:///etc/hosts → Çalışırsa risk yüksek
file:///proc/self/environ → Yüksek risk
file:///dev/null → Düşük risk (hata tespiti)
Savunma Odaklı Uygulama Teknikleri:
1. URL Validasyonu ve Filtreleme (Güncel ve Kapsamlı)
python
import ipaddress
from urllib.parse import urlparse
import socket
def validate_url_safely(url):
parsed = urlparse(url)
# Protokol kısıtlaması (SADECE http/https)
if parsed.scheme not in ['http', 'https']:
return False, "Sadece HTTP/HTTPS protokolüne izin verilir"
# Allow list kontrolü (tercih edilen yöntem)
ALLOWED_DOMAINS = ['api.ornek.com', 'cdn.ornek.com']
if parsed.hostname not in ALLOWED_DOMAINS:
return False, "Domain beyaz listede yok"
# Hostname çözümlemesi ve IP kontrolü
try:
ip_list = socket.getaddrinfo(parsed.hostname, None)
for addr in ip_list:
ip = ipaddress.ip_address(addr[4][0])
# IPv6 dahil tüm özel IP aralıklarını kontrol et
if (ip.is_private or
ip.is_loopback or
ip.is_multicast or
ip.is_link_local or
ip.is_unspecified):
return False, "Özel IP adresine erişim engellendi"
# Belirli IP aralıklarını blokla (güvenlik riski)
if ip in ipaddress.ip_network('169.254.0.0/16'): # Link-local
return False, "Metadata IP aralığı engellendi"
except Exception as e:
return False, f"DNS çözümleme hatası: {str(e)}"
return True, "URL güvenli"
# Örnek kullanım (yetkili test ortamında)
is_safe, message = validate_url_safely(user_input)
if not is_safe:
raise SecurityException(message)
2. DNS Rebinding Koruması (İleri Seviye)
python
def validate_with_dns_rebind_protection(url):
# İlk çözümleme
initial_ip = get_ip(url.hostname)
if not is_safe_ip(initial_ip):
return False
# İkinci çözümleme (gecikmeli)
import time
time.sleep(0.5)
second_ip = get_ip(url.hostname)
# IP değiştiyse DNS Rebinding saldırısı olabilir
if initial_ip != second_ip:
return False
return True
3. Ağ Seviyesi Korumaları
Network Segmentation: Sunucunun iç ağa erişimini sınırla
Firewall Kuralları: 169.254.169.254, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 çıkışlarını engelle
Egress Filtering: Sadece belirli IP'lere çıkışa izin ver
Container Security: Pod/Container seviyesinde ağ politikaları
4. Güvenli HTTP İstemcisi Yapılandırması
python
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# Güvenli session yapılandırması (savunma odaklı)
session = requests.Session()
# Protokol kısıtlaması (requests varsayılan olarak file:// desteklemez)
# Ancak yine de önlem:
session.adapters.clear() # Tüm adapter'ları temizle
session.mount('http://', CustomHTTPAdapter())
session.mount('https://', CustomHTTPSAdapter())
# file:// adapter'ı ekleme
# Zaman aşımı
session.timeout = (3, 10) # Bağlantı, okuma zaman aşımı
# Redirect kısıtlaması
session.max_redirects = 0
# Header filtreleme
session.headers.update({
'User-Agent': 'Security-Audit-Bot/1.0',
'Accept': 'application/json'
})
5. WAF'ın Rolü (Evet, tek başına çözüm değil)
WAF, SSRF için:
Yararlı: Bilinen IP aralıklarını engeller, payload'ları filtreler
Yetersiz: DNS rebinding, farklı gösterimler, internal IP'ler gibi durumlarda yetersiz kalabilir
Doğru Yaklaşım: WAF katmanı, uygulama seviyesi validasyon, ağ güvenliği ve izleme ile birlikte kullanılmalıdır.
Güvenlik Ekipleri İçin SSRF Kontrol Listesi (Yetkili Testlerde):
Tüm URL parametrelerini tespit et ve test planına ekle
Protokol kısıtlamalarını test et (http/https dışındakiler engellenmeli)
Domain beyaz listesini kontrol et
IP doğrulama mekanizmasını test et (Private IP'ler engellenmeli)
DNS rebinding korumasını doğrula
Metadata endpoint'lerine erişimi test et (IMDSv2 dahil)
file:// erişimini test et (beklenen davranış: hata veya engelleme)
WAF + Uygulama + Ağ katmanı kombinasyonunu değerlendir
Özet - Güvenli Geliştirme İlkeleri:
Sıfır Güven (Zero Trust): Hiçbir URL'ye varsayılan olarak güvenme
Beyaz Liste (Allow List): Sadece güvenli ve iş gerekliliği olan domain'lere izin ver
Derinlemesine Savunma (Defense in Depth): Uygulama + Ağ + WAF + İzleme
Düzenli Test: Yetkili ekipler tarafından periyodik penetrasyon testleri
Güncel Kal: Bulut ortamları, IMDSv2, yeni saldırı vektörlerini takip et
🔒 Bu içeriği görmek için giriş yapın