SQL Injection Nedir ? Nasıl Yapılır ? Saldırı Çeşitleri ? Nasıl Korunulur ?

SQL Injection, veri odaklı uygulamalarda tabanda çalışan SQL dili özelliklerinden faydalanılarak standart uygulama ekranındaki ilgili alana ek SQL ifadelerini ekleyerek yapılan bir tür atak tekniğidir. SQL Injection, uygulama yazılımları içindeki güvenlik açığından faydalanır.

Aslında olay cok basit, web uygulaması yaparken bir cok işlemiçin kullanıcıdan alınan veri ile dinamik bir sql cümlesi oluşturulur. Örneğin: “SELECT * FROM TBL_PRODUCTS“;  İşte bu şekilde sql cümlecikleri oluşturulurken araya sıkıştırılan herhangi bir meta karakter Sql Injection’a neden olabilir.

Sql Injection Saldırı Örnekleri

Web sitelerin Login girişlerini veya url adreslerinde ki query gönderimlerini yazacağımız meta karakterler ile database hataya zorlıcaz. Bunun içinde veri olarak aşağıda verdiğim meta karakterler basic düzeyde bir site için yeterli olacaktır. Ama, meta karakterler geçmeden önce query mantığını sizi anlatmak isterim. Örnekte ki gibi “http://www.aaaa.com/Urun.aspx?Urun=1530″ bir web sitenin adresi satırında “Urun=1530″ adlı queryin yaptığı görev arka tarafta database sorgusunda şu şekildedir.SELECT * FROM TBL_PRODUCTS WHERE PRODUCT_ID=1530″ işte bizim tek yapmamız gereken bu sql query bizim çıkarlarımız doğrultusunda kullanmak Örneğin: “http://www.aaaa.com/Urun.aspx?Urun=1530’ or 1=1–“ gibi bir linki elle yazarak enterladığımız zaman arka planda SQL Query bu hali alıcaktır. “SELECT * FROM TBL_PRODUCTS WHERE PRODUCT_ID=1530’ or 1=1–” bu şekilde database hataya zorlanarak sistemin çalışmamasını hatta istediğimiz verilerin sistemden çalınması sağlanabilir.

’ or 1=1–

” or 1=1–

’ or ’a’=’a

or 1=1–

’) or (’a’=’a

” or “a”=”a

*Yukarıda verdiğim örnekler database yapısına göre çeşitlendirilebilir bu örnekler basic bir web sitesini hataya zorlamak için yeterldir.

Bu şekilde sistemi hataya zorladık mı sistemde acıksa bundan sonrası zaten çok basit klasik SQL cümleleriniz ile saldırıları gerçekleştiriyorsunuz işlem bu kadar basit.

SQL Injection Saldırılarına Birkaç Çözüm.

a) Öncellikle sistemiz hata verse bile kodlarımız hiçbir şekilde kullanıcıya göstermemiz lazım bunun için sistemimizi oluşturuyorken bir adet ERROR-404 sayfası oluşturup. Asp.net ile yazılmış bir site için webconfig’de tanımlamak yeterli olacaktır.

<system.web>
<customErrors mode=“On“>
<error statusCode=“400“ redirect=“BadRequest.aspx“/>
<error statusCode=“403“ redirect=“Yasak.aspx“/>
<error statusCode=“404“ redirect=“SayfaBulunamadi.aspx“/>
<error statusCode=“500“ redirect=“ServerError.aspx“/>
</customErrors>
</system.web>

Bu kod ile sistemimizde hata oluştuğu taktirde son kullanıcıya hiçbir veri bilgi gösterilmeden, bizim belirlediğimiz sayfalara yönlendirme işlemi gerçekleştirilmiş olacaktır.

b) İkinici olara SQL Query’leri yazarken kesinlikle tembellik yapmıcaz. Basit SQL sorguları oluşturmıcaz ve kesinlik benim önerim Store Procedure ve Parametreler kullanmaktır.

c) Üçüncü olarak ise login girişlerinde textboxlarımızda gönderdiğimiz Queryleri kontrol altına almalısınız. Bunu için zararlı cümlecikler girilebileceğini düşünerek kesinlikle Validation kullanarak kontrol altına alıcaz.

Sql Injection Saldırılarılarına Kod Yazarak Çözüm

C# ile querylerden coockielerden formlardan gelen potonsiyel saldırıları kod yazarak engelleyebiliriz. Dediğim gibi verilerde biz ne kullanıcığımızı biliyorsak geriye kalan metaları engellicez. Örneğin; ben querylerde sadece sayılar kullanıyorum o halde bana queryde yazılan diger tüm cümlelerde işlem yapmayı sağlıcak kodları kontrol altına almalıtım. Benim yazdığım kodları sizde kendi ihitiyacınıza göre derleyebilirsiniz. Aşağıdaki yazdığım kod sayesinde tehlikeli karakter içeren kodlar kontrol altına alıp eğer böyle bir işlem yapılmışsa salıdır yapanın ipsini alıp kendime mail atmasını sağlıyorum gerisi size kalıyor zaten…

public static string[]blackList = {“–“,”;–“,”;”,”/*”,”*/”,”@@”,”@”,

“char”,”nchar”,”varchar”,”nvarchar”,

“alter”,”begin”,”cast”,”create”,”cursor”,

“declare”,”delete”,”drop”,”end”,”exec”,”execute”,

“select”, “sys”,”sysobjects”,”syscolumns”,

“fetch”,”insert”,”kill”,”open”,

“table”,”update”,”’or 1=1– “,”or1=1– “,”’ or ’a’=’a”,”or 1=1–“,”’)or (’a’=’a”,”‘ or ‘a’=’a'”,”having 1=1″};

public static String _injectionkontrol = “”;

public static void InjectionKontrolEt()

{

for (int i = 0; i< blackList.Length; i++)

{

int sonuc = _injectionkontrol.IndexOf(blackList[i],0);

if (sonuc != -1)

{

string ZiyaretciIPsi = “”;

if (HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”] != null)

{

ZiyaretciIPsi=HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”].ToString();

}

else

if (HttpContext.Current.Request.UserHostAddress.Length!= 0)

{

ZiyaretciIPsi = HttpContext.Current.Request.UserHostAddress;

}

String Tarih = DateTime.Now.ToLongDateString();

string msgbody = “Saldırı Injection saldırıs… Saldırgan IP Adresi: “+ ZiyaretciIPsi + ” Saldırı Tarihi: “+ Tarih + ” Saldırı Kodu: “ +_injectionkontrol;

SmtpClient client = new SmtpClient();

client.Credentials = new System.Net.NetworkCredential(“fatihalkan@****.com”,”*********”); //Gonderimi Yapacak Email AD Sifre

client.Host = “mail.*****.com”;// SMTP sunucu olarak )

client.EnableSsl = false;

MailAddress from = new MailAddress(“*****@*******.com”); // kimden…

MailAddress to = new MailAddress(“fatihalkan@******.com”, “Fatih Alkan”); //Kime..

MailMessage message = new MailMessage(from,to);

message.Subject = “HACK”;

message.IsBodyHtml = true;

message.Body = msgbody;

client.Send(message);

HttpContext.Current.Response.Redirect(“~/Default.aspx”);

//bye byeee

}

}

2 comments

Bir Cevap Yazın