Geçen gün PortSwigger Web Security Academy'de çalışırken takıldım. Lab basit görünüyordu ama düşündüğümden biraz daha zekiceydi. Çözdükten sonra "bunu yazmam lazım" dedim, çünkü kafamda oturması biraz zaman aldı.

Labın amacı ürün kategorisi filtresi üzerinden SQL injection yapacaksın, ve veritabanından ekstra bir satır döndüreceksin. Ama bunun için önce kaç sütun var ve hangi sütun metin tutabiliyor bulmam gerekiyordu.

Lab bana rastgele bir string verdi (diyelim ki KYdHPN) ve bunu sorgu sonucunda görünür kılmamı istedi. Kulağa basit geliyor, ama sütun tipini yanlış tahmin edince hata alıyorsun ve hiçbir şey olmuyor.

İlk adım buydu. ORDER BY tekniğini kullandım:

/filter?category=gifts' ORDER BY 1 — /filter?category=gifts' ORDER BY 2 — /filter?category=gifts' ORDER BY 3 — /filter?category=gifts' ORDER BY 4 —

None

4'te hata geldi. Demek ki sorgu 3 sütun döndürüyor. Bu kısmı önceki lab'dan biliyordum, nispeten hızlı geçtim.

İşte burada biraz uğraştım.

UNION saldırısının çalışması için enjekte ettiğin sorgunun sütun tipleriyle orijinal sorgunun sütun tiplerinin uyuşması gerekiyor. Eğer orijinal sorguda bir sütun integer tipindeyse ve sen oraya string koyarsan, veritabanı patlıyor.

O yüzden her sütunu tek tek test ettim. Mantık şu: bir sütuna 'a' koy, diğerlerine NULL yaz (NULL her tiple geçiniyor), bakalım ne olacak.

İlk deneme:

' UNION SELECT 'a',NULL,NULL —

Hata. 1. sütun integer galiba.

None

İkinci deneme:

' UNION SELECT NULL,'a',NULL —

None

Sayfada a göründü. Yani 2. sütun string tutuyo

Artık her şeyi biliyorum: 3 sütun var, 2. sütun string. Lab'ın benden istediği KYdHPN değerini oraya koydum:

/filter?category=Corporate+gifts' UNION SELECT NULL,'KYdHPN',NULL —

None

Sayfada KYdHPN belirdi ve lab "Congratulations, you solved the lab!" mesajı verd

Bunu ilk başta tam anlayamamıştım, sonradan oturdu.

Eğer bir sütunun tipi integer ise ve sen oraya 'a' yazarsan, veritabanı hata fırlatıyor. Ama NULL yazdığında hata olmuyor çünkü NULL "değer yok" demek, tip fark etmiyor.

Yani NULL sayesinde sadece test etmek istediğin sütuna odaklanabiliyorsun, geri kalanları bozmadan.

Bu lab bana şunu öğretti: SQL injection sadece "kötü karakter girmek" değil. Arkasında bir mantık var — kaç sütun var, tipler ne, hangi veriyi nereye enjekte edebilirsin. Bu soruları cevaplayamazsan saldırı çalışmıyor.

PortSwigger'ın labları bu yüzden iyi: seni adım adım götürüyor, öğrenmeden geçemiyorsun. Direkt cevabı yapıştırsan bile ne yaptığını anlamıyorsun zaten.

Bir sonraki lab'da bu yöntemi kullanarak gerçekten veri çekeceğiz — orada işler biraz daha ilginçleşiyor.