Geçtiğimiz haftalarda yayınlanan bir makalede, URL kodlamasının önemine ve PHP güvenlik kontrollerinin nasıl atlayabileceğine değinmiştim. Bir geliştirici, bu konuya dair önemli bir soruyla yanıt aradı: "Eğer tek bir urldecode() fonksiyonu çift kodlamalarla nasıl yeniliyorsa, neden sürekli kod çözme yapmak mantıklı olmasın? Peki bu, saldırganların sunucunun CPU’sunu tüketmesine yol açmaz mı?" Bu soru, üzerinde durulması gereken ciddi bir güvenlik açığını gündeme getiriyor.
URL Kod Çözme Bombası Nedir?
URL kod çözme bombası, saldırganların sunucuların kaynaklarını tüketmek amacıyla tasarladığı bir saldırı yöntemidir. Temel olarak, saldırganlar URL’ye derinlemesine yerleştirilmiş kodlamalar ekleyerek sunucunun her istek için gereksiz yere çok sayıda kod çözme işlemi yapmasını sağlar. Bu saldırı, sıkıştırılmış dosyaların genişleyerek sistem kaynaklarını tüketmesine benzeyen bir mantığa sahiptir, ancak dosya sıkıştırma yerine URL kod çözme işlemi üzerinden gerçekleşir.
Bu saldırının nasıl işlediğini bir örnek üzerinden inceleyelim. Eğer sunucunuzdaki kod, urldecode() fonksiyonunu sürekli olarak çalıştırıyorsa, saldırganlar aşağıdaki gibi bir URL gönderebilir:
%25252525252527Her kod çözme işlemi sırasında şu adımlar gerçekleşir:
- 1. Adım:
%25252525252527→%252525252527 - 2. Adım:
%252525252527→%2525252527 - 3. Adım:
%2525252527→%25252527 - 4. Adım:
%25252527→%252527 - 5. Adım:
%252527→%27 - 6. Adım:
%27→%27 - 7. Adım:
%27→'
Tek bir karakteri kodundan çözmek için yedi adım gerekiyor. Bu durumda, sunucu her istek için gereksiz kod çözme işlemleri yapmak zorunda kalıyor. Tek bir istek genellikle sorun yaratmaz, ancak sürekli olarak bu tür istekler gönderildiğinde sunucu kaynakları ciddi şekilde tükenebilir.
Bu Saldırının Tespit Edilmesi Neden Zor?
Bu saldırı tipi, standart penetrasyon testlerinde genellikle tespit edilemez. Saldırının etkileri, genellikle üretim ortamında ve olağandışı trafik desenleri altında sunucu performansının yavaşladığının fark edilmesiyle ortaya çıkar. Saldırganın amacı veri çalmak ya da kimlik doğrulamasını bypass etmek değildir. Tek hedefi, sunucunun meşru kullanıcıların taleplerine kıyasla daha fazla kaynak harcamasını sağlamaktır.
Özellikle tek başına çalışan geliştiriciler veya sınırlı sunucu kaynaklarına sahip küçük ajanslar için bu tür saldırılar, performans düşüşlerine yol açabilir.
Güvenlik Açığını Kapatmanın En İyi Yolu: Kod Çözme Sınırlaması
Bu sorunun çözümü için yapılması gereken şey, kod çözme işlemlerinin sayısını sınırlamaktır. Aşağıdaki örnekte, maksimum üç kod çözme işlemiyle sınırlandırılmış bir yaklaşım gösterilmektedir:
$query = $_SERVER['QUERY_STRING'] ?? '';
$maxPasses = 3;
$i = 0;
$previous = null;
while ($previous !== $query && $i < $maxPasses) {
$previous = $query;
$query = urldecode($query);
$i++;
}
$query = strtolower($query);Üç kod çözme işlemi, birçok uygulama için makul bir sınırdır. Ancak doğru sınır, mimariye, kullanılan framework’e ve tehdit modelinize bağlı olarak değişebilir. Ayrıca, kod çözme işlemi sırasında string değişmediğinde döngü erken sonlandırıldığından, tek kodlamalar yalnızca bir işlemde çözülür.
Tek kodlama, saldırıların en yaygın kaçınma yöntemidir. Çift kodlama ise bir sonraki adımdır. Derinlemesine kodlamalar genellikle uygulama koduna ulaşmadan önce web sunucusu, reverse proxy veya PHP framework’ü tarafından zaten normalize edilir.
Kod Çözme Mantığını Uygulamadan Önce Dikkat Edilmesi Gerekenler
Uygulama katmanına özel kod çözme mantığı eklemeden önce, web sunucunuzun, reverse proxy’nizin, framework’ünüzün ve PHP’nin gelen istekleri nasıl normalleştirdiğini anlamanız gerekir. Birden fazla kod çözme katmanı, hem güvenlik hem de doğruluk açısından sorunlara yol açabilir.
Örneğin, Laravel kullanıyorsanız, istek verilerinin zaten çeşitli şekillerde normalleştirildiğini unutmayın. Uygulama kodunuza geçmeden önce URL kod çözme işlemlerinin nerede gerçekleştiğini anlamak önemlidir.
İmza Tabanlı Tespitin Sınırları
Kod çözme sınırlaması uygulansa bile, imza tabanlı tespit yöntemleri saldırganların yeni yöntemlerine karşı yetersiz kalabilir. Saldırganlar, bilinen saldırı kalıplarını atlamak için alternatif sözdizimleri, veritabanı özel kodlamaları veya yorum satırları kullanabilir.
Örneğin, aşağıdaki gibi bir SQL enjeksiyon girişimi:
SE/*comment*/LECT * FR/*comment*/OM usersBu durumda, uygulama select anahtar kelimesini arasa bile, saldırı SE/*comment*/LECT şeklinde dağıtılarak tespit edilemeyebilir. Saldırının başarısı, daha sonraki işlem adımlarına bağlı olacaktır.
İmza tabanlı tespit yöntemleri yalnızca bilinen kötü kalıpları yakalayabilir. Bilinmeyen saldırıları ise gözden kaçırabilir.
Güvenlik Düzeltmelerinin Yan Etkilerini Anlamak
Bu nokta, çoğu güvenlik eğitiminde atlanan kritik bir konudur. Bir güvenlik önlemi uygularken, yalnızca bir kapıyı kapatmıyorsunuz; aynı zamanda başka bir kapıyı da açmış olabilirsiniz. Her güvenlik düzeltmesi sonrasında şu soruyu sormalısınız: "Bu düzeltme, aslında ne gibi yeni riskler ortaya çıkarabilir?"
Sınırsız URL kod çözme, kodlama tabanlı kaçınmaları durdurabilir, ancak kaynak tükenmesine yol açabilir. Sınırlı kod çözme ise hem CPU kullanımını sınırlar hem de derinlemesine kodlamaları yukarıdaki katmanlara bırakır.
Her güvenlik kararı bir ödünleşimdir. Bu ödünleşimi anlamak, güvenlik tiyatrosu oluşturan geliştiriciler ile gerçek savunma inşa edenler arasındaki farkı ortaya koyar.
Tespit mi, Önleme mi?
Bugüne kadar yayınladığım iki makale de, şüpheli istekleri tespit etme ve giriş verilerini normalleştirme üzerine odaklandı. Tespit önemli olsa da, bir noktaya kadar etkilidir. Örneğin, SQL enjeksiyon saldırılarının gerçek çözümü, sorgulama katmanında yer alır. Parametreli sorgular, SQL enjeksiyonunu yapısal olarak imkansız kılar.
Tespit, şüpheli bir olayın gerçekleştiğini size söyler. Önleme ise saldırıyı yapısal olarak engeller.
Güvenlik kararlarınızı verirken, yalnızca saldırıları tespit etmek değil, aynı zamanda onları önleyecek yapısal çözümler üretmeyi hedefleyin. Bu yaklaşım, uygulamalarınızı daha dayanıklı hale getirecektir.
Yapay zeka özeti
URL kod çözme bombası saldırıları, sunucuların CPU’sunu tüketerek performans düşüşüne neden olabilir. Bu saldırının nasıl çalıştığını ve nasıl korunabileceğinizi öğrenin.