- 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.
Önceleri web uygulama güvenliğine özel olması düşünülen blog, daha sonra diğer sızma testleri konularını da kapsayacak şekilde genişletilmiştir.
30 Mayıs 2010 Pazar
17: SQL Injection
Kaydol:
Kayıt Yorumları (Atom)
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....
-
& (%26) URL sorgu tümcesindeki parametreleri mesaj gövdesinden ayırmada kullanılır. = (%3d) URL sorgu tümcesindeki parametrelerin i...
-
Checklist for Web App Pentesting - V 6. Veri Denetimi (Data Validation) Testleri 6.1 Girdi Denetimi Bütün girdiler denetlenmelidir....
-
Bu yazı, web uygulama sızma testleri sırasında kullanılan araç çeşitlerini konu almıştır. Bu araçların hangi amaçla kullanıldığı anlatılarak...
Hiç yorum yok:
Yorum Gönder