Selamlar sevgili TurkHackTeam üyeleri, bu konumda sizlere Server-Side Request Forgery'den bahsedip, bu zaafiyeti kullanarak ne gibi saldırılar yapabileceğimizi anlatmaya çalışacağım.
SSRF, saldırganın bir web uygulamasını kullanarak kötü amaçlı istekler göndermesini sağlayan bir güvenlik zafiyetidir. Bu zafiyet sayesinde saldırgan sitenin server-side kodu aracılığıyla, hedef sunucudaki kaynaklara erişmesine sebebiyet verebilir. SSRF, kısmi olarak DBV'ye benzer ve hassas verilere ulaşılmasını sağlar.
SSRF Çalışma Prensibi
SSRF zafiyetinin temel çalışma prensibi, bir web uygulamasında kullanıcıdan alınan bir URL ile bu URL’ye istek göndermektir. Bu sistem kullanılarak server tarafına kötü niyetli bir istek yönlendirebiliriz.
SSRF Neleri Tehdit Ediyor?
İç Ağ Kaynaklarına Erişim: SSRF ile sadece dışarıya değil aynı zamanda web uygulamasının çalıştığı sunucudaki iç kaynaklara da erişebiliriz.
Veri Sızıntısı: Uygulamanın bulunduğu ağdaki veritabanlarına erişim sağlayıp bu veritabanındaki verileri ele geçirebiliriz.
DoS Saldırıları: Sunucu içerisindeki hizmetlere aşırı istek göndererek devre dışı bırakabiliriz.
Kötü Amaçlı Yazılım Dağıtımı: İç ağdaki sunucuya kötü amaçlı yazılımlar yükleyip bunları çalıştırabiliriz.
Şimdi örnek olması açısından localhost üzerinden aslında bu işlemin tam olarak ne yaptığını anlatalım;
PHP:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>SSRF Örneği</title>
</head>
<body>
<h1>SSRF Uygulaması</h1>
<form method="POST">
<label for="url">URL Girin:</label>
<input type="text" name="url" id="url" required>
<button type="submit">Gönder</button>
</form>
<?php
if (isset($_POST['url'])) {
$url = $_POST['url'];
$response = file_get_contents($url);
echo '<br><textarea rows="50" cols="100"><pre>' . htmlspecialchars($response) . '</pre></textarea>';
}
?>
</body>
</html>
Gördüğünüz üzere bir form yaptık, formda kullanıcıdan herhangi bir URL girdisi alıyoruz, alınan URL girdisine istek gönderip URL'deki veriyi ekrana bastırabiliyoruz.
Nasıl korunabiliriz?
Giriş Validasyonu: Kullanıcı girdilerini kontrol edebilir yalnızca belirli alan adlarına izin verebiliriz.
PHP:
if (filter_var($url, FILTER_VALIDATE_URL) === false) {
echo '<pre>' . htmlspecialchars("Geçersiz URL!") . '</pre>';
exit;
}
IP Filtreleme: İç IP adreslerine (127.0.0.1, 192.168.x.x) veya belirli bir IP aralığına erişimi sınırlayabiliriz.
PHP:
$parsed_url = parse_url($url);
$host = $parsed_url['host'] ?? '';
if (filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
echo '<pre>' . htmlspecialchars("İç IP adresine veya özel bir ağa erişim engellendi!") . '</pre>';
exit;
}
Zaman Aşımı ve Hata Yönetimi: Dış URL istekleri için zaman aşımı ayarı yapıp, hata yönetimi arttırabiliriz.
PHP:
$context = stream_context_create(['http' => ['timeout' => 5]]);
Güvenli Protokoller: HTTPS protokolünü zorunlu kılabiliriz.
Ağ İzleme ve Günlük Kaydı: Ağdaki trafiği izleyip bu kayıtları tutabiliriz.