Herkese merhabalar. Bugün yeni bir seriye başlıyoruz. Bu seri boyunca Portswigger Academy’nin bize ücretsiz olarak sunduğu Web Security Academy Lab çözümlerini sizlerle paylaşıyor olacağım. Umarım faydalı bir içerik olur. Öneri , görüş ve sorularınızı blog sayfamdaki hakkımda kısmındaki iletişim linklerinden bana iletebilirsiniz. Zaman Kaybetmeden ilk Lab çözümüyle başlayalım. Konuya yardımcı olması dileğiyle yine Portswigger Academy’de yer alan Konu anlatımları linkini de konuya ekliyor olacağım.
Çözülen lab ortamı: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
Lab Linki: https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data
Konu Anlatım Linki: https://portswigger.net/web-security/sql-injection
Bu bölümde anlatılanları biraz inceleyecek olursak websitemizde ki kategori filtrelerinde bir SQL Injection zafiyeti varmış. Siteye giren bir kullanıcı belirtilen kategorilerden birine tıklayınca arka planda bu şekilde bir sql sorgusu yollanıyormuş.
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Bizden istediği ise bir sayfa içinde tüm kategorilerdeki ürünleri listelememiz.
Sorguyu biraz inceleyecek olursak , Database içindeki “products” tablosundan “category” kolonundaki “Gifts” olan datayı çek.
Sorgudaki yapı anladıktan sonra “Access the Lab” diyerek lab ortamımıza geçiş sağlıyoruz.
Lab ortamına girince bizi bir e-ticaret sitesi karşılıyor. Başta bize verilen bilgileri hatırlayıp hemen rastgele bir kategoriye tıklıyorum.
İşleyişi biraz daha iyi anlamak için sorguda verilen “Gifts” kategorisine gidiyorum. Burada öncelikle SQL Injection zafiyetinin varlığını kontrol etmemiz gerekir.
Not: Burada kullandığım tek tırnağın (‘) amacı arka planda dönen sql sorgusuna müdahale edebiliyormuyum onu öğrenmek.
Gördüğünüz üzere sistem bize server taraflı bir hata kodu yolladı. Peki bu bizim için yeterli bir kanıt mı? Tabi ki de hayır. Hala tam anlamıyla sorguya müdahale edip edemediğimizi bilmiyoruz. Tamam ben sorgunun yapısını bozdum ama biz burda müdahale edebildiğimiz sorgu bölümünden sonra gelen parçaları ya saf dışı bırakırsak kodumuz yine bize aynı çıktıyı verir mi ? Burada yapacağımız olay hemen hemen her programlama dilinde bulunan yorum satırı(coment line) etiketimizi kullanacağız. Sql yapısında yorum satırı olarak birden fazla yorum satırı tagı bulunmakta.(Bunun sebebi günümüzde database için farklı ürünler kullanıldığı için birbirinden farklı sonuçlarla karşılaşabiliyoruz.) Bu çalışma esnasında kullanacağımız yorum satırı tagı çift çizgi(–) olacak.
Çift çizgiyi koyduktan sonra fark ettiyseniz normalde listede olmayan bir ürünün listeye eklendinni görüyoruz. Bu işlemden sonra başarıya ulaşıp sitedeki ürünleri tekrar görebiliyorsak burada bir SQL Injection zafiyetinden bahsetmek mümkün. Tamam SQl Injectın’ı bulduk ama bundan sonra ne yapacağız ? İlk başa dönüp sorunun bizden istediği şeyi burada uygulayacağız. Soru bizden bir kategori seçiliyken diğer kategorideki ürünlerinde aynı sayfada listelenmesini istiyor. Şimdi ilk baştaki sorguya tekrar dönelim.
Yapısı bozulmamış sql sorgusu:SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Yapısını bozduğumuz son aşamadaki sql sorgusu:
SELECT * FROM products WHERE category = ‘Gifts’’-- AND released = 1
Bu kısımdan sonra birazcık programlama dili bilgisi giriyor. Sistem bizden bir kategoride tüm kategorideki ürünleri listelememizi istiyor. Sorguya baktığımız zamanda sadece “gifts” kategorisindeki ürünlerin listelenebileceğini görüyoruz. Peki biz burada bir koşullu durum yazarsak sonuç ne olur ?
SELECT * FROM products WHERE category = ‘Gifts’’+OR+1=1-- AND released = 1
Yukarıdaki sorguda ise arka plana bir koşul yolluyoruz. Tamam sen bana gifts kategorisini ver tamam da birde 1=1 işleminden dönen sonucu var. Burada “OR” kullandığımız için sistem birinden birinde “True” değer üretirse aşama aşama geri gider. Tek tek kontrol etmeye başlar. 1=1 doğru mu? Doğru. Category kolonlarının içinde Gifts’ diye bir değer var ? Yok. Ama zaten birinin true değer döndirmesi bizim işimizi görürdü. Bir geriye baktığımızda ise products tablosunu çağırmasını istiyoruz. Vee sonuç
Ve gördüğünüz gibi bir kategori sekmesinde tüm kategorilerdeki ürünleri listeleyip lab çözümümüzü tamamlamış olduk. Devamı için takipte kalın. Okuduğunuz için teşekkür ederim.