SQL Dersleri - 11 - SQL Injection Nedir ? Nasıl Yapılır ? - 1

SQL Dersleri - 11 - SQL Injection Nedir ? Nasıl Yapılır ? - 1

Merhabalar bu makalede SQL Injection hakkında içerik yer almaktadır.

Merhabalar SQL derslerimize SQL Injection ile devam ediyoruz. Türkçe anlamından yola çıkarak konuya giriş yapacağız. Bir SQL Injection (enjeksiyonu) veritabanınızı yok edebilir. O sebepten gerekli önlemleri almamız gerekmektedir. Konuya derin bir giriş yapmadan önce bazı konulara başlıklar altında değinmek isterim. 

Web Sayfalarında SQL 

Önceki bölümlerde, SQL kullanarak veritabanı verilerini almak (ve güncelleştirmek) türevi bilgiler öğrendik.

SQL, bir web sayfasında verileri görüntülemek için kullanılması için  web kullanıcılarının kendi arama değerlerini girmesine  olanak sağlanması kaçınılmazdır. 

SQL deyimleri yalnızca metin olduğundan, kullanıcıya seçilen verileri sağlamak , SQL ifadelerini dinamik olarak değiştirmek için küçük bir bilgisayar kodu parçası ile kolayca sağlanabilir.

Örnek;

Aşağıda örnek bir sunucu kodu yer almaktadır. 

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Yukarıdaki örnek, bir seçme dizesine bir değişken (txtUserId) ekleyerek bir select deyimi oluşturur. Değişken, kullanıcı girdisinden (İstek) sayfaya getirilir. 

Bu bölümün geri kalanında, SQL deyimlerinde kullanıcı girişi kullanma potansiyel tehlikeleri açıklanmaktadır.

SQL INJECTION NEDİR ? 

SQL enjeksiyonu, kötü amaçlı kullanıcıların bir SQL deyimine web sayfası girişi yoluyla SQL komutları ekleyebildiği bir tekniktir.

Enjekte edilen SQL komutları SQL deyimini değiştirebilir ve bir web uygulamasının güvenliğini tehlikeye atabilir.

1 = 1'e dayanan SQL Enjeksiyonu Her Zaman Doğru

Yukarıda paylaymış olduğum tekrar bakalım. 

Kodun asıl amacının, belirli bir kullanıcı kimliği olan bir kullanıcı seçmek için bir SQL deyimi oluşturmak olduğunu varsayalım.

Kullanıcıların "yanlış" girdiden girmesini engelleyecek hiçbir şey yoksa, kullanıcı şu şekilde bir "akıllı" girdi girebilir.

Örnek

Örneğin sunucu sonucu şu şekildedir. 

SELECT * FROM Users WHERE UserId = 105 or 1=1;

Yukarıdaki SQL geçerlidir. Çünkü, gelen istek  tüm satırları döndürür  ve sonuç olarak - 1 = 1 NEREDE her zaman doğrudur anlamına geldiği için giriş sağlanır. Farklı bir bakış açısıyla tanımlamak gerekirse SQL ifadesi ' OR 1=1 -- SQL dilinde her zaman true döndürür (olumlu sonuç döndürür). 

Farklı bir örnek

SELECT * FROM kullanicilar WHERE isim=''OR 1=1 --' AND sifre=''OR 1=1 --'

ismi boş olan tüm kullaniciların verilerini getir eğer getirmez ise 1=1 her zaman doğru ifadesi ile getirecektir. 

Farklı bir mantıkla devam edelim. Kullanıcılar tablosunda isimler ve şifreler varsa ne olur?

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

Akıllı bir bilgisayar korsanı, giriş kutusuna 105 veya 1 = 1 ekleyerek bir veritabanındaki tüm kullanıcı adlarına ve şifrelere erişebilir.

 

"" = "" Tabanlı SQL Enjeksiyonu Her Zaman Doğru

Burada bir web sitesine kullanıcı girişini doğrulamak için kullanılan ortak bir yapı var. 

uName = getRequestString("UserName");
uPass = getRequestString("UserPass");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

Akıllı bir bilgisayar korsanı, bir kullanıcı adı veya parola metin kutusuna "veya" "=" ekleyerek kullanıcı adlarına ve parolalara bir veritabanında erişebilir:

Sunucudaki kod şu şekilde geçerli bir SQL deyimi oluşturacaktır;

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
  • Aslında bu kod şu anlama gelmektedir. Users tablosunda ki name i boş alanları getir yada pass ı boş alanları getir. Eğer  yoksa boş = boş ve giriş yapılır.

Bu konunun yarısını sizler için anlatmaya çalıştım diğer bölümde devam edeceğiz. Şimdilik hoşçakalın :) 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git