SQL Injection Nasıl Sömürülür?
XSS, Brute Force, CSRF’den bahsettik ama saldırıların saldırısı, bilişim dünyasıyla alakası olmayanların bile en az bir kere karşısına çıkmış olan, OWASP Top 10’un babası SQL injection’dan bahsetme zamanı geldi.
SQL nedir diye soralım önce. SQL, web sitenizin veritabanındaki verileri yönetmenize, tasarlamanıza ve düzenlemenize yarayan bir programlama dilidir.
Günümüzdeki web sitelerinin çoğunun SQL dilinin yaratmış olduğu açıklar sayesinde güvenli olmadığı tahmin edilmektedir. Bu yüzden AWUGP kapsamında, SQL injection en yaygın web hackleme tekniği olarak kabul edilir.
SQL injection, veritabanınızı tahrip edebilecek kötü amaçlı bir kod yerleştirme tekniğidir. SQL injection sayesinde saldırganlar web sitesindeki kullanıcı bilgilerini çalabilir, gizlenmiş bilgilere ulaşabilir, mevcut verilere müdahale edebilir, bazı işlemleri değiştirebilir, yetkisini yükseltebilir, veritabanını komple silebilir ya da daha önce bahsettiğimiz diğer saldırılardan birine geçiş yapabilir çünkü web sitelerinin bütün bilgileri o web sitesinin veritabanında yer alır. Saldırganın tek yapması gereken yazılımların içindeki bir güvenlik açığından faydalanarak veritabanına ulaşmak. SQL injection ilk olarak 1998’de ortaya çıktığı düşünülmektedir. 1998’de Phrak dergisinde yayımlanan bir makalede bahsedilince literatürde yerini almıştır.
SQL injection 4 ana sınıfa ayrılmıştır:
- Klasik SQL injection
- Özel SQL injection
- Kör(Blind) SQL injection
- Bileşik (Compounded) SQL injection:
-SQL injection + Yetersiz Kimlik Doğrulama
–SQL injection + DDoS saldırıları
-SQL injection + DNS Korsanlığı
-SQL injection + XSS
SQL Injection, PHP ve ASP uygulamalarında daha eski işlevsel arayüzlerin yaygınlığı nedeniyle çok yaygındır. Mevcut programatik arayüzlerin doğası gereği, J2EE ve ASP.NET uygulamalarının kolayca SQL injectiondan yararlanmaları daha az olasıdır.
SQL Injection Nasıl Bulunur ve Yapılır?
SQL injection bir sitede aranıp bulunurken script kiddie seviyesindeki saldırganların bile bildiği bir şey vardır: arama kutularına ‘(tırnak) işareti koymak. Bu tür özel karakterler form girdilerine denenerek sayfada veritabanı hatası almayı çalışılır. Böylelikle SQL açığı olup olmadığı manuel bir şekilde aranmış olur. Bu manuel arama tekniği oldukça zahmetlidir.
Sitelerde SQL açığının aranması için özel araçlar üretilmiştir. Bunlardan en bilineni SQLMap’tır. Sqlmap veritabanın kullanıcılarını, parolalarını, hash değerlerini, rolleri, tabloları, sütunları gibi bilgileri tespit eder.
Sqlmap, açık kaynaklı bir yazılımdır. Kali Linux işletim sistemine sahipseniz halihazırda kurulu olarak gelir. Bunun yanında Acunetix, Netsparker, Vega gibi bilgi toplama araçları SQL açığı aranırken kullanılabilir.
DVWA’yı açıp SQL Injection sekmesine geldiğimizde kullanıcı ID değerlerinden hangisini aratırsak onu bulan bir form kutusuna rastlıyoruz. Kaynak kodunu incelediğimizde bizim veritabanına istediğimiz komutu göndermemizi engelleyecek bir kontrol mekanizmanısına rastlamıyoruz. Form kutusunun yaptığı işlem veritabanına:
> SELECT first_name, last_name FROM users WHERE user_id = ‘(girdiğimiz sayı)’
gibi bir komut göndermek. Sayı girdiğimiz kısıma kendi SQL komutumuzu gönderirsek ne olur peki? Veritabanında istediğimiz bilgilere ulaşırız. Örneğin sisteme 1.kullanıcıyı veya doğru olan bir durumu listele dersek bütün durumları listeleyeceği için bütün kullanıcıları listeleyecektir çünkü bütün kullanıcılar doğru bir konumdadır. Komut olarak sisteme 2.kullanıcıyı veya 3=3 gibi kesin bir doğru anlamına gelen:
2’ OR 3=3 —
gibi bir komut gönderirsem veritabanındaki tüm kullanıcılara ulaşırım.
Bu komut gibi payloadları GitHub üzerinde bulabilirsiniz.
SQL Injection Nasıl Önlenir?
Özel karakterleri saldırıda kullanılmaması için kodunuza tanıtın. GET ya da POST metodu kullanılıyorsa gelen verileri filtreleyin. Kullanıcı yetkilerini gözden geçirin ve kısıtlayın. SQL parametrelerini kullanmaya dikkat edin. Sisteminizi güncel tutun ve güvenlik yamalarını yapın. OWASP’ın bu konudaki rehber sayfasını okuyun ve GitHub’un üzerinde paylaştığı cheat sheetleri düzenli olarak takip edin. Yeni çıkan SQL zafiyetlerini ve önlemlerini haber sayfalarından takip edin. Bütün önlemlere rağmen siteniz hacklenir ve veritabanınızdaki bütün bilgiler silinirse diye veritabanınızın yedeğini düzenli olarak alın.
Bir sorum olacak, kendi sitemde (‘) tırnaklı bir şekilde arama yaptım boş bir ekran çıktı. Hata falan yok ekran sadece boş oluyor. Müzik dinleme script’i kullanıyorum. Bu boş ekran SQL açığı olduğu anlamına gelir mi?
İlla hata vermesine gerek yok her zaman. Bazen boş ekran çıksa bile açık olduğu anlamına gelebilir hatta. Bu yüzden açık olabilir sitenizde.
salam