SQL Injection Nedir? Türleri nelerdir? Nasıl sömürülür?

Seray Esen
6 min readDec 29, 2022

--

Siber güvenliğin Web Güvenliği alanı ile az çok ilgilendiyseniz SQL Injection zafiyetini duymanız kaçınılmazdır. Bu blogumda sizlere temel ve açık bir şekilde SQL Injection zafiyetinden bahsedeceğim.

Injection Nedir?

SQL Injection zafiyetini anlamaya geçmeden önce “Injection” kavramına değinmemiz faydalı olacaktır.

Bir altyapıda kullanıcı girdisi herhangi bir girdi denetimi olmadan dinamik olarak sorguya dahil ediliyorsa o altyapıda injection meydana gelebilir diyebiliriz. Daha anlaşılabilir ve somut bir dille ifade edersek; kullanıcının girdileri direkt olarak sorguya enjekte oluyor, dahil ediliyorsa ve bundan dolayı altyapı farklı yöntemlerle manipüle edilebiliyorsa bu durumu injection temelli zafiyet olarak nitelendirebiliriz.

Kısacası, kullanıcı taraflı girdi dolayısı ile altyapıyı manipüle edebilme durumu injection kavramını özetlemede kullanabileceğimiz bir deyim olabilir.

SQL, LDAP ve XPath sorgularıyla, işletim sistemindeki komutlarla, XML ayrıştırma yoluyla ve SMTP başlıkları aracılığıyla injection zafiyeti sömürülebilir.

SQL Injection

Injection zafiyetinin birden fazla yolla sömürülebileceğinden bahsetmiştik. Biz bugün bu yollardan biri olan SQL Injection üzerinde duracağız.

SQL Injection, SQL sorguları ile altyapıyı manipüle ederek yetkisiz erişim elde edilmesine olanak tanır.

Belki birçoğunuzun aklında şu soru olabilir: SQL sorguları nelerdir, ne işe yarar?

SQL, kullanıcı ile veritabanı arasındaki sorgulamayı yapan bir nevi aracıdır diyebiliriz. Bu sorgulamayı gerçekleştirmek için SQL komutlarını kullanırız. Bu komutları doğru bir şekilde kullanabilmek için SQL metakarakterlerini iyi tanımak gerekmektedir.

SELECT * FROM Customers (Customers tablosu içindeki bütün verileri getirmeyi sağlayan SQL sorgusu)

SQL Injection, kullanıcıdan gelen verinin tam ya da kısmi olarak SQL sorgusunda doğrudan kullanılması sonucu oluşur. Veritabanına dayalı saldırılarda kullanılan bir tekniktir.

SQL Injection aynı zamanda OWASP (Open Web Application Security Project) Top 10 içindeki en baba zafiyetlerdendir :)

4 çeşiti vardır:

  • UNION Query SQL Injection: “UNION” metakarakteri kullanarak farklı seçimlerin bir arada yapıldığı injection türüdür. Direkt olarak çıktı alınır.
  • Eror based SQL Injection: Hata mesajlarına dayanır. “ #, ‘ ” gibi karakterler kullanarak var olup olmadığını test edebiliriz. Direkt olarak çıktı alınır.
  • Boolean based Blind SQL Injection: Ekrana hata mesajı döndürülmez. “Kör” olarak gerçekleştirilen bir türdür. Gönderdiğimiz mantıksal ifadenin (AND 5=5 , OR 5=5) sayfanın yapısını herhangi bir şekilde değiştirip değiştirmediğine bakarız. Örneğin AND 5=5 gönderdiğimizde 200 OK yanıtını alıyorsak AND 5=4 Yanıtını gönderdiğimizde 200 OK yanıtından başka bir cevap alıyorsak bu zafiyetin olduğunu anlayabiliriz. Aynı zamanda websitenin bize döndürdüğü cevabın büyüklüğünde kayda değer bir değişiklik var ise zafiyetin olduğu anlaşılır.
  • Time based Blind SQL Injection: Aynı şekilde, ekrana hata mesajı döndürülmez ve “kör” olarak gerçekleştirilir. “Sleep” fonksiyonu kullanarak tespiti yapılır. AND sleep(2) fonksiyonunu kullanarak veritabanı sistemine cevap döndürmeden önce bizim belirttiğimiz saniye kadar beklemesini söyleriz. Eğer sunucu, normalde verdiği cevaptan 2 saniye geç cevap döndürüyor ise zafiyetin varlığını ispatlarız.

SQL Injection Nasıl Tespit Edilir?

En temel ve manuel yollardan biri SQL injection’ın arandığı web sitesinde kullanıcı girdisinin alındığı alanlara “ ‘ ” gibi özel karakterler kullanarak hata mesajları almaya dayanır. Bu şekilde özel karakterler denenrek veritabanı hatası alınmaya çalışılır.

Manuel teknikler zahmetli olabilir. Bu yüzden tespitin gerçekleştirilmesi için özel tool’lar geliştirilmiştir. SQLMap, bu tool’lardan en çok bilinenidir.

SQLMap ile veritabanındaki kullanıcılar, parolalar, tablolar, kolonlar gibi hassas verileri tespit edebiliriz.

SQL Injection Nasıl Sömürülür?

Sizlere, PortSwigger Web Security Academy platformundan bir lab çözerek temel düzeyde SQL Injection zafiyetinin nasıl sömürüldüğünü göstereceğim.

Laba geçmeden önce çok önemli bir noktaya değinmek istiyorum: Burp Suite.

Burp Suite web uygulama güvenliği testlerinde kullanılan PortSwigger şirketinin geliştirmiş olduğu bir web proxy’dir ve bu alanla ilgilenen kişilerin tercih ettiği en popüler yazılımlardan biridir. Ben de bugün labımızı çözerken Burp Suite kullanacağım.

Bu lab, oturum açmayı atlamayı mümkün kılan bir SQL Injection zafiyeti içermektedir.

Hadi başlayalım!

Öncelikle https://portswigger.net/web-security/all-labs adresine gidelim ve aşağıdaki laba erişelim.

Laba eriştikten sonra bizi bu şekilde bir sayfa karşılayacak:

Sağ yukarı köşede bulunan “My account” kısmına tıklayalım. Karşımıza bir giriş yapma ekranı açılacak. Rastgele bir şeyler girmeyi deneyelim ve sonuçları inceleyelim.

“Log in” butonuna bastığımızda geçersiz kullanıcı veya şifre hatasını aldık. Şimdi Burp Suite dönelim. Yaptığımız bu girdi sonucu giden HTTP isteklerini inceleyelim.

Proxy sekmesinden HTTP History sekmesine geliyoruz. Burada istek ve cevap trafiği gösterilecektir.

/login olarak gözüken kısım, bizim giriş yapmaya çalıştığımızda oluşan request ve response’ı temsil eder. Dolayısıyla burada birkaç şey deneyerek cevaplarda (response) değişikliğe sebep olabiliyor muyuz denemeliyiz.

Request üzerinde sağ ok yaparak “sent to repeater” seçeneğine basın. Repeater, requestler üzerinde oynamalar yapabildiğimiz alandır.

Burada gördüğünüz gibi hiçbir değişiklik yapmadan send dediğimizde 200 OK cevabını alıyoruz.

Şimdi biraz requesti karıştıralım.

SQL Injection olup olmadığını anlamak için genellikle tek tırnak kullanılır.

Yukarıda da gördüğünüz gibi, tek tırnağı en aşağıda en başta login kısmında girdiğimiz parolanın yanına ekledik. Bunun sonucunda response olarak hata belirten 500 Internal Server Eror mesajı aldık.

Güzel :) Demekki tırnak eklenince sorgunun yapısı değişiyor, arkada fazladan tırnak kalıyor ve bu şekilde syntax bozulmuş oluyor.

Hadi, bir tırnak daha atıp sorguyu düzeltebiliyor muyuz deneyelim.

200 OK yanıtını aldığımıza göre anlıyoruz ki syntaxi bozduğumuz gibi düzeltebiliyoruz. Artık anlıyoruz ki burada SQL Injection var.

Peki şimdi ne yapacağız?

Login bypass’ta sömürüyü gerçekleştirmek için mantıksal true exploiti kullanılır.

Bunu size uygulama üzerinden göstereyim.

Mantıksal true tüm kayıtları getirmeye yarayan bir exploittir. “ or ” ile iki durumu birbirine bağlıyoruz. Exploitin sonuna “ — — ” ekleyerek comment out olmasını sağlıyoruz. Yani fazladan tırnağın syntax hatası vermesini bu şekilde önlüyoruz.

Bu yazdığımız exploitin doğru bir şekilde algılanabilmesi için URL encode olarak göndermemiz gerek. Bunun için ilk attığımız tırnaktan başlayarak yazdığımız exploiti seçiyoruz ve ctrl+u yapıyoruz.

Son durum bu şekilde gözükecektir:

Şimdi send diyelim ve bakalım:

Başardık gibi :)

Response’da Set-Cookie Session atanmış gözüküyor. Bunu kullanarak herhangi bir kullanıcı olarak login olabiliriz.

Şimdi password kısmında ne yazdıkysak hepisini kopyalayalım. Ama dikkat! Url encode halinde değil, değişim yapmadan önceki halini kopyalayacağız.

Kopyalama işleminden sonra web sitesindeki login ekranına dönelim ve administrator olarak giriş yapmayı deneyelim.

Parola kısmına kopyaladığımız exploitli parolamızı yapıştırıyoruz.

Veee log in diyelim.

İşte oldu! Administrator olarak oturum açtık.

Şimdi sıra sizde. Kolay gelsin :)

--

--