O. Çalıkuş | SQL injection

Emre Çevikol tarafından 16-12-09 tarihinde yazıldı.
Yorum Yap
| Kategori: Teknoloji

SQL Injection, Web hacking metotlarının en popüler yöntemlerinden biridir. Özellikle frameworkler ve ORM (Object Relational Mapping) gibi ekstra veritabanı katmanlarının popülerleşmesi ile eskisine göre bugünlerde biraz daha az görülmektedir ama hala önemli bir hacking yöntemidir.

Web uygulaması geliştiricilercileri SQL Injection’ ı tam anlamadıklarından dolayı bazı ölümcül hatalar yaparlar. Bu yüzden bugün bilinen basit SQL Injection metodları o kadar çok görünmese de ileri de anlatacağımız ileri seviye SQL Injection açıklarını çok büyük firmalardan, hazır sistemlere kadar bir çok yerde görebilirsiniz.  SQL Injection’ı anlamak için önce SQL nedri sorusunu cevaplayalım.

SQL nedir?

SQL (Structured Query Language) veritabanlarında data çekme, silme ve değiştirme gibi işlemler için kullanılan basit yapılı bir dildir. Bugün hemen hemen tüm web uygulamalarının altyapısında veritabanı desteği vardır ve bu web uygulamaları veritabanı ile SQL aracılığıyla anlaşırlar.

Örnek bir kayıt alma SQL cümlesi şu şekilde olabilir;
SELECT * FROM subscribers WHERE

Yukarıdaki kod veritabanı tarafından çalıştırıldığında subscribers tablosunda id alanı 10 olan kayıt getirilecektir.

SQL Injection nedir?

SQL Injection, web sayfalarını kullanarak SQL sorgusu ve komutu gönderme tekniğidir. Birçok site kullanıcıdan aldığı parametrelerle veritabanına sorgular göndermektedir. Örnek olarak kullanıcı girişi sayfasını düşünün, girilen ad ve şifre yardımıyla bu kişinin kayıtlı bir kullanıcı olup olmadığı veritabanına sorulur. SQL Injection ile SQL sorgusunu değiştireceğimiz ve istediğimiz bilgilere ulaşabileceğimiz sonuçlar elde edebiliriz.

Meta-karakter bir program için özel anlamı olan karakterlere verilen isimdir. Örnek olarak C temelli C#, Javascript, PHP gibi dillerde (\) backslash karakteri bir meta-karakterdir. Compiler (derleyici) ya da Interpreter (yorumlayıcı) bu karakteri görünce ondan sonraki karakteri ona göre işler.

SQL’ için kritik metakarakter (‘) tek tırnak’ tır. Çünkü iki tek tırnağın arası string olarak algılanır. Diğer bir önemli meta-karakter ise (;) noktalı virgüldür, satırın bittiğini ve yeni satır başladığını bildirir.

Genel bir web uygulamasında olası bir üye girişi işlemi şu şekildedir;

  • Formdan gelen kullanıcı adı ve şifre bilgisi ile ilgili SQL cümleciği oluşturulur (SELECT * FROM subscribers WHERE user=’admin’ AND password=’sifre’ gibi)
  • SQL cümleciği kayıt döndürüyorsa böyle bir kullanıcının var olduğu anlamına gelir ve session(oturum) açılır ve ilgili kullanıcı üye girişi yapmış olur.
  • Eğer veritabanından kayıt dönmediyse “kullanıcı bulunamadı” veya “şifre yanlış” gibi bir hata ile ziyaretçi tekrar üye girişi formuna gönderilir.

ASP ile yazılmış örnek bir üye girişi kodu;

<%
1.          FUsername = Request.Form(”username”)
2.          FPassword = Request.Form(”password”)
3.
4.                Set RsLogin = SQLConn.Execute(”SELECT * FROM subscribers WHERE username =      ‘” & FUsername & “‘ AND Password = ‘” & FPassword & “‘”)
5.
6.          If RsLogin.EOF AND RsLogin.BOF Then
7.                Response.Redirect “/error.asp”
8.   
9.          Else
10.               Session(”login”) = RsLogin(”user_id”)
11.               Response.Redirect “../”
12.
13.         End If
%>

Kod gayet basit. 1. ve 2. satırda “username ve “passwordform değişkenlerinin değerlerini alıyor. 4. satırda SQL cümleciğinin içerisine yerleştirip kullanıcı kontrolü yapıyor. 

Bu işlemden sonra 6. satırda sonucun boş olup olmadığına bakıyor. Eğer boş ise yani kullanıcı veritabanında bulunmadıysa 7. satırda görüldüğü gibi kullanıcıyı hata sayfasına gönderiyor.

Eğer bulunduysa 10 ve 11. satırdaki işlemleri yapıyor. Yani kullanıcıya id’ si ile birlikte bir session açıyor. Bu sayede kullanıcı sisteme giriş yapmış oluyor.

Bu klasik bir login prosedürü. Tabii ki daha farklı ya da karışık olabilir.

Kullanıcı adı ve şifreye bir injection denemesi yapıp neler olacağını inceleyelim. Eğer kullanıcı adı ve şifre yerine “‘ OR ”=’” ve “‘ OR ”=’” girersek başarılı bir şekilde üye giriş yapmış oluyoruz ama nasıl ve niye?

Şimdi çalışan örnek kodu tekrar hatırlayalım 1 ve 2. satır form değerini alıyordu 4. satırda bu gelen değerleri SQL’ in içerisine yerleştirip veritabanında sorgu yaptırtıyordu.

Form değerlerini yerlerine yerleştirelim ve az önceki çalışan SQL’ e bakalım;

SELECT * FROM subscribers WHERE username = ” OR ”=” AND Password = ” OR ”=”

Farkettiğiniz üzere bu SQL sorgusu her zaman doğru dönecek ve “Subscribers” tablosundaki tüm üyeleri getirecektir. Bu SQL cümleciğini tercüme edersek şu şekilde olacaktır. Subscribers tablosundan username boş olanları ve password ü boş olanları getir ya da boş eşittir boş!

Birinci ve ikinci mantıksal kontrolün kayıt döndürüp döndürmemesi önemli değil çünkü üçüncü kontrol her zaman doğru olarak döneceğinden (boş her zamana boşa eşit değil mi?) bu SQL cümleciği her zaman tüm kayıtları döndürecektir. Yani kayıt boş mu dolu mu diye kontrol ettiğimizde kayıt dolu olarak gözükecektir. Farkettiyseniz OR kullandık dolayıyla mantıksal sorguların herhangi bir doğru (true) olarak dönerse tüm kayıtlar dönmüş oluyor.

Dolayısıyla bu SQL Injection’ ı yaptığımızda dönen kayıtlardaki ilk kullanıcı olarak giriş yapılmış olacaktır.

Gördüğünüz gibi SQL Injection; SQL cümleciklerinin arasına dışarıdan girdi yaparak SQL’ i istediğiniz şekilde manipüle etmenize izin veriyor.

Başka teknikler neler olabilir?

Web hacking açısından cross-site scripting ve buffer overflow teknikleri de çok bilinen tekniklerdir. Bu tekniklere daha sonra ayrıntılı değineceğiz fakat kısaca değinmek gerekirse:

  • Cross-site scripting : Bir bilgisayar güvenlik açığıdır. Saldırgan, HTML kodlarının arasına istemci tabanlı kod gömerek kullanıcının tarayıcısında istediği istemci tabanlı kodu çalıştırabilir.
  • Buffer overflow: iki yazılım arasında veri iletişimi için ayrılmış olan bir arabelleğe boyutundan daha fazla veri konulması ile ortaya çıkan durumdur. Arabellek aşımı, eğer durdurulmaz ise, her türlü işlemi yapmakta kullanılabilir. Örneğin, Bl@ster virüsü Windows NT ailesindeki RPC modülündeki bir arabellek aşımı sorununu kullanarak yayılmakta idi.

 

Onur ÇALIKUŞ

Paylaş:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • FriendFeed
  • StumbleUpon
  • Technorati
  • Twitter

Yoruma Kapalı..