Open Redirect (Açık Yönlendirme), bir web uygulamasının, kullanıcı tarafından kontrol edilen bir parametreye göre yönlendirme (redirect) yapması sonucu oluşan bir güvenlik zafiyetidir. Saldırgan, bu açığı kullanarak kullanıcıları kötü niyetli sitelere yönlendirebilir, phishing saldırıları düzenleyebilir veya güvenilir bir domainin itibarını suistimal edebilir.
Open Redirect Nasıl Çalışır?
Open Redirect, uygulamanın redirect, next, return_to, url gibi parametreleri doğrulamadan yönlendirme yapmasıyla oluşur.
Örnek Senaryo:
Bir web uygulaması, kullanıcı giriş yaptıktan sonra geldiği sayfaya yönlendiriyor:
text
Saldırgan URL'yi şu şekilde değiştirir:
text
Kullanıcı, giriş yaptıktan sonra saldırganın sitesine yönlendirilir.
Open Redirect Türleri:
1. HTTP 3xx Yönlendirmeleri
En yaygın tür. Sunucu, 301, 302, 303, 307 status kodları ile yönlendirme yapar.
Örnek:
text
HTTP/1.1 302 Found
Location: https://saldirgan.com
2. HTML Meta Refresh
HTML meta etiketi ile yönlendirme.
html
<meta http-equiv="refresh" content="0;url=https://saldirgan.com">
3. JavaScript Yönlendirmeleri
JavaScript ile yönlendirme.
javascript
window.location = "https://saldirgan.com";
4. URL Şeması Manipülasyonu
Farklı protokoller kullanarak yönlendirme.
text
Open Redirect Riskleri:
Phishing Saldırıları: Kullanıcılar güvenilir bir site olduğunu düşünerek saldırganın sitesine yönlendirilir.
Kimlik Avı (Credential Theft): Sahte login sayfaları ile kullanıcı bilgileri çalınır.
Malware Dağıtımı: Kullanıcılar zararlı yazılım içeren sitelere yönlendirilir.
İtibar Zararı: Güvenilir domainler, saldırganlar tarafından suistimal edilir.
Trust Bypass: Open Redirect, diğer zafiyetlerle (XSS, CSRF) birleştirilerek daha ciddi saldırılara dönüşebilir.
Open Redirect Nasıl Bulunur? (Test Teknikleri - Savunma Odaklı)
A. Manuel Keşif Teknikleri:
Parametre Analizi:
Tüm yönlendirme parametrelerini listeleyin:
redirect=, url=, next=, return_to=, goto=, forward=, path=, dest=, target=
Bu parametreleri test edin.
Temel Test:
text
hedef.com
Relative Path Testi:
text
Protokol Testi:
text
https://hedef.com/redirect?url=data:text/html,<script>alert(1)</script>
Encoding Bypass Testi:
text
Double Encoding:
text
Subdomain Testi:
text
B. Otomatik Test Araçları:
Burp Suite: Intruder ile payload listesi gönderin.
OpenRedirector: Otomatik open redirect tespit aracı.
Nuclei: Open redirect template'leri.
OWASP ZAP: Fuzzing ile redirect testi.
Koruma Teknikleri (Güvenli Geliştirme):
1. Beyaz Liste (Allow List) Kullanımı
Sadece güvenli domain'lere yönlendirmeye izin verin.
python
def validate_redirect_url(url):
ALLOWED_DOMAINS = [
'hedef.com',
'www.hedef.com',
'api.hedef.com',
'cdn.hedef.com'
]
from urllib.parse import urlparse
parsed = urlparse(url)
# Protokol kontrolü
if parsed.scheme not in ['http', 'https']:
return False
# Domain kontrolü
if parsed.hostname not in ALLOWED_DOMAINS:
return False
return True
# Kullanım
if validate_redirect_url(request.args.get('redirect')):
return redirect(request.args.get('redirect'))
else:
return redirect('/dashboard') # Varsayılan yönlendirme
2. Relative Path Kullanımı
Sadece relative path'lerle yönlendirme yapın.
python
def safe_redirect(url):
# Sadece relative path'lere izin ver
if url.startswith('/') and not url.startswith('//'):
return redirect(url)
else:
return redirect('/dashboard')
3. URL Validasyonu (Kapsamlı)
python
import re
from urllib.parse import urlparse
def is_safe_url(url):
# 1. URL'yi parse et
parsed = urlparse(url)
# 2. Sadece http/https protokolü
if parsed.scheme and parsed.scheme not in ['http', 'https']:
return False
# 3. Netloc kontrolü (hostname)
if parsed.netloc:
# 3.1. Sadece güvenli domain'lere izin ver
ALLOWED_HOSTS = ['hedef.com', 'www.hedef.com']
if parsed.hostname not in ALLOWED_HOSTS:
return False
# 3.2. DNS Rebinding kontrolü
import socket
try:
ip = socket.gethostbyname(parsed.hostname)
# Özel IP aralıklarını engelle
import ipaddress
ip_obj = ipaddress.ip_address(ip)
if ip_obj.is_private or ip_obj.is_loopback:
return False
except:
return False
# 4. Path traversal kontrolü
if '../' in url or '..\\' in url:
return False
# 5. JavaScript protokol kontrolü
if re.search(r'^(javascript|data|vbscript):', url, re.I):
return False
return True
4. Hash ile Doğrulama
Yönlendirme URL'lerini hash ile imzalayın.
python
import hmac
import hashlib
def generate_signed_redirect_url(url):
secret = 'GIZLI_ANAHTAR'
# URL'yi imzala
signature = hmac.new(
secret.encode(),
url.encode(),
hashlib.sha256
).hexdigest()
return f"/redirect?url={url}&sig={signature}"
def validate_signed_redirect(url, signature):
secret = 'GIZLI_ANAHTAR'
expected = hmac.new(
secret.encode(),
url.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
5. Referer Kontrolü
Yönlendirme isteğinin kendi sitenizden geldiğini doğrulayın.
python
def is_internal_referer(request):
referer = request.headers.get('Referer')
if not referer:
return False
parsed = urlparse(referer)
ALLOWED_HOSTS = ['hedef.com', 'www.hedef.com']
return parsed.hostname in ALLOWED_HOSTS
6. Framework Güvenlik Özellikleri
Django: is_safe_url() fonksiyonu
Flask: url_for() ile relative path'ler
Spring: RedirectView ile validasyon
ASP.NET: Url.IsLocalUrl() metodu
Django Örneği:
python
from django.utils.http import is_safe_url
def redirect_view(request):
redirect_to = request.GET.get('next')
if redirect_to and is_safe_url(redirect_to, allowed_hosts={'hedef.com'}):
return redirect(redirect_to)
return redirect('/')
Flask Örneği:
python
from flask import redirect, request, url_for
@app.route('/login')
def login():
next_url = request.args.get('next')
# Sadece relative path'lere izin ver
if next_url and next_url.startswith('/') and not next_url.startswith('//'):
return redirect(next_url)
return redirect(url_for('dashboard'))
Open Redirect Kontrol Listesi (Güvenlik Ekipleri İçin):
A. Parametre Tespiti:
Tüm yönlendirme parametreleri listelendi mi? (redirect, url, next, return_to, goto, vb.)
Bu parametrelerin kullanıldığı tüm endpoint'ler tespit edildi mi?
B. Validasyon Kontrolleri:
Beyaz liste kullanılıyor mu?
Relative path kullanılıyor mu?
Protokol kontrolü yapılıyor mu? (javascript:, data:, vb.)
Domain kontrolü yapılıyor mu?
Path traversal kontrolü yapılıyor mu?
Encoding bypass testleri yapıldı mı?
C. Framework Spesifik:
Framework'ün güvenli redirect fonksiyonları kullanılıyor mu?
Varsayılan redirect davranışı güvenli mi?
D. Log ve İzleme:
Tüm yönlendirme işlemleri loglanıyor mu?
Anormal domain'lere yapılan yönlendirmeler izleniyor mu?
Sık Yapılan Hatalar ve Çözümleri:
Hata Risk Çözüm
Sadece domain başlangıcı kontrolü Bypass Tam domain eşleştirmesi yap
Protokol kontrolü yok XSS http/https dışı protokolleri engelle
Relative path kullanımı eksik Open Redirect Sadece '/' ile başlayan path'lere izin ver
Encoding kontrolü yok Bypass URL decode yaparak kontrol et
WAF'a güvenme Eksik koruma Uygulama seviyesinde validasyon yap
Open Redirect Örnek Payload'ları (Test için):
text
1. Temel:
2. Relative:
3. Backslash:
4. Encoding:
5. Double Encoding:
6. JavaScript:
7. Data URI:
https://hedef.com/redirect?url=data:text/html,<script>alert(1)</script>
8. Subdomain:
9. @ Bypass:
10. Fragment:
Open Redirect Nasıl Çalışır?
Open Redirect, uygulamanın redirect, next, return_to, url gibi parametreleri doğrulamadan yönlendirme yapmasıyla oluşur.
Örnek Senaryo:
Bir web uygulaması, kullanıcı giriş yaptıktan sonra geldiği sayfaya yönlendiriyor:
text
Saldırgan URL'yi şu şekilde değiştirir:
text
Kullanıcı, giriş yaptıktan sonra saldırganın sitesine yönlendirilir.
Open Redirect Türleri:
1. HTTP 3xx Yönlendirmeleri
En yaygın tür. Sunucu, 301, 302, 303, 307 status kodları ile yönlendirme yapar.
Örnek:
text
HTTP/1.1 302 Found
Location: https://saldirgan.com
2. HTML Meta Refresh
HTML meta etiketi ile yönlendirme.
html
<meta http-equiv="refresh" content="0;url=https://saldirgan.com">
3. JavaScript Yönlendirmeleri
JavaScript ile yönlendirme.
javascript
window.location = "https://saldirgan.com";
4. URL Şeması Manipülasyonu
Farklı protokoller kullanarak yönlendirme.
text
Open Redirect Riskleri:
Phishing Saldırıları: Kullanıcılar güvenilir bir site olduğunu düşünerek saldırganın sitesine yönlendirilir.
Kimlik Avı (Credential Theft): Sahte login sayfaları ile kullanıcı bilgileri çalınır.
Malware Dağıtımı: Kullanıcılar zararlı yazılım içeren sitelere yönlendirilir.
İtibar Zararı: Güvenilir domainler, saldırganlar tarafından suistimal edilir.
Trust Bypass: Open Redirect, diğer zafiyetlerle (XSS, CSRF) birleştirilerek daha ciddi saldırılara dönüşebilir.
Open Redirect Nasıl Bulunur? (Test Teknikleri - Savunma Odaklı)
A. Manuel Keşif Teknikleri:
Parametre Analizi:
Tüm yönlendirme parametrelerini listeleyin:
redirect=, url=, next=, return_to=, goto=, forward=, path=, dest=, target=
Bu parametreleri test edin.
Temel Test:
text
Checkout
text
Protokol Testi:
text
https://hedef.com/redirect?url=data:text/html,<script>alert(1)</script>
Encoding Bypass Testi:
text
Double Encoding:
text
Subdomain Testi:
text
B. Otomatik Test Araçları:
Burp Suite: Intruder ile payload listesi gönderin.
OpenRedirector: Otomatik open redirect tespit aracı.
Nuclei: Open redirect template'leri.
OWASP ZAP: Fuzzing ile redirect testi.
Koruma Teknikleri (Güvenli Geliştirme):
1. Beyaz Liste (Allow List) Kullanımı
Sadece güvenli domain'lere yönlendirmeye izin verin.
python
def validate_redirect_url(url):
ALLOWED_DOMAINS = [
'hedef.com',
'www.hedef.com',
'api.hedef.com',
'cdn.hedef.com'
]
from urllib.parse import urlparse
parsed = urlparse(url)
# Protokol kontrolü
if parsed.scheme not in ['http', 'https']:
return False
# Domain kontrolü
if parsed.hostname not in ALLOWED_DOMAINS:
return False
return True
# Kullanım
if validate_redirect_url(request.args.get('redirect')):
return redirect(request.args.get('redirect'))
else:
return redirect('/dashboard') # Varsayılan yönlendirme
2. Relative Path Kullanımı
Sadece relative path'lerle yönlendirme yapın.
python
def safe_redirect(url):
# Sadece relative path'lere izin ver
if url.startswith('/') and not url.startswith('//'):
return redirect(url)
else:
return redirect('/dashboard')
3. URL Validasyonu (Kapsamlı)
python
import re
from urllib.parse import urlparse
def is_safe_url(url):
# 1. URL'yi parse et
parsed = urlparse(url)
# 2. Sadece http/https protokolü
if parsed.scheme and parsed.scheme not in ['http', 'https']:
return False
# 3. Netloc kontrolü (hostname)
if parsed.netloc:
# 3.1. Sadece güvenli domain'lere izin ver
ALLOWED_HOSTS = ['hedef.com', 'www.hedef.com']
if parsed.hostname not in ALLOWED_HOSTS:
return False
# 3.2. DNS Rebinding kontrolü
import socket
try:
ip = socket.gethostbyname(parsed.hostname)
# Özel IP aralıklarını engelle
import ipaddress
ip_obj = ipaddress.ip_address(ip)
if ip_obj.is_private or ip_obj.is_loopback:
return False
except:
return False
# 4. Path traversal kontrolü
if '../' in url or '..\\' in url:
return False
# 5. JavaScript protokol kontrolü
if re.search(r'^(javascript|data|vbscript):', url, re.I):
return False
return True
4. Hash ile Doğrulama
Yönlendirme URL'lerini hash ile imzalayın.
python
import hmac
import hashlib
def generate_signed_redirect_url(url):
secret = 'GIZLI_ANAHTAR'
# URL'yi imzala
signature = hmac.new(
secret.encode(),
url.encode(),
hashlib.sha256
).hexdigest()
return f"/redirect?url={url}&sig={signature}"
def validate_signed_redirect(url, signature):
secret = 'GIZLI_ANAHTAR'
expected = hmac.new(
secret.encode(),
url.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
5. Referer Kontrolü
Yönlendirme isteğinin kendi sitenizden geldiğini doğrulayın.
python
def is_internal_referer(request):
referer = request.headers.get('Referer')
if not referer:
return False
parsed = urlparse(referer)
ALLOWED_HOSTS = ['hedef.com', 'www.hedef.com']
return parsed.hostname in ALLOWED_HOSTS
6. Framework Güvenlik Özellikleri
Django: is_safe_url() fonksiyonu
Flask: url_for() ile relative path'ler
Spring: RedirectView ile validasyon
ASP.NET: Url.IsLocalUrl() metodu
Django Örneği:
python
from django.utils.http import is_safe_url
def redirect_view(request):
redirect_to = request.GET.get('next')
if redirect_to and is_safe_url(redirect_to, allowed_hosts={'hedef.com'}):
return redirect(redirect_to)
return redirect('/')
Flask Örneği:
python
from flask import redirect, request, url_for
@app.route('/login')
def login():
next_url = request.args.get('next')
# Sadece relative path'lere izin ver
if next_url and next_url.startswith('/') and not next_url.startswith('//'):
return redirect(next_url)
return redirect(url_for('dashboard'))
Open Redirect Kontrol Listesi (Güvenlik Ekipleri İçin):
A. Parametre Tespiti:
Tüm yönlendirme parametreleri listelendi mi? (redirect, url, next, return_to, goto, vb.)
Bu parametrelerin kullanıldığı tüm endpoint'ler tespit edildi mi?
B. Validasyon Kontrolleri:
Beyaz liste kullanılıyor mu?
Relative path kullanılıyor mu?
Protokol kontrolü yapılıyor mu? (javascript:, data:, vb.)
Domain kontrolü yapılıyor mu?
Path traversal kontrolü yapılıyor mu?
Encoding bypass testleri yapıldı mı?
C. Framework Spesifik:
Framework'ün güvenli redirect fonksiyonları kullanılıyor mu?
Varsayılan redirect davranışı güvenli mi?
D. Log ve İzleme:
Tüm yönlendirme işlemleri loglanıyor mu?
Anormal domain'lere yapılan yönlendirmeler izleniyor mu?
Sık Yapılan Hatalar ve Çözümleri:
Hata Risk Çözüm
Sadece domain başlangıcı kontrolü Bypass Tam domain eşleştirmesi yap
Protokol kontrolü yok XSS http/https dışı protokolleri engelle
Relative path kullanımı eksik Open Redirect Sadece '/' ile başlayan path'lere izin ver
Encoding kontrolü yok Bypass URL decode yaparak kontrol et
WAF'a güvenme Eksik koruma Uygulama seviyesinde validasyon yap
Open Redirect Örnek Payload'ları (Test için):
text
1. Temel:
2. Relative:
3. Backslash:
4. Encoding:
5. Double Encoding:
6. JavaScript:
7. Data URI:
https://hedef.com/redirect?url=data:text/html,<script>alert(1)</script>
8. Subdomain:
9. @ Bypass:
10. Fragment:
🔒 Bu içeriği görmek için giriş yapın