İçeriğe atla

SQL enjeksiyonu

Vikipedi, özgür ansiklopedi
21.35, 21 Nisan 2017 tarihinde Ayşegül Kahya (mesaj | katkılar) tarafından oluşturulmuş 18466223 numaralı sürüm (translation from https://en.wikipedia.org/wiki/SQL_injection)

SQL Injection, veri tabanına dayalı uygulamalara saldırmak için kullanılan bir atak tekniğidir; burada,saldırgan SQL dili özelliklerinden faydalanarak standart uygulama ekranındaki ilgili alana yeni SQL ifadelerini ekler.(Örneğin saldırgan,veritabanı içeriğini kendisine aktarabilir).[1] SQL Injection, uygulamaların yazılımları içindeki bir güvenlik açığından faydalanır,örneğin, uygulamanın kulanıcı giriş bilgileri beklediği kısma SQL ifadeleri gömülür, eğer gelen verinin içeriği uygulama içerisinde filtrelenmiyorsa ve ya hatalı şekilde filtreleniyorsa, uygulamanın içine gömülmüş olan kodla beraber hiçbir hata vermeden çalıştığı görülür.SQL Injection, çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veritabanına dayalı tüm uygulamalarda gerçeklenebilir.

SQL injection saldırıları, saldırganların, sistemdeki kullanıcılardan birinin bilgileriyle giriş yapmasına,  mevcut verilere müdahale etmesine, bazı işlemleri iptal etmesine veya değiştirmesine, veri tabanındaki tüm verileri ifşa etmesine, veri tabanındaki tüm verileri yok etmesine, veri tabanı sunucusunda sistem yöneticisi olmasına olanak sağlar.

2012'de yapılan bir araştırmada,bir web uygulamasının ayda ortalama 4 saldırı  aldığı ve perakendecilerin diğer endüstrilerden iki kat fazla saldırı aldığı görülmüştür. [2]

Tarih

SQL Injection, 1998 yılı civarında tartışılmaya başlanmıştır. [3] Örneğin, 1998'de Phrak dergisinde yayımlanan bir makalede SQL Injection'dan söz edilmiştir. [4]

Form

Açık Web Uygulaması Güvenlik Projesi kapsamında SQL Injection'ın,2007-2010 yılları arasında Web uygulamalarında en fazla görülen 10 güvenlik açığından biri olduğu belirtilmiştir. [5]2013'te ise yine AWUGP kapsamında, SQLI'ın web uygulamalarına en fazla yapılan saldırı olduğu kabul edildilmiştir. [6]SQL Injection'ın dört ana alt sınıfı vardır:

  • Klasik SQLI
  • Blind or Inference SQL injection
  • Veri Tabanı Yönetim Sistemi- Özel SQL injection
  • Bileşik (Compounded) SQL injection

Storm Worm salsırısı, Compounded SQLI saldırılarına bir örnektir. [11]

Bu sınıflandırma, 2010'a kadar olan SQLI saldırıları için geçerlidir.Yeni gelişmeler için sınıflandırmalar yapım aşamasındadır.[12]

Teknik Uygulamaları

Çıkış(Escape) Karakterlerinin Yanlış Filtrelenmesi

SQLI'ın bu türü, kullanıcıdan gelen veri escape karaklerlerine göre filtrelenmediği zaman uygulamaya kullanıcı girişinden yeni SQL ifadeleri eklenmesiyle oluşur.Eklenen SQL karakterleri, son kullanıcının veri tabanını istediği şekilde manipüle etmesine neden olur.

Aşağıdaki kod satırı, bu güvenlik açığını göstermektedir:

sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi + " ';"

Yukarıdaki SQL sorgusu girilen kullancı adı bilgisine ait tüm verileri, kullanıcı tablosundan çekecek şekilde tasarlanmıştır. Sistem kullanıcı adı bekliyorken,kullanıcı adı kısmına  kötü niyetli bir kullanıcı tarafından sisteme zarar verecek sql ifadeleri yazılabilir.Örneğin, "kullaniciAdi" değişkenini aşağıdaki şekilde düzenleme yapılabilir.

' or '1'='1

SQL verisini giriş verisi olarak gönderir isek uygulama tabanında çalışacak sorgu:

sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi ' or '1' = '1 + " ';"

Sorgunun geri kalanını engellemek için yorum satırı karakterleri kullanıyor (Aşağıda üç farklı SQl yorum satırı karakteri gösterilmiştir. [13]). Üç satırın sonunda da bir boşluk bulunmaktadır.

' or '1'='1' -- 
' or '1'='1' ({ 
' or '1'='1' /* 

Saldırgan bu SQL ifadelerini, uygulamaya kullanıcı girişi olarak girerse, uygulama tabanında çalışacak sorgu aşağıdaki şekilde olur.

SELECT * FROM kullanicilar WHERE kullaniciAdi ='' or '1' = '1 + " ';

"SELECT * FROM kullanicilar WHERE isim ='' or '1' = '1 + " ';"

"SELECT * FROM kullanicilar WHERE isim = '' OR '1'='1' -- ';

SELECT * FROM kullanicilar WHERE kullaniciAdi = '' OR '1'='1' -- ';

kullaniciAdi verisi ne olursa olsun '1'='1' koşulu sağlanacağı içimve aradaki işlemin OR olmasından dolayı sorgu sonucu her zaman olumlu olacaktır.Yorum satırı karakterlerinden sonra gelen tüm karakterler yorum niteliği kazanacaktır ve onların bir önemi kalmayacaktır.

Aşağıdaki SQL ifadesindeki "kullaniciAdi" na girilen değer, kişiler tablosunun silinmesine ve kişiBilgileri tablosundaki tüm verilerin ifşa edilmesine neden olur.

a';DROP TABLE kullanıcilar; SELECT * FROM kullanıciBilgileri WHERE 't' = 't'

Bu girdi Sql ifadesinin aşağıdaki şekilde işlenmesine neden olur:

SELECT * FROM kullanicilar WHERE kullaniciAdi = 'a';DROP TABLE kullanicilar; SELECT * FROM kullaniciBilgileri WHERE 't' = 't';

Çoğu SQL sunucusu uygulaması, bir çağrı ile birden fazla SQL ifadesinin yürütülmesine izin verirken, PHP'nin mysql_query () fonksiyonu gibi bazı SQL API'leri güvenlik nedenlerinden dolayı buna izin vermez. Bu durum, saldırganların farklo sorgular açmalarını engeller, ancak sorguları değiştirmelerine engel değildir.

Yanlış Tip İşleme(Incorrect type handling)

SQLI'ın bu türü, kullanıcı tarafından girilen alanın tür kontrolu düzgün yapılmadığında oluşur. Bir sql ifadesinde sayısal değer kullanıldığında, kullanıcının girdisinin de sayısal  değer olması gereklidir. Bu kontrol yapılmadığı zaman bir güvenlik açığı oluşur. Örneğin:

sorgu = " SELECT * FROM kullaniciBilgileri WHERE id =" + deger + "; "

Bu ifadede "id" alanına bir sayının gelmesi amaçlandığı açıktır.Ancak bir string gelmesi bekleniyorsa, son kullanıcı sql ifadesini istediği şekilde değiştirebilir.Örneğin değer yerine aşağıdaki ifade yazılırsa,

1;DROP TABLE kullanicilar

Sql ifadesi aşağıdaki şekilde olacak ve bu ifade sonucunda kullanicilar tablosu veri tabanından silinecektir.

SELECT * FROM kullaniciBilgileri WHERE id=1; DROP TABLE kullanicilar;

Blind SQL injection

Blind SQL injection, bir web uygulaması bir SQLI'na karşı açık olduğunda kullanılır, ancak sonuçları saldırgan tarafından görülemez.Güvenlik açığı bulunan sayfada veriler ifşa edilemez ama sql ifadesinin içine gömülmüş olan mantıksal ifade nedeniyle değiştirilmiş veriler görüntülenebilir.

Koşullu Yanıtlar(Conditional Responses)

Sıradan bir uygulama ekranında mantıksal bir ifadeyi değerlendirmek için veritabanını zorlar.Örneğin bir kitap inceleme sitesinde, hangi kitabın görüntüleneceğini belirlemek için bir sorgu kullanılır. http://kitaplar.ornek.com/incelemeyiGoster.php?ID=5 URL'si sunucunun sorguyu çalıştırmasına neden olur.

SELECT * FROM kitapIncelemeleri WHERE id=Deger(ID);
SELECT * FROM kitapIncelemeleri WHERE id='5' OR '1'='1';
SELECT * FROM kitapIncelemeleri WHERE id='5' AND '1'='2';

İkincil SQL injection(Second order SQL injection)

Saldırıları Hafifletme Yöntemleri

Dış bağlantılar

Kaynakça

  1. ^ Microsoft. "SQL Injection". Retrieved 2013-08-04. "SQL injection is an attack in which malicious code is inserted into strings that are later passed to an instance of SQL Server for parsing and execution. Any procedure that constructs SQL statements should be reviewed for injection vulnerabilities because SQLi Server will execute all syntactically valid queries that it receives. Even parameterized data can be manipulated by a skilled and determined attacker."
  2. ^ "Imperva Web Application Attack Report". 17 Nisan 2016 tarihinde kaynağından arşivlendi.
  3. ^ Sean Michael Kerner (25 Kasım 2013). "How Was SQL Injection Discovered? The researcher once known as Rain Forrest Puppy explains how he discovered the first SQL injection more than 15 years ago."
  4. ^ Jeff Forristal (Dec 25, 1998)"NT Web Technology Vulnerabilities". Phrack Magazine.(8. makale)
  5. ^ "Category:OWASP Top Ten Project". OWASP. 03-06-2011 tarihinde arşivlendi.
  6. ^ "Category:OWASP Top Ten Project" 13-08-2013 tarinde arşivlendi.
  7. ^ "WHID 2007-60: The blog of a Cambridge University security team hacked". Xiom. 03-06-2011 tarihinde arşivlendi.
  8. ^ "WHID 2009-1: Gaza conflict cyber war". Xiom.03-06-2011 tarihinde arşivlendi.
  9. ^ 18 Haziran 2009 tarihinde Arşivlendi,( Wayback Machine)
  10. ^  "Third Wave of Web Attacks Not the Last". Dark Reading. 29-07-2017 tarihinde arşivlendi.
  11. ^ Danchev, Dancho (23-01-2007. "Mind Streams of Information Security Knowledge: Social Engineering and Malware". Ddanchev.blogspot.com. 03-06-2011 tarihinde alıntılandı.
  12. ^  Deltchev, Krassen. "New Web 2.0 Attacks". B.Sc. Thesis. Ruhr-University Bochum. 18-02-2010 tarihinde arşivlendi.
  13. ^  IBM Informix Guide to SQL: Syntax. Overview of SQL Syntax > How to Enter SQL Comments, IBM