[PORTSWİGGER] SQL Injection Lab Çözümleri Part-3

Herkese merhabalar. Portswigger lablarına kaldığımız yerden devam edeceğim. Konuyla ilgili linkleri tekrardan konuda paylaşıyor olacağım.

Çözülen lab ortamı: SQL injection UNION attack, determining the number of columns returned by the query
Lab Linki: https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns
Konu Anlatım Linki: https://portswigger.net/web-security/sql-injection

Bizden istediği şeye bakıcak olursak. Yine kategori filtresinde bir SQL Injection zafiyeti var. Bu zafiyeti kullanaraktan dönenen sql sorgusunda kaç tane kolon olduğunu bulmamızı istiyor. Şimdi “Access the Lab” diyerek lab ortamımıza erişelim

Kaşımızda bir ürün listesinin ve fiyatlarının olduğu bir sayfa çıkıyor. Zafiyetin kaynaklandığı kategori filtrelerinden birine gidelim.

Daha az üründen oluşan bir liste bizi karşılıyor. Burpsuite aracımızdan intercept özelliğini açıp sayfayı yeniledikten sonra araya girip isteği yakalıyoruz. Daha sonrada isteği resimde gösterdiğim gibi farenin sağ tuşunu kullanarak isteğimizi repeater sekmesine yolluyoruz.

Proxy tarafıyla şimdilik işimiz bitti. Bu yüzden intercept özelliğini kapatabiliriz. Repeater sekmesine geldiğimizde isteğimizi görüyoruz. Sistem davranışını biraz daha kavramak için isteğin saf halini direct yolluyorum ve “200 OK” cevabını alıyorum.

Zafiyetin tespiti için kategori filtresinin yanına bir tek tırnak bırakıyorum ki sql sorgusunu manipüle edebiliyor muyuz onu görelim.

Ve gördüğünüz gibi server taraflı bir hata mesajı aldık. Şimdi de sorguyu tam göremediğimiz için arka planda dönen sorguda bizim müdahele edebildiğimiz yere kadar olan kısımdan sonraki kısımları yorum satırı yapmak için koyduğumuz tırnak işaretinin yanına çift çizgi(–) ekliyorum.

Sonuç olarak tekrardan “200 OK” yanıtını aldığımızı görüyoruz. Artık tamemen istediğimiz sorguyu çalıştırabileceğim bir alan oluşturdum.

Şimdi de bizden istenilen isteği yerine getirme zamanı. Sql injection zafiyetinde kolon sayısını bulmak için birden fazla yöntem var. Olayları biraz daha iyi kavramak için tek satırda iki sorgu yazabileceğimiz bir yapıdan söz edeceğim. “Union” sql sorgularından iki sorguyu tek satırda yasmak istediğimizde yardımımıza koşan bir yapı. Örnek olması açısından aşağıya union kullanarak basit bir sorgu yazacağım.

SELECT * FROM product WHERE category=’Gifts’ UNION SELECT * FROM users WHERE username

Bu ksıımda dikkat etmemiz gereken bir durum var. Birinci sorgudaki product tablosu ile ikinci sorguda yazacağımız herhangi bir sorgunun kolon sayılarının aynı olması lazım. Sıkıntının başladığı nokta şu ki son kullanıcı olarak kimsenin databasedeki tablonun kolon sayılarını görmeye yetkisi yoktur. Bu durumdan ötürü bizde eşitlenene kadar tablo sayısını bulmamız gerekmekte. Yani basit bir url üzerinden gidecek olursak durum şöyle özetlenebilir.

x.com/product?id=1

Şeklinde bir urle sahip olduğumuz zaman bir tablodan product kolonunda id si 1 olan değeri getir demiş oluyoruz fakat product kolonunun bulunduğu tabloda kaç tane kolon olduğunu bilmiyoruz. Bunuda anlamak için union ile urle ek bir sorgu yazıp aldığımız hataya göre yolumuzu şekillendiriyoruz. Öneğin;

 x.com/product?id=1’ union select null,null,….,null—

Yazdığımız null değerler bir kolonu ifade ediyor. Birden başlayıp tek tek arttırarak devam ediiyoruz. Peki sona geldiğimizi nerden anlayacağız. Birinci sorgudaki kolon sayısıyla bizim yazdığımız ikinci sorgudaki kolon sayısı eşit olana kadar sistem sürekli bize bir hata mesajı gösterecek.(Blind SQL Injectionda olay biraz daha farklı. İlerleyen lab ortamlarında bunada değineceğim.) Biz hata mesajı almadığımız zaman sistemin arka planında dönen sql sorgusuyla bizim yazdığımız ikinci sql sorgusundaki kolon sayıları eşitlenmiştir.

Resimdede gördüğünüz gibi anlattıklarımı bir bir uygulamaya dökmeye başlıyorum. İlk olarak bir tane null değeri yollayarak dönecek durum koduna bakıyorum. Daha sonra da “200 OK” yanıtını Alana kadar aynı işlemi sürdürüyorum.(Tek tek null değerlerini arttırıyorum.)

3. null değerini yazdığımızda sistemin “200 OK” değerini döndürdüğünü görüyoruz. Daha sonra web sitesine tekrar döndüğümüzde işlemlerimizi başarılı bir şekilde yapıp bizden istenen görevin bittiğine dair sistemden tebrikler mesajı alıyoruz 😀

Bu lab ortamının çözümü de bu şekildeydi. Umarım faydalı olmuştur. Okuduğunuz için teşekkür ederim.