SQL Injection Nedir? Nasıl Tespit Edilir- WHERE ile Gizli Verileri Ortaya Çıkarmak
SQL Injection açığı sistemde yer alan veritabanı içerisindeki kolonları ve bu kolonlardaki verileri ele geçirebilmemize olanak tanıyan kritik bir güvenlik açığıdır. Bu yazıda da PortSwigger Web Acedemy’de yer alan “SQL Injection Vulnerability in WHERE Clauses Allowing Retrivial of Hidden Data” başlıklı lab’ı çözüyor olacağız. Aynı zamanda SQL Injection Nedir? SQL Injection Nasıl Tespit Edilir? sorularına da yanıt veriyor olacağım.
SQL Injection Nedir?
SQL Injection, Türkçe ismiyle SQL enjeksiyonu hedef uygulamaya (bu uygulama mobil, masaüstü veya web uygulaması olabilir) SQL kodlarının enjekte edilebilir olması durumudur. Saldırganlar SQL Injection açığını kullanarak sisteme kendi SQL kodlarını enjekte ederek veritabanı içerisinden değerli bilgileri ele geçirebilmektedirler. Bu sebepten bu zafiyet kritik zafiyetler kategorisinde değerlendirilmekte ve Bug Bounty’lerde genellikle en yüksek ödülle değerlendirilmektedir.
SQL Injection Zafiyeti Nasıl Tespit Edilir?
SQL Injection tespiti kimi zaman çok kolay kimi zaman ise zor olan bir güvenlik açığıdır. Genelde ilgili parametre sonuna ‘ (tırnak işareti) konulmasıyla tespit edilmektedir. Tırnak işareti sonrası sayfada bir değişiklik, hata mesajı veya dönen sonuçta bir farklılık aranılır. Bu konuyu daha iyi anlamak için bir Blind SQL Injection örneği olan lab’ımızı çözelim.
SQL Injection Açığı Nasıl Kullanılır/İstismar Edilir?
- İlk olarak lab ortamımıza giriş yapıyoruz. (https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data)
2. Lab’a eriştikten sonra herhangi bir ürün kategori seçip filtreleme işlemini gerçekleştiriyoruz.
3. Filtreleme işleminden sonra URL adresi https://ac021f311e37e90d81b6c196008100f3.web-security-academy.net/filter?category=Gifts şekline geliyor. Arka planda veritabanına şu şekilde bir SQL isteği gidiyor:
SELECT * FROM products WHERE category = 'Gifts' AND released=1
Yukarıdaki SQL sorgusunun anlamı ise şu şekilde:
- Gifts kategorisinde yer alan ve yayınlanmış olan
- Ürünleri products tablosundan getir.
Sayfanın bize gösterdiği sonuç işe şu şekilde:
Peki biz burada gifts yerine Gifts’– şeklinde bir ifade yazarsak ne olur? yine SQL sorgumuza bakalım:
SELECT * FROM products WHERE category = ‘Gifts’–‘ AND released=1
‘–‘ işareti SQL’de yorum satırı anlamına gelmektedir ve kendisinden sonra gelen kısmı yorum satırına dönüştürmektedir. Dolayısıyla artık bizim SQL sorgumuzda altını çizerek (‘ AND released=1) gösterdiğim yer işlenmeyecektir. Yani artık sorgumuz sunucuda şu şekilde işlenecek:
SELECT * FROM products WHERE category = 'Gifts
Böyle bir isteği gönderdiğimizde web uygulamasının bize döndüğü sonuca ilişkin ekran görüntüsünü aşağıda görebilirsiniz.
Görselde de göreceğiniz üzere web sitesinin veritabanında henüz yayınlanmamış ve fiyatı $49.77 olan bir şemsiye olduğunu öğrendik. Web sayfasının içeriğinin değiştiğini tespit ettik ve artık bu web sitesinde “category” parametresi için bir SQL Injection zafiyeti olduğunu doğrulamış olduk.
Bu yazıda SQL Injection zafiyeti nedir ve SQL Injection nasıl tespit edilir sorularına yanıt verdim. Çok yakında konuyla ilgili videolu içeriği de bu yazı altında göreceksiniz…
One thought on “SQL Injection Nedir? Nasıl Tespit Edilir- WHERE ile Gizli Verileri Ortaya Çıkarmak”
Hatalar sadece ” ‘ “(tırnak) ile değil bazı sistemlerde engellenmiş işaret olarak da algilanmakta. Seçenekleri çoğaltarak olası SQL acını keşfetmemiz de yardımcı olacaktır.