30 Mayıs 2010 Pazar

17: SQL Injection


  • Saldırganın web uygulamasını kullanarak hedef veritabanında SQL sorguları çalıştırması şeklinde gerçekleşir.
  • Saldırı senaryosu:
    • Saldırgan, input alanından normal parametreler içine SQL sorguları da koyarak uygulamaya gönderir.
    • Uygulama, bu SQL parçasını parametrelerle birlikte ilgili SQL cümlesiyle birleştirerek veritabanına gönderir.
    • Veritabanı, sorguyu çalıştırıp sonucunu uygulamaya döner.
    • Uygulama, veritabanından aldığı cevabı web sayfasını oluşturmak için kullanır. Cevap sayfanın içinde olabilir yada sayfanın yapısından cevabın içeriği anlaşılabilir.
  • Örnek: Uygulama, kullanıcıdan id numarası alıp "SELECT * FROM USERS WHERE ID=$id" sorgusunu oluışturuyorsa, parametre yerine "100 or 1=1" gönderdiğimizi düşünelim. Oluşacak sorgu: "SELECT * FROM USERS WHERE ID=100 or 1=1" olacaktır ki bu da USERS tablosundaki tüm kayıtların dönmesini sağlar.
  • Güncel örnek: 23 Kasım 2009'da SQL Injection ile Symantec'in tüm veritabanı indirilmiş.
  • Neden olduğu problemler:
    • Bilgi hırsızlığı
    • XSS (veritabanının bir alanına bir script gömebiliriz)
    • IFrame enjeksiyonu ile botnet oluşturma
    • Sunucu ele geçirme (SQL Server xp_cmd_shell yordamı, Oracle'da load_file gibi araçlar kullanarak sunucu ele geçirilebilir)
  • www.whitehatsec.com 2009 istatistiği: Bulunan açıklıkların %7'si SQL injection açıklığı.
  • Uygulamalarda ORM (Object Relational Mapping) kullanarak bu açıklığın önüne geçilir. Developerların en iyi bildiği açıklık tipi SQL injectiondır.
  • Test teknikleri:
    • URL'de şöyle bir şey olsun: "/urundetay.aspx?id=5". 5 inputunun yanına bir tırnak koyalım: "/urundetay.aspx?id=5'" sonucunda detaylı bir veritabanı hata sayfası gelirse bir ışık yanar, burada bir SQL injection açığı olabilir diye düşünmeye başlarız. İlk deneyeceğimiz şey input olarak girdiğimiz değerin yanına tırnak koymak olsun.
    • "/urundetay.aspx?id=5 waitfor delay '00:00:05' -- " olunca 5 sn gecikmeli olarak orijinal cevap gelirse açıklık var demektir ("waitfor delay", MS SQL syntax'ı, MySQL'de ise "sleep(10)" saniye bazında).
    • "--" pattern, SQL için bundan sonrası açıklama satırı anlamına gelir. İşimizi garantiye almış oluruzi her zaman kullanabiliriz. Dikkat: MySQL'de --'den sonra bir de boşluk bekliyor, boşluk olmazsa açıklama satırı başlangıcı olarak algılamıyor! MySQL için # karakteri de sonrasının açıklama satırı olduğu anlamına gelir.
    • 3'lü test: Yukarıdaki örnekte ID Parametresi yerine şunları yazarak şu yanıtları bekleriz (Blind SQL Injection):
      • 5 => Orijinal cevap döner;
      • 5 and 5=5 => Orijinal cevap döner;
      • 5 and 5=6 => Hata döner (kayıt yok).
      • 3 sonuç da beklediğimiz gibiyse SQL Injection açıklığı var demektir.
    • String input alan bir URL için test:
      • /goster.do?isim=muro => select * from users where isim='muro' => açıklık varsa muro'nun bilgileri döner.
      • /goster.do?isim=muro' => select * from users where isim='muro'' => açıklık varsa hata döner (engellenmediyse veritabanı hatası).
      • /goster.do?isim=muro' and SLEEP(5) %23 => select * from users where isim='muro' and SLEEP(5) #' => açıklık varsa 5 sn gecikmeli olarak muro'nun bilgileri döner. Burada # karakteri terine URL encode kodunu gönderdik, çünkü URL için # karakteri anchor anlamına geliyor (sayfa içi adresleme).
    • Bazen developer, parametreden önce n sayıda parantez açabiliyor, bu durumda parametreden sonra o kadar sayıda parantezi kapatmak gerekir. Bu durumu dönen hata mesajındaki "missing right parenthesis" türü bir açıklamadan anlayabiliriz.
    • SQL Injection tarama için bir araç: sqlmap.
      • Back|track uygulamasında /pentest/database/sqlmap/ altında sqlmap.py python uygulaması.
  • Oracle driverları batch uygulama çalıştır(a)mıyor. Örneğin parametre yerine "3; drop table users;" gönderip "select * from users where id=3; drop table users;" komutlarını oluşturmaya çalışsak ikinci sorgu (drop) çalıştırılmaz.
  • Blind SQLi tekniği, web uygulaması veritabanı hataları mesajlarını göstermediği durumlarda ve bilgi elde etmek için UNION işlecini enjekte edemediğimiz durumlarda kullanılır.

Hiç yorum yok:

Yorum Gönder

Web Uygulama Sızma Testleri İçin Kontrol Listeleri - V

Checklist for Web App Pentesting - V 6. Veri Denetimi (Data Validation) Testleri 6.1 Girdi Denetimi Bütün girdiler denetlenmelidir....