Bu maddedeki bilgilerin için ek kaynaklar gerekli.Şubat 2022) () ( |
SQL enjeksiyonu, 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). SQL enjeksiyonu, uygulamaların yazılımları içindeki bir güvenlik açığından faydalanır, örneğin, uygulamanın kullanıcı giriş bilgileri beklediği kısma SQL ifadeleri gömülür, eğer gelen verinin içeriği uygulama içerisinde filtrelenmiyorsa veya hatalı şekilde filtreleniyorsa, uygulamanın, içine gömülmüş olan kodla beraber hiçbir hata vermeden çalıştığı görülür. SQL enjeksiyonu, çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veri tabanına dayalı tüm uygulamalarda gerçeklenebilir.
SQL enjeksiyon 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.
SQL enjeksiyonu, SQL alt dilini kullanan PHP, ASPX gibi birçok programlama dili üzerinde görülebilmektedir. Bu atak tekniği, SQL dili kullanılan sistemlerde genellikle GET ve POST verileri gönderilir ve alınırken yapılmayan filtrelemeler sebebiyle ortaya çıkar.
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.
Tarih
SQL enjeksiyonu, 1998 yılı civarında tartışılmaya başlanmıştır. Örneğin, 1998'de Phrak dergisinde yayımlanan bir makalede SQL enjeksiyonundan söz edilmiştir.
Form
Açık Web Uygulaması Güvenlik Projesi (AWUGP)'ne göre, SQL enjeksiyonu (SQLI), 2007-2010 yılları arasında web uygulamalarında en fazla görülen 10 güvenlik açığından biri olduğu belirtilmiştir.[] 2013'te ise yine AWUGP kapsamında, SQLI'ın web uygulamalarına en fazla yapılan saldırı olduğu kabul edildilmiştir.[] SQL enjeksiyonun'ın dört ana alt sınıfı vardır:
- Klasik SQLI
- Körleme SQL enjeksiyonu
- Veri Tabanı Yönetim Sistemi- Özel SQL enjeksiyonu
- Bileşik (Compounded) SQL enjeksiyonu:
- SQL enjeksiyonu + yetersiz kimlik doğrulama
- SQL enjeksiyonu + DDoS saldırıları
- SQL enjeksiyonu + DNS korsanlığı
- SQL enjeksiyonu + XSS
Storm Worm saldırısı, Compounded SQLI saldırılarına bir örnektir.
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.
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 ifadeleri, 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
Bu girdi Sql ifadesinin aşağıdaki şekilde işlenmesine neden olur:
sorgu = "SELECT * FROM kullanicilar WHERE isim = ' " + kullaniciAdi ' or '1' = '1 + " ';" |
Sorgunun geri kalanını engellemek için yorum satırı karakterleri kullanılır. (Aşağıda üç farklı SQl yorum satırı karakteri gösterilmiştir.). Üç 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çin ve 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, 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 farklı sorgular açmalarını engeller, ancak sorguları değiştirmelerine engel değildir.
Yanlış tip işleme (Incorrect type handling)
SQLI'ın bu türü, kullanıcı tarafından girilen alanın tür kontrolü 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; |
Körleme SQL enjeksiyonu
Körleme SQL enjeksiyonu, 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)
Veritabanını, sıradan bir uygulamada, mantıksal bir ifadeyi değerlendirmeye zorlar. Örneğin bir kitap inceleme sitesinde, hangi kitabın görüntüleneceğini belirlemek için yandaki 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); |
Sorgu sunucuda tamamlanır. Kullanıcı veritabanının, tablonun veya alanların adlarını ve sorgu ifadesini bilmediği için bu kısımlara müdahale edemez. Sadece yukarıdaki URL'nin bir kitap incelemesi getirdiğini görür. Saldırgan, http://kitaplar.ornek.com/incelemeyiGoster.php?ID=5 OR 1 = 1 ve http://kitaplar.ornek.com/incelemeyiGoster.php?ID=5 AND 1 = 2 URL'lerini yüklediği zaman aşağıdaki sorgulara neden olabilir.
SELECT * FROM kitapIncelemeleri WHERE id='5' OR '1'='1'; |
SELECT * FROM kitapIncelemeleri WHERE id='5' AND '1'='2'; |
Bu sorgular sonucunda "1 = 1" URL'si ile orijinal inceleme sayfası geliyorsa veya "1 = 2" URL'si ile boş sayfa veya hata sayfası gönderiyorsa, sorgu büyük olasılıkla her iki durumda başarıyla geçmiştir ve site SQL enjeksiyonu saldırılarına açıktır. Hacker, sunucuda çalışan MySQL sürüm numarasını ortaya çıkarmak için tasarlanmış bu sorgu dizesiyle devam edebilir: http://kitaplar.ornek.com/incelemeyiGoster.php?ID=5AND substring(@@version, 1, INSTR(@@version, '.') - 1)=4.Bu sorgu sonrasında MySQL 4 çalıştıran bir sunucuda kitap incelemesi gösterilecek diğer durumlarda boş sayfa veya hata sayfası gönderecektir. Hacker, başka bir saldırı yolu bulana kadar veya hedeflerine ulaşılıncaya kadar sunucudan daha fazla bilgi toplamak için sorgu dizeleri içinde kod kullanmaya devam edebilir.
İkincil SQL enjeksiyonu (Second order SQL injection)
İkincil SQL enjeksiyonu, kötü amaçlı kodlar içeren değerlerin gönderilir gönderilmez yürütülmeyip, bir süre tutulduğu zaman oluşur. Uygulama SQL ifadesini doğru şekilde encode edip, geçerli SQL ifadesi olarak depo edebilir. Sonrasında SQL enjeksiyonuna karşı denetimsiz olan uygulamanın başka bir kısmında, depolanan SQL ifadesi çalıştırılır. Bu saldırıyı gerçeklemek için saldırganın, gönderilen değerlerin daha sonra nasıl kullanıldığına dair daha fazla bilgiye sahip olması gerekir. Otomatik web uygulaması güvenlik tarayıcıları, bu tür bir SQL enjeksiyonunu kolaylıkla algılayamaz. Dolayısıyla kötü niyetli yazılımların kodun handi kısmında olduğu manuel olarak kontrol edilmelidir.
Saldırılara karşı önlemler
SQL enjeksiyonu, iyi bilinen bir saldırıdır ve basit önlemlerle kolayca önlenebilir. 2015'te Talktalk'daki bariz bir SQL enjeksiyon saldırısı sonrasında BBC, böyle büyük bir şirketin SQL enjeksiyonu açıklarının bulunmasının güvenlik uzmanlarını şaşırttığını belirtmişti.
PHP dilinle ortaya çıkması
SQL alt dilinin dahil olduğu PHP sistemlerde örnek olarak aşağıdaki örnek kod üzerinde ortaya çıkar.
<?php include("digerkodlar.php"); $veri = $_POST['veri']; # burada veritabanına kaydedilecek olan veri filtreleme yapılmadan POST olarak alınıyor ?>
Güvenlik açığını kapatmak:
<?php include("digerkodlar.php"); $veri = htmlspecialchars(addslashes(strip_tags($_POST['veri'])); # htmlspecialchars gibi bazı filtreleme komutlarıyla güvenlik açığını kapattık. ?>
Parametreleştirilmiş ifadeler
Çoğu uygulama geliştirme platformunda, parametre olarak kullanıcıdan gelen veri yerine parametrik ifadeler kullanılır. (placeholder veya bind variable olarak da isimlendirilirler.) Bir placeholder sadece verilen tipte veri saklar. Dolayısıyla SQL enjeksiyonu yalnızca ilginç (ve muhtemelen geçersiz) bir parametre değeri olarak ele alınır.
Çoğu durumda, SQL ifadesi belirlidir ve her parametre tablo olarak değil, bir skaler olarak saklanır. Kullanıcıdan gelen veri bu parametreye atanır.
Kod seviyesinde zorlamak (Enforcement at the coding level)
Object-relational mapping (ORM) kütüphanelerini kullanmak, SQL kod yazma gereksinimini ortadan kaldırır. Etkin olan ORM kitaplığı, object-oriented koddan parametrik SQL ifadeleri üretir.
Escaping
SQL'de özel anlamları olan karakterlerden kaçınmak gereklilir. SQL DBMS, hangi karakterlerin özel bir anlam taşıdığını açıklar ve kapsamlı bir sunar. Örneğin her parametre içindeki tek tırnak işareti('
), geçerli bir SQL string literal oluşturmsk için iki tek tırnak ile değiştirilir. (''
) mysqli_real_escape_string();
fonksiyonunu kullanarak parametrelerdern kaçınmak yaygın bir yöntemdir.
$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name'); $query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'", $mysqli->real_escape_string($username), $mysqli->real_escape_string($password)); $mysqli->query($query);
Bu fonksiyon şu karakterlerin başına backslash (\) ekler. \x00
, \n
, \r
, \
, '
, "
\x1a
. MySQL'e bir sorgu göndermeden önce veri güvenliğini sağlamak için kullanılır.
PHP'de birçok vertabanı türü için birçok fonksiyon var örneğin pg_escape_string() fonsiyonu PostgreSQL için. Slash eklemek için kullanılan addslashes (string $ str) fonksiyonu escaping karakterler için kullnılır. Veri tabanında sorgulanacak karakterlerin başına backslash (\) eklenmiş bir string döndürür. Bu karakterler tek tırnak işareti ('), çift tırnak işareti ("), backslash (\) ve NUL (NULL bayt) şeklindedir.
İnput güvenliğini sağlamak için şeffaf bir katman oluşturmak hata eğilimini azaltabilir, ancak tamamen ortadan kaldırmaz.
Örüntü kontrolü
Integer, float, boolean, string parametreleri, değerlerinin belirtilen tür için geçerli olup olmadığı kontrol edilebilir. Stringlerin başka paternlara göre de kontrol edilmesi gerekebilir. (tarih, UUID, sadece alfanumerik, vb.)
Veri tabanı izinleri
Web uygulamaları tarafından verilen, veri tabanında oturum açma izinlerini kısıtlamak, web uygulamalarındaki açıkları kullanan bir SQL enjeksiyon saldırılarının etkinliğini azaltmaya yardımcı olabilir.
Örneğin, Microsoft SQL Server'da bir veritabanı oturum açma işleminde bazı sistem tablolarına erişim kısıtlanabilir bu sayede veritabanındaki tüm text sütunlarına JavaScript eklemeyi deneyen kötü niyetli yazılımlar sınırlandırılmış olur.
deny select on sys.sysobjects to webdatabaselogon; deny select on sys.objects to webdatabaselogon; deny select on sys.tables to webdatabaselogon; deny select on sys.views to webdatabaselogon; deny select on sys.packages to webdatabaselogon;
Dış bağlantılar
Kaynakça
- ^ . Microsoft. 2 Ağustos 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2013.
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.
- ^ (PDF). 17 Nisan 2016 tarihinde kaynağından (PDF) arşivlendi..
- ^ Sean Michael Kerner (25 Kasım 2013). . 18 Mart 2014 tarihinde kaynağından arşivlendi..
- ^ Jeff Forristal (25 Aralık 1998). . . 22 Nisan 2017 tarihinde kaynağından arşivlendi.
(8. makale)
- ^ . 23 Nisan 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 23 Nisan 2020.
- ^ "WHID 2007-60: The blog of a Cambridge University security team hacked" 18 Nisan 2016 tarihinde Wayback Machine sitesinde .. Xiom. 03-06-2011 tarihinde arşivlendi.
- ^ "WHID 2009-1: Gaza conflict cyber war" 19 Nisan 2016 tarihinde Wayback Machine sitesinde .. Xiom.03-06-2011 tarihinde arşivlendi.
- ^ 18 Haziran 2009 tarihinde ,( Wayback Machine)
- ^ "Third Wave of Web Attacks Not the Last". 22 Nisan 2017 tarihinde Wayback Machine sitesinde . Dark Reading. 29-07-2017 tarihinde arşivlendi.
- ^ 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ı.
- ^ Deltchev, Krassen. "New Web 2.0 Attacks" 16 Ağustos 2017 tarihinde Wayback Machine sitesinde .. B.Sc. Thesis. Ruhr-University Bochum. 18-02-2010 tarihinde arşivlendi.
- ^ IBM Informix Guide to SQL: Syntax. Overview of SQL Syntax > How to Enter SQL Comments, IBM
- ^ macd3v. "Blind SQL Injection tutorial" 14 Aralık 2012 tarihinde Wayback Machine sitesinde .. 6 Aralık 2012 tarihinde arşivlendi.
- ^ Andrey Rassokhin; Dmitry Oleksyuk. "TDSS botnet: full disclosure" 9 Aralık 2012 tarihinde Wayback Machine sitesinde .. 6 Aralık 2012 tarihinde arşivlendi
- ^ "Questions for TalkTalk - BBC News" 26 Ekim 2015 tarihinde Wayback Machine sitesinde .. BBC News. 25-10-2015 tarihinde arşivlendi.
- ^ "SQL Injection Prevention Cheat Sheet". Open Web Application Security Project.3 Mart 2012 tarihinde arşivlendi.
- ^ "mysqli->real_escape_string - PHP Manual 17 Nisan 2016 tarihinde Wayback Machine sitesinde .". PHP.net.
- ^ "Addslashes - PHP Manual 5 Eylül 2011 tarihinde Wayback Machine sitesinde .". PHP.net.
- ^ "Transparent query layer for MySQL 11 Kasım 2010 tarihinde Wayback Machine sitesinde .". Robert Eisele. 8 Kasım 2010
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Bu maddedeki bilgilerin dogrulanabilmesi icin ek kaynaklar gerekli Lutfen guvenilir kaynaklar ekleyerek maddenin gelistirilmesine yardimci olun Kaynaksiz icerik itiraz konusu olabilir ve kaldirilabilir Kaynak ara SQL Enjeksiyonu haber gazete kitap akademik JSTOR Subat 2022 Bu sablonun nasil ve ne zaman kaldirilmasi gerektigini ogrenin SQL enjeksiyonu veri tabanina dayali uygulamalara saldirmak icin kullanilan bir atak teknigidir burada saldirgan SQL dili ozelliklerinden faydalanarak standart uygulama ekranindaki ilgili alana yeni SQL ifadelerini ekler Ornegin saldirgan veritabani icerigini kendisine aktarabilir SQL enjeksiyonu uygulamalarin yazilimlari icindeki bir guvenlik acigindan faydalanir ornegin uygulamanin kullanici giris bilgileri bekledigi kisma SQL ifadeleri gomulur eger gelen verinin icerigi uygulama icerisinde filtrelenmiyorsa veya hatali sekilde filtreleniyorsa uygulamanin icine gomulmus olan kodla beraber hicbir hata vermeden calistigi gorulur SQL enjeksiyonu cogunlukla web siteleri icin kullanilan bir saldiri turu olarak bilinse de SQL veri tabanina dayali tum uygulamalarda gerceklenebilir SQL Enjeksiyonu tipi atak tekniginin 2010 itibari klasifikasyonu SQL enjeksiyon saldirilari saldirganlarin sistemdeki kullanicilardan birinin bilgileriyle giris yapmasina mevcut verilere mudahale etmesine bazi islemleri iptal etmesine veya degistirmesine veri tabanindaki tum verileri ifsa etmesine veri tabanindaki tum verileri yok etmesine veri tabani sunucusunda sistem yoneticisi olmasina olanak saglar SQL enjeksiyonu SQL alt dilini kullanan PHP ASPX gibi bircok programlama dili uzerinde gorulebilmektedir Bu atak teknigi SQL dili kullanilan sistemlerde genellikle GET ve POST verileri gonderilir ve alinirken yapilmayan filtrelemeler sebebiyle ortaya cikar 2012 de yapilan bir arastirmada bir web uygulamasinin ayda ortalama 4 saldiri aldigi ve perakendecilerin diger endustrilerden iki kat fazla saldiri aldigi gorulmustur TarihSQL enjeksiyonu 1998 yili civarinda tartisilmaya baslanmistir Ornegin 1998 de Phrak dergisinde yayimlanan bir makalede SQL enjeksiyonundan soz edilmistir FormAcik Web Uygulamasi Guvenlik Projesi AWUGP ne gore SQL enjeksiyonu SQLI 2007 2010 yillari arasinda web uygulamalarinda en fazla gorulen 10 guvenlik acigindan biri oldugu belirtilmistir kaynak belirtilmeli 2013 te ise yine AWUGP kapsaminda SQLI in web uygulamalarina en fazla yapilan saldiri oldugu kabul edildilmistir kaynak belirtilmeli SQL enjeksiyonun in dort ana alt sinifi vardir Klasik SQLI Korleme SQL enjeksiyonu Veri Tabani Yonetim Sistemi Ozel SQL enjeksiyonu Bilesik Compounded SQL enjeksiyonu SQL enjeksiyonu yetersiz kimlik dogrulama SQL enjeksiyonu DDoS saldirilari SQL enjeksiyonu DNS korsanligi SQL enjeksiyonu XSS Storm Worm saldirisi Compounded SQLI saldirilarina bir ornektir Bu siniflandirma 2010 a kadar olan SQLI saldirilari icin gecerlidir Yeni gelismeler icin siniflandirmalar yapim asamasindadir Teknik uygulamalariCikis Escape karakterlerinin yanlis filtrelenmesi SQLi in bu turu kullanicidan gelen veri escape karaklerlerine gore filtrelenmedigi zaman uygulamaya kullanici girisinden yeni SQL ifadeleri eklenmesiyle olusur Eklenen SQL ifadeleri son kullanicinin veri tabanini istedigi sekilde manipule etmesine neden olur Asagidaki kod satiri bu guvenlik acigini gostermektedir sorgu span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullanicilar span span class w span span class k WHERE span span class w span span class n isim span span class w span span class o span kullaniciAdi Yukaridaki SQL sorgusu girilen kullanci adi bilgisine ait tum verileri kullanici tablosundan cekecek sekilde tasarlanmistir Sistem kullanici adi bekliyorken kullanici adi kismina kotu niyetli bir kullanici tarafindan sisteme zarar verecek sql ifadeleri yazilabilir Ornegin kullaniciAdi degiskenini asagidaki sekilde duzenleme yapilabilir or 1 1 Bu girdi Sql ifadesinin asagidaki sekilde islenmesine neden olur sorgu span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullanicilar span span class w span span class k WHERE span span class w span span class n isim span span class w span span class o span kullaniciAdi or 1 1 Sorgunun geri kalanini engellemek icin yorum satiri karakterleri kullanilir Asagida uc farkli SQl yorum satiri karakteri gosterilmistir Uc satirin sonunda da bir bosluk bulunmaktadir or 1 1 or 1 1 or 1 1 Saldirgan bu SQL ifadelerini uygulamaya kullanici girisi olarak girerse uygulama tabaninda calisacak sorgu asagidaki sekilde olur span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullanicilar span span class w span span class k WHERE span span class w span span class n kullaniciAdi span span class w span span class o span or 1 1 SELECT FROM kullanicilar WHERE isim or 1 1 SELECT FROM kullanicilar WHERE isim OR 1 1 span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullanicilar span span class w span span class k WHERE span span class w span span class n kullaniciAdi span span class w span span class o span OR 1 1 kullaniciAdi verisi ne olursa olsun 1 1 kosulu saglanacagi icin ve aradaki islemin OR olmasindan dolayi sorgu sonucu her zaman olumlu olacaktir Yorum satiri karakterlerinden sonra gelen tum karakterler yorum niteligi kazanacaktir ve onlarin bir onemi kalmayacaktir Asagidaki SQL ifadesindeki kullaniciAdi na girilen deger kisiler tablosunun silinmesine ve kisiBilgileri tablosundaki tum verilerin ifsa edilmesine neden olur a span class k DROP span span class w span span class k TABLE span span class w span span class n kullanicilar span span class p span span class w span span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullaniciBilgileri span span class w span span class k WHERE span span class w span span class s1 t span span class w span span class o span span class w span span class s1 t span Bu girdi Sql ifadesinin asagidaki sekilde islenmesine neden olur span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullanicilar span span class w span span class k WHERE span span class w span span class n kullaniciAdi span span class w span span class o span span class w span span class s1 a span span class p span span class k DROP span span class w span span class k TABLE span span class w span span class n kullanicilar span span class p span span class w span span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullaniciBilgileri span span class w span span class k WHERE span span class w span span class s1 t span span class w span span class o span span class w span span class s1 t span span class p span Cogu SQL sunucusu bir cagri ile birden fazla SQL ifadesinin yurutulmesine izin verirken PHP nin mysql query fonksiyonu gibi bazi SQL API leri guvenlik nedenlerinden dolayi buna izin vermez Bu durum saldirganlarin farkli sorgular acmalarini engeller ancak sorgulari degistirmelerine engel degildir Yanlis tip isleme Incorrect type handling SQLI in bu turu kullanici tarafindan girilen alanin tur kontrolu duzgun yapilmadiginda olusur Bir sql ifadesinde sayisal deger kullanildiginda kullanicinin girdisinin de sayisal deger olmasi gereklidir Bu kontrol yapilmadigi zaman bir guvenlik acigi olusur Ornegin sorgu span class o amp span span class n nbsp span span class p span span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullaniciBilgileri span span class w span span class k WHERE span span class w span span class n id span span class w span span class o span span class ss deger span span class p span Bu ifadede id alanina bir sayinin gelmesi amaclandigi aciktir Ancak bir string gelmesi bekleniyorsa son kullanici sql ifadesini istedigi sekilde degistirebilir Ornegin deger yerine asagidaki ifade yazilirsa 1 DROP TABLE kullanicilar Sql ifadesi asagidaki sekilde olacak ve bu ifade sonucunda kullanicilar tablosu veri tabanindan silinecektir span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kullaniciBilgileri span span class w span span class k WHERE span span class w span span class n id span span class o span span class mi 1 span span class p span span class w span span class k DROP span span class w span span class k TABLE span span class w span span class n kullanicilar span span class p span Korleme SQL enjeksiyonu Korleme SQL enjeksiyonu bir web uygulamasi bir SQLI na karsi acik oldugunda kullanilir ancak sonuclari saldirgan tarafindan gorulemez Guvenlik acigi bulunan sayfada veriler ifsa edilemez ama SQL ifadesinin icine gomulmus olan mantiksal ifade nedeniyle degistirilmis veriler goruntulenebilir Kosullu yanitlar Conditional Responses Veritabanini siradan bir uygulamada mantiksal bir ifadeyi degerlendirmeye zorlar Ornegin bir kitap inceleme sitesinde hangi kitabin goruntulenecegini belirlemek icin yandaki sorgu kullanilir http kitaplar ornek com incelemeyiGoster php ID 5 URL si sunucunun sorguyu calistirmasina neden olur span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kitapIncelemeleri span span class w span span class k WHERE span span class w span span class n id span span class o span span class n Deger span span class p span span class n ID span span class p span Sorgu sunucuda tamamlanir Kullanici veritabaninin tablonun veya alanlarin adlarini ve sorgu ifadesini bilmedigi icin bu kisimlara mudahale edemez Sadece yukaridaki URL nin bir kitap incelemesi getirdigini gorur Saldirgan http kitaplar ornek com incelemeyiGoster php ID 5 OR 1 1 ve http kitaplar ornek com incelemeyiGoster php ID 5 AND 1 2 URL lerini yukledigi zaman asagidaki sorgulara neden olabilir span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kitapIncelemeleri span span class w span span class k WHERE span span class w span span class n id span span class o span span class s1 5 span span class w span span class k OR span span class w span span class s1 1 span span class o span span class s1 1 span span class p span span class k SELECT span span class w span span class o span span class w span span class k FROM span span class w span span class n kitapIncelemeleri span span class w span span class k WHERE span span class w span span class n id span span class o span span class s1 5 span span class w span span class k AND span span class w span span class s1 1 span span class o span span class s1 2 span span class p span Bu sorgular sonucunda 1 1 URL si ile orijinal inceleme sayfasi geliyorsa veya 1 2 URL si ile bos sayfa veya hata sayfasi gonderiyorsa sorgu buyuk olasilikla her iki durumda basariyla gecmistir ve site SQL enjeksiyonu saldirilarina aciktir Hacker sunucuda calisan MySQL surum numarasini ortaya cikarmak icin tasarlanmis bu sorgu dizesiyle devam edebilir http kitaplar ornek com incelemeyiGoster php ID 5AND substring version 1 INSTR version 1 4 Bu sorgu sonrasinda MySQL 4 calistiran bir sunucuda kitap incelemesi gosterilecek diger durumlarda bos sayfa veya hata sayfasi gonderecektir Hacker baska bir saldiri yolu bulana kadar veya hedeflerine ulasilincaya kadar sunucudan daha fazla bilgi toplamak icin sorgu dizeleri icinde kod kullanmaya devam edebilir Ikincil SQL enjeksiyonu Second order SQL injection Ikincil SQL enjeksiyonu kotu amacli kodlar iceren degerlerin gonderilir gonderilmez yurutulmeyip bir sure tutuldugu zaman olusur Uygulama SQL ifadesini dogru sekilde encode edip gecerli SQL ifadesi olarak depo edebilir Sonrasinda SQL enjeksiyonuna karsi denetimsiz olan uygulamanin baska bir kisminda depolanan SQL ifadesi calistirilir Bu saldiriyi gerceklemek icin saldirganin gonderilen degerlerin daha sonra nasil kullanildigina dair daha fazla bilgiye sahip olmasi gerekir Otomatik web uygulamasi guvenlik tarayicilari bu tur bir SQL enjeksiyonunu kolaylikla algilayamaz Dolayisiyla kotu niyetli yazilimlarin kodun handi kisminda oldugu manuel olarak kontrol edilmelidir Saldirilara karsi onlemlerSQL enjeksiyonu iyi bilinen bir saldiridir ve basit onlemlerle kolayca onlenebilir 2015 te Talktalk daki bariz bir SQL enjeksiyon saldirisi sonrasinda BBC boyle buyuk bir sirketin SQL enjeksiyonu aciklarinin bulunmasinin guvenlik uzmanlarini sasirttigini belirtmisti PHP dilinle ortaya cikmasi SQL alt dilinin dahil oldugu PHP sistemlerde ornek olarak asagidaki ornek kod uzerinde ortaya cikar lt php include digerkodlar php veri POST veri burada veritabanina kaydedilecek olan veri filtreleme yapilmadan POST olarak aliniyor gt Guvenlik acigini kapatmak lt php include digerkodlar php veri htmlspecialchars addslashes strip tags POST veri htmlspecialchars gibi bazi filtreleme komutlariyla guvenlik acigini kapattik gt Parametrelestirilmis ifadeler Cogu uygulama gelistirme platformunda parametre olarak kullanicidan gelen veri yerine parametrik ifadeler kullanilir placeholder veya bind variable olarak da isimlendirilirler Bir placeholder sadece verilen tipte veri saklar Dolayisiyla SQL enjeksiyonu yalnizca ilginc ve muhtemelen gecersiz bir parametre degeri olarak ele alinir Cogu durumda SQL ifadesi belirlidir ve her parametre tablo olarak degil bir skaler olarak saklanir Kullanicidan gelen veri bu parametreye atanir Kod seviyesinde zorlamak Enforcement at the coding level Object relational mapping ORM kutuphanelerini kullanmak SQL kod yazma gereksinimini ortadan kaldirir Etkin olan ORM kitapligi object oriented koddan parametrik SQL ifadeleri uretir Escaping SQL de ozel anlamlari olan karakterlerden kacinmak gereklilir SQL DBMS hangi karakterlerin ozel bir anlam tasidigini aciklar ve kapsamli bir sunar Ornegin her parametre icindeki tek tirnak isareti gecerli bir SQL string literal olusturmsk icin iki tek tirnak ile degistirilir mysqli real escape string fonksiyonunu kullanarak parametrelerdern kacinmak yaygin bir yontemdir mysqli new mysqli hostname db username db password db name query sprintf SELECT FROM Users WHERE UserName s AND Password s mysqli gt real escape string username mysqli gt real escape string password mysqli gt query query Bu fonksiyon su karakterlerin basina backslash ekler x00 n r x1a MySQL e bir sorgu gondermeden once veri guvenligini saglamak icin kullanilir PHP de bircok vertabani turu icin bircok fonksiyon var ornegin pg escape string fonsiyonu PostgreSQL icin Slash eklemek icin kullanilan addslashes string str fonksiyonu escaping karakterler icin kullnilir Veri tabaninda sorgulanacak karakterlerin basina backslash eklenmis bir string dondurur Bu karakterler tek tirnak isareti cift tirnak isareti backslash ve NUL NULL bayt seklindedir Input guvenligini saglamak icin seffaf bir katman olusturmak hata egilimini azaltabilir ancak tamamen ortadan kaldirmaz Oruntu kontrolu Integer float boolean string parametreleri degerlerinin belirtilen tur icin gecerli olup olmadigi kontrol edilebilir Stringlerin baska paternlara gore de kontrol edilmesi gerekebilir tarih UUID sadece alfanumerik vb Veri tabani izinleri Web uygulamalari tarafindan verilen veri tabaninda oturum acma izinlerini kisitlamak web uygulamalarindaki aciklari kullanan bir SQL enjeksiyon saldirilarinin etkinligini azaltmaya yardimci olabilir Ornegin Microsoft SQL Server da bir veritabani oturum acma isleminde bazi sistem tablolarina erisim kisitlanabilir bu sayede veritabanindaki tum text sutunlarina JavaScript eklemeyi deneyen kotu niyetli yazilimlar sinirlandirilmis olur deny select on sys sysobjects to webdatabaselogon deny select on sys objects to webdatabaselogon deny select on sys tables to webdatabaselogon deny select on sys views to webdatabaselogon deny select on sys packages to webdatabaselogon Dis baglantilarKaynakca Microsoft 2 Agustos 2013 tarihinde kaynagindan arsivlendi Erisim tarihi 4 Agustos 2013 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 PDF 17 Nisan 2016 tarihinde kaynagindan PDF arsivlendi Sean Michael Kerner 25 Kasim 2013 18 Mart 2014 tarihinde kaynagindan arsivlendi Jeff Forristal 25 Aralik 1998 22 Nisan 2017 tarihinde kaynagindan arsivlendi 8 makale 23 Nisan 2020 tarihinde kaynagindan arsivlendi Erisim tarihi 23 Nisan 2020 WHID 2007 60 The blog of a Cambridge University security team hacked 18 Nisan 2016 tarihinde Wayback Machine sitesinde Xiom 03 06 2011 tarihinde arsivlendi WHID 2009 1 Gaza conflict cyber war 19 Nisan 2016 tarihinde Wayback Machine sitesinde Xiom 03 06 2011 tarihinde arsivlendi 18 Haziran 2009 tarihinde Wayback Machine Third Wave of Web Attacks Not the Last 22 Nisan 2017 tarihinde Wayback Machine sitesinde Dark Reading 29 07 2017 tarihinde arsivlendi Danchev Dancho 23 01 2007 Mind Streams of Information Security Knowledge Social Engineering and Malware olu kirik baglanti Ddanchev blogspot com 03 06 2011 tarihinde alintilandi Deltchev Krassen New Web 2 0 Attacks 16 Agustos 2017 tarihinde Wayback Machine sitesinde B Sc Thesis Ruhr University Bochum 18 02 2010 tarihinde arsivlendi IBM Informix Guide to SQL Syntax Overview of SQL Syntax gt How to Enter SQL Comments IBM macd3v Blind SQL Injection tutorial 14 Aralik 2012 tarihinde Wayback Machine sitesinde 6 Aralik 2012 tarihinde arsivlendi Andrey Rassokhin Dmitry Oleksyuk TDSS botnet full disclosure 9 Aralik 2012 tarihinde Wayback Machine sitesinde 6 Aralik 2012 tarihinde arsivlendi Questions for TalkTalk BBC News 26 Ekim 2015 tarihinde Wayback Machine sitesinde BBC News 25 10 2015 tarihinde arsivlendi SQL Injection Prevention Cheat Sheet Open Web Application Security Project 3 Mart 2012 tarihinde arsivlendi mysqli gt real escape string PHP Manual 17 Nisan 2016 tarihinde Wayback Machine sitesinde PHP net Addslashes PHP Manual 5 Eylul 2011 tarihinde Wayback Machine sitesinde PHP net Transparent query layer for MySQL 11 Kasim 2010 tarihinde Wayback Machine sitesinde Robert Eisele 8 Kasim 2010