Bil438 AĞ GÜVENLĠĞĠ
28 Mayıs, 2011
INTEGER OVERFLOW ve SQL
ENJEKSĠYON SALDIRILARI
Integer Overflow Nedir?
Günümüz sistemlerinde, 32 veya 64 bitlik işlemciler
kullanılmaktadır. Herhangi bir aritmetik işlem sonucunda bu 32 veya 64 bitlik alana sığmayacak boyutta bir integer oluşması durumuna integer overflow denir.
Tehlikesiz gibi gözükse de integer overflow birçok
Integer Overflow Tehlikeli
midir?
Integer overflow oluştuktan sonra tespit
edilemez.
Sonucun yanlış olduğunu uygulamaya
anlatmanın bir yolu yoktur. Bunun için
oluşmasına izin vermemek gerekir ve
kodlarımızı buna göre yazmamız gerekir.
Integer overflow‟ın doğrudan bir tehlikesi yoktur
fakat başka hataların oluşmasına sebep olabilir.
Örneğin buffer overflow gibi.
Integer Overflow Saldırısı(1)
Asağıda integer overflow yaratması
muhtemel bir kod kesimi bulunmaktadır.
Ancak bu kod sistemi, saldırılara açık hale
getirmemektedir.Ancak durum her zaman
böyle değildir.
Integer Overflow Saldırısı(2)
Aşağıdaki kod kesiminde, a=b=2^31+1 olduğunu
varsayarsak, x=2 olacaktır.Daha sonra bu x değişkeni 6. satırda “malloc” fonksiyonuna parametre olarak
gönderildiğinde, programcının beklentisi olan 2^32+2 byte‟lık değil sadece 2 byte‟lık bir yer alacaktır.Bu da 7. satırdaki bellek erişimi p[a](p[2^31+1])‟ nın yetkisi
Integer Overflow Saldırısı(3)
Bir saldırgan, kullanıcıdan alınan a ve b değerleri
üzerinde çalışarak önemli bellek bölgelerine erişebilir hatta zarar verebilir.
Güvenli öncelikli programlarda, program maksimum yetki
ile çalıştığından, kritik bellek bölgeleri programın adres uzayında bulunacaktır. Bu da saldırganın belleğe
yerleştirdiği herhangi bir kod parçasına istediği gibi erişebilmesine ve çalıştırabilmesine neden olacaktır.
Yaşanmış Integer Overflow
Saldırıları
En bilindik saldıralardan bir tanesi, Linux,
BSD, MacOS X and Windows üzerinde
çalışan Gaim isimli anlık mesajlaşma
programı üzerinde gerçekleşmiştir.
Kullanıcıdan alınan veri manipule edilerek,Calloc() ile
alınan 0 byte‟lık veri alanına while döngüsü içerisinde sürekli 4GB‟lık veri kopyalanmasına neden
olunmustur.
Integer Overflow
Saldırılarından Korunma
Kullanıcının erişip değiştirme yetkisi olan verilerde
aritmetik bir işlem yapılmadan önce verinin büyüklüğünün kontrol edilmesi gerekmektedir
Birçok uygulama için bu zahmetli bir işlemdir.Birçok farklı fonksiyon arasında paylaşılan verilerde sürekli büyüklük kontrolü yapmak çok maliyetlidir.
Analiz tabanlı araçlar kullanmak bir diğer korunma
yöntemidir.Ancak problemin doğası gereği bu araçların prosedürler arası hareket eden bu verileri kontrol
SQL Enjeksiyon Nedir??? (1)
bir web uygulaması üzerinden arka plandaki
veritabanında çalıştırılması için SQL
komutlarının gönderilmesidir.
saldırganların veri çalma/değiştirmede
kullandıkları web saldırı metodlarından biridir.
Web uygulamasındaki login formu gibi
kullanıcı girişlerinin SQL sorgusunda
kullanıldığı yerlerde SQL komutları eklenmesi
ile veritabanına yetkisiz erişim sağlar
SQL Enjeksiyon Nedir??? (2)
Web uygulaması geliştirimindeki bir açıktır,
veri tabanı ya da web sunucusu açığı
değildir.
Çoğu programcı halen daha bu problemin
farkında değillerdir.
Birçok alıştırma ve demodaki örnek şablonlar bu
saldırıya açıktır
Daha da kötüsü internetteki birçok çözüm bu
Ne Sıklıkla Karşılaşılır? (1)
Özellikle frameworkler ve ORM (Object
Relational Mapping) gibi ekstra veritabanı
katmanlarının popülerleşmesi ile eskisine göre
bugünlerde biraz daha az görülmektedir ama
hala daha sıklıkla karşılaşılmaktadır.
SQL Injection Verizon'un en sık rastlanan 15
güvenlik saldırısı listesinde 3. sıradadır.
Web Uygulama Güvenliği Konsorsiyum'una
(WASC) göre 27 Temmuz 2006 tarihine kadar
medyada rapor edilen hack olaylarının %9'u
Nerelerde Görülür?
•
Hemen hemen tüm SQL veritabanları ve
programlama dilleri potansiyel olarak bu saldırıya
acıktır
Ms SQL Server, ORACLE, DB2, Potgres, Sybase vb.
•
Aşağıdaki araçlar kullanılarak geliştirilmiş
uygulamalarda görülmektedir.
ASP,JSP,PHP XML,XSL ve XSQL Javascript API‟s Ve daha birçoğuSQL ENJEKSĠYON TÜRLERĠ
Web uygulamalarında bir çok işlem için kullanıcıdan alınan veri ile dinamik SQL cümlecikleri oluşturulur.
Sql enjeksiyon 3 farklı şekilde gerçekleştirilebilir.
1. Meta Karakterlerin doğru şekilde ele alınmamasından
yararlanılarak yapılan enjeksiyon
2. Türlerin doğru şekilde ele alınmamasından yararlanılarak
yapılan enjeksiyon
1-Meta Karakterlerin doğru şekilde ele alınmamasından yararlanılarak yapılan enjeksiyon(1)
Bu enjeksiyon kullanıcı girdisi meta-karakterler için
kontrol edilmeden SQL cümleciğine sokulduğunda
gerçekleşir.Bu da orijinal SQL cümleciğinin
manipüle edilebilinmesine yol açar.
Bu SQL cümleciği, kullanıcının belirttiği userName
ile ilgili tüm kayıtları getirmesi için tasarlanmıştır.
Ancak “userName” değişkenine “ ‟ or „1‟=„1 ”
yazılırsa SQL cümleciği şuna dönüşecektir
„1‟=1 her zaman doğru olacağından dolayı,
bu cümlecik bütün “users” tablosunun
dökümünü getirecektir.
1-Meta Karakterlerin doğru şekilde ele alınmamasından yararlanılarak yapılan enjeksiyon(2)
2-Türlerin doğru şekilde ele alınmamasından yararlanılarak yapılan enjeksiyon
Bu enjeksiyon şekli kullanıcıdan alınan girdinin veri
türü kontrolünden geçirilmeden SQL cümleciğine
sokulmasından kaynaklanır.
Yukarıdaki cümlecikte “a_variable” değişkenine
“1;DROP TABLE `users` ” yazılırsa, programcının
çalıştırmak istediği sorgu değil, saldırganın yazdığı
“DROP TABLE” komutu çalışacak ve tüm “users”
tablosu silinecektir.
3-Kör(Blind) enjeksiyon (1)
Genellikle sunucu ve uygulama hata mesajlarının veritabanına ait bilgileri sızdırmayacak şekilde ayarlandığı zaman, yollanan isteklere alınan http cevaplarındaki farklılıklardan yararlanarak hedefe
ulaşmamıza ve istediğimiz sorguları çalıştırmamıza izin veren bir SQL enjeksiyon tipidir.
Bu amaçla true ve false durumları oluşmasına izin verecek SQL ifadeleri uygulama parametrelerine eklenerek, her iki durum için farklı cevaplar alınması beklenir. Böylece bu farklılıklardan
yararlanılarak çalışan sorgunun başarılı olup olmadığı rahatlıkla
3-Kör(Blind) enjeksiyon (2)
Uygulamanın yapısına bağlı olarak SQL Injection
açığından etkilense bile farklı durumlar için (true/false durumları) farklı cevaplar üretmediği veya cevapların değişmediği durumlar ile de karşılaşılabilir. Bu tip
uygulamalarda ise true ve false durumları için cevabın gelme sürelerindeki gecikmeler kullanılarak saldırının hedefine ulaşması sağlanabilir.
Örneğin yollanan sql sorgusu doğru ve geçerli bir sorgu
ise 5 saniye bekle, değilse bekleme gibi sorgular
oluşturmamıza izin veren fonksiyonlar aracılığı ile SQL enjeksiyon saldırıları gerçekleştirmek mümkündür.
Gerçek Bir SQL Enjeksiyon
Saldırısı Örneği (1)
Şekilde, aşağıdaki SQL sorgusunu
çalıştıran bir web sayfası görülmektedir.
SELECT id FROM login WHERE username = '$userName„ AND password = '$password‟
Gerçek Bir SQL Enjeksiyon
Saldırısı Örneği (2)
Kullanıcı adı olarak “Bil438" verdiğimizi ve şifre için de
“falan' OR 'x'='x ” yazdığımızı varsayalım.
Web uygulamasında kullanıcı girişleri doğru olarak
filtrelenmediği için, tek tırnak kullanımı “WHERE” kısmını iki-bileşenli bir sorguya dönüştürdü.
'x'='x' bölümü ilk bölüm ne olursa olsun şartın doğru
olmasını garantiler.
Bu da saldırganın login form'unu geçerli bir kullanıcı / şifre kombinasyonu bilmesine gerek kalmadan
aşabilmesini sağlar.
SELECT id FROM login WHERE username = „srivinas„ AND password = „mypassword' OR 'x'='x'
SQL Enjeksiyon'un etkileri
nedir?
SQL enjeksiyon, veritabanınızı saldırganın eline verip
istediği SQL komutlarını çalıştırmasına, istediği verileri silmesine ve değiştirebilmesine izin vermektedir.
Arka planda kullanılan veritabanına bağlı olarak SQL
enjeksiyon açıkları saldırgan için değişik seviyelerde veri/sistem erişimi sunar.
Bazı durumlarda dosyalardan okumak veya dosyalara
yazmak, ya da işletim sisteminde komutlar çalıştırmak mümkün olabilir. Micorosft SQL sunucusu gibi bazı SQL sunucuları stored ve extended prosedürler içerirler. Eğer bir saldırgan bu prosedürlere ulaşabilirse bu tam bir
SQL Enjeksiyondan Korunma
Yöntemleri (1)
Güvenlik duvarları ve benzer saldırı tespit mekanizmaları
bu konuda tam bir koruma sağlamayabilir. Web sitenizin herkese açık olması gerektiği için güvenlik
mekanizmaları web trafiğinin veritabanı sunucularınız ile web uygulaması aracılığı ile haberleşmesine izin
verecektir.
Sunucularınızı, veritabanlarını, programlama dillerini ve
işletim sistemlerinizi güncelleyip yamalarını geçmeniz kritik öneme sahip fakat SQL Enjeksiyon saldırılarını engellemede tam çözüm değildir.
SQL Enjeksiyondan Korunma
Yöntemleri (2)
SQL Enjeksiyon saldırılarından korumak 3 bölümlük bir
işlemden oluşur:
1. Sitenizin, SQL Enjeksiyon ve diğer açıklara karşı tam bir
güvenlik denetiminin yapılması ile güvenliğinizin mevcut halinin analiz edilmesi.
2. Web uygulamalarının ve BT altyapısının diğer tüm
bileşenlerinin steril olması için en uygun kodlama standartlarının / tekniklerinin kullanılması
3. Web bileşenlerindeki her değişiklik veya eklemeden
SQL Enjeksiyondan Korunma
Yöntemleri (3)
Ek olarak, SQL Enjeksiyon ve diğer tüm
saldırı tekniklerinin kontrolünde aklınızda
olması gereken ana ilkeler şunlardır:
“Web sitesinde güvenli olduğunu düşündüğümüz hangi bölümler hack saldırılarına açık?"
"Bir uygulamaya hangi veriyi göndererek normalde yapmaması gereken bir şeyi yaptırabiliriz?".
SQL Enjeksiyondan Korunma
Yöntemleri (4)
SQL Enjeksiyon açıklarının kontrolü web sitesinin ve
web uygulamalarının denetimi ile olur. Manuel açık denetimi karmaşık olabilir ve çok zamanınızı alabilir.
Web uygulamalarını denetlemenin en iyi yolu otomatik
ve keşifsel (heuristic) web güvenlik tarayıcısı kullanmaktır.
Otomatik web güvenlik tarayıcısı tüm web sitenizi gezer
ve SQL enjeksiyon açıklarını test eder. Hangi
GreenSQL DB Firewall ile Sql
Injection Önlemi
GreenSQL, sql injection saldırıları için veritabanlarını koruma altına almak üzere geliştirilmiş bir veritabanı firewall uygulamasıdır.
MySQL ve PostgreSQL‟ler için destek sunan GreenSQL temel olarak proxy olarak çalışarak gerçek database‟in önünde durur ve web uygulamasından gelen sql bağlantı isteklerini karşılayarak SQL komutlarını inceler ve bir risk scoring matrix kullanarak ilgili sql
cümlelerini analiz ederek aksiyon alır.
Bu şekilde, web uygulamanızda bir sql injection açığı bulunsa dahi GreenSQL sayesinde açıktan etkilenmemeniz mümkün olabilir.
Sonuç