Tüm Detayları İle SQL Injection Nedir? SQL Eğitim Dokümanı
Sizlere bu konumuzda SQL Injection'a dair detaylıca bilgiler vermeye, konumuzun açıklayıcı ve anlaşılır olması adına örneklemelere yer vererek daha iyi anlayacağınız bir doküman haline gelmesi için elimizden geldiğince anlatımı yapmaya çalıştık.
![]() |
| SQL Injection |
Konumuzun daha iyi anlaşılır olabilmesi için öncelikle bazı kavramlara açıklama yaparak başlangıcı yapacağız. Anlatımını yapacağımız doküman içeriğine yönelik konu başlık listesi aşağıdaki gibi olacaktır.
SQL Injection Konu Başlıkları:
1. SQL nedir? SQL çeşitleri nelerdir?
2. SQL Injection nedir?
3. SQL Injection Türleri Nelerdir?
3.1 In-band SQLi (Classic)
3.2 Inferential SQLi (Blind)
3.3 Out-of-band SQLi
4.SQL Injection Korunma Yöntemleri
Yukarıda verilen başlıklara açıklamalar yapmaya çalışarak, dokümanımıza başlangıcı yapalım.
1. SQL nedir? SQL çeşitleri nelerdir?
Veri tabanını yönetebilmeniz için kullanılan sorgu diline SQL diyebiliriz. Açık bir ifadeyle verilerin yönetimi, kendi içerisindeki söz dizimleri ve buna bağlı olarak her türlü veri tabanını ilgilendiren komutların kapsamı denilebilir. Yani komutlar, SQL dilini oluşturur aslında. SQL dilinin bir çok farklı çeşitleri mevcuttur. Örnek vermek gerekirse Microsoft SQL Server, Oracle, Mysql, Postgresql popüler olanlarıdır. Farklı çeşitleri olsa da aslında arka plandaki çalışmanın temelinde hepsinin komutlar aracılığıyla hareket ettiklerini bilmemiz gerekir. Kullanımları amacına göredir ve farklı çeşitlerinin mevcut olmasından kastımız, amacına göre kategorilere ayırmamızdan dolayıdır.
2. SQL Injection nedir?
SQL teriminin Injection ile birleştirilmesinin kısaltılmış hali olarak bilmemiz yeterlidir. Yani SQL+Injection=SQLI. SQL Injection normal kullanıcıların görmemesi veya görüntülenmemesi gereken bilgilere yetkisiz bir şekilde erişimin sağlanması amacıyla, veri tabanınızı manipüle etmek için ölümcül bir saldırı türüdür. Nihayetinde yabancı yani 3. kişilerce erişilmesini istemediğimiz bilgilere erişimin sağlanması, güvenlik zafiyetlerini de beraberinde getirmektedir. Örneğin hassas şirket verileri, kullanıcı bilgileri yada benzeri olarak müşteri bilgilerine kadar her türlü ayrıntıların ele geçirilmesi, ağır sorunların ortaya çıkmasına ve yıkıcı etkilere maruz kalmasına sebebiyet verebilir. Yazımızdan anlaşılacağı üzere SQL Injection bir kurum üzerinde inanılmaz yetki genişliğinin ele geçirilmesi ve bu tür ölümcül saldırıların gerçekleşmesi durumda, sistemdeki bütün tabloların ele geçirilmesine, veya yönetici yetkilerinin ele geçirilmesine kadar bir sürece gidilebileceğini söylemek sanırım yanlış olmayacaktır. Bu tür saldırılar kurumlar yada firmalar için güvensizlik oluşturabilir.
SQL injection tehlikesindeki durumu anlamınız için özet olarak verebileceğimiz bilgi, veritabanınızı yok edebilecek bir saldırı mekanizmasıdır.
Cümlemizden çıkarmanız gereken sonuç, başarılı bir SQL saldırısı ciddi sonuçların ortaya çıkmasına veya yıkıcı etkilere maruz kalmanıza neden olabilmektedir.
Başarılı bir SQL injection zafiyetinin gerçekleşmesi durumda, bazı önemli verilere ulaşılabilir. Örneğin kullanıcıların kişisel bilgileri, kullanıcı şifreleri, kredi kartı gibi bir-çok hassas bilgilere kadar özel veriler ele geçirilebilir. SQL Injection'daki zafiyet taramaları her ne kadar veri tabanına yönelik olsa da, genel olarak web sitelerinin daha çok hedef tahtası halinde olduğunu söyleyebiliriz.
3. SQL Injection Türleri Nelerdir?
Bu başlığımız da SQL Injection türlerine değinelim.
SIMPLE:
Hacker rastgele veri veya komutları girmek için doğrulanmamış kullanıcı girdisini kullanır.
BLIND:
Tespit edilmesi en zor saldırılardan biridir. Bu saldırı türünde databaseden herhangi bir arıza alamazsınız. Veriler yalnızca database e soru sorularak çıkarılır.
UNION:
Bir uygulama SQL saldırısına karşı savunmasız olduğunda ve sorgunun sonuçları uygulamanın yanıtları içerisinde döndürüldüğünde UNION kelimesi veri tabanından veri almak için kullanılabilir. Bu bir SQL injection Union saldırısıyla gerçekleşir.
ERROR:
Hacker veritabanına sonuçları hatalarla dönen kötü amaçlı sorgular göndererek saldırı gerçekleştirilir.
-------
SQL Injection, ciddi sorunlara neden olmak için çeşitli şekillerde kullanılabilir. Saldırgan, SQL Injection’dan yararlanarak, bir veri tabanındaki kimlik doğrulamasını atlayabilir, erişebilir, verileri değiştirebilir ve silebilir. Bazı durumlarda, SQL Enjeksiyonu işletim sistemindeki komutları yürütmek için bile kullanılabilir ve potansiyel olarak bir saldırganın bir güvenlik duvarının arkasında bulunan bir ağın içinde daha zarar verici saldırılara yükselmesine izin verir.
SQL Enjeksiyonu üç ana kategoriye ayrılabilir:- In-band SQLi (Classic)
- Error-based SQLi
- Union-based SQLi
- Inferential SQLi (Blind)
- Boolean-based SQLi
- Time-based SQLi
- Out-of-band SQLi
3.1 In-band SQLi (Classic)
SQL Injection saldırılarının en yaygın ve kullanımı kolay olanıdır. Bir saldırgan hem saldırıyı başlatmak hem de sonuçları toplamak için aynı iletişim kanalını kullanır.
a) Error-based SQLiVeri tabanının yapısı hakkında bilgi edinmek için veri tabanı sunucusu tarafından atılan hata mesajlarına dayanan bir SQL Injection tekniğidir. Bazı durumlarda, bir saldırganın tüm veri tabanını numaralandırması için tek başına hata tabanlı SQL enjeksiyonu yeterlidir. Hatalar bir web uygulamasının geliştirme aşamasında çok yararlı olsa da, canlı bir sitede devre dışı bırakılmalı veya bunun yerine sınırlı erişime sahip bir dosyaya giriş yapılmalıdır. Bu kategori için internette bulduğum birkaç örnek şu şekildedir.
Select * from stores where product_id = blah’ or 1=1-- (buradan sonraki her şey sistem tarafından görmezden gelinecektir)
Select * from users where username=’blah’ or ‘a’=’a’ -- and password=’pass’
b) Union-based SQLiİki veya daha fazla “SELECT” ifadesinin sonuçlarını tek bir sonuçta birleştirmek için UNION SQL operatörünü kullanan ve daha sonra HTTP yanıtının bir parçası olarak döndürülen bir SQL Injection tekniğidir. Bu HTTP yanıtında, saldırgan tarafından kullanılabilecek veriler içerebilir. Bu kategori için bulduğum örnekler şunlardır:
Select * from stores where product_id=1 union select 1,database(),user(),4#Select * from stores where id=1’
3.2 Inferential SQLi (Blind)
Inferential SQL Injection, In-band SQL Injection’dan farklı olarak, bir saldırganın istismar etmesi daha uzun sürebilir, ancak diğer SQL Injection türleri kadar tehlikelidir. Inferential SQLi saldırısında, web uygulaması aracılığıyla gerçekte hiçbir veri aktarılmaz ve saldırgan, saldırının sonucunu göremez (bu nedenle bu tür saldırılara genellikle “kör SQL Injection saldırıları” adı verilir) . Bunun yerine bir saldırgan, veri göndererek, web uygulamasının yanıtını ve veri tabanı sunucusunun sonuçta ortaya çıkan davranışını gözlemleyerek veri tabanı yapısını yeniden oluşturabilir.
a) Boolean-based Blind SQL InjectionsVeri tabanına bir SQL sorgusu göndermeye dayanan ve sorgunun DOĞRU veya YANLIŞ sonucu döndürmesine bağlı olarak uygulamayı farklı bir sonuç döndürmeye zorlayan bir SQL Enjeksiyon tekniğidir.
Sonuca bağlı olarak, HTTP yanıtı içindeki içerik değişecek veya aynı kalacaktır. Bu, bir saldırganın veri tabanından hiçbir veri döndürülmemiş olsa bile kullanılan payload doğru mu yoksa yanlış mı döndürdüğünü anlamasına olanak tanır. Bir saldırganın bir veri tabanını karakter karakter numaralandırması gerekeceğinden, bu saldırı genellikle yavaştır (özellikle büyük veri tabanlarında).
www.akblog.net/item.php?id=34 and 1=2 gibi.
b) Time-based Blind SQL InjectionsSaldırgan, veri tabanına bir SQL sorgusu göndererek veri tabanının tepki verebilmesi için (saniye cinsinden bir süre) beklemesini sağlar. Saldırgan, veri tabanının yanıt vermesi için geçen süreyi, bir sorgunun doğru mu yanlış mı olduğunu görebilir. Sonuca bağlı olarak, anında veya bir bekleme süresinden sonra bir HTTP yanıtı oluşturulacaktır. Saldırgan, veri tabanındaki verilere güvenmeden, kullandıkları mesajın doğru mu yanlış mı döndürdüğünü hesaplayabilir.
http://wwwakblog.local/item.php?id=34 and if(1=1, sleep(10), false)
3.3 Out-of-band SQLi
Bu teknik çok yaygın değildir, çünkü çoğunlukla web uygulaması tarafından kullanılan veri tabanı sunucusunda etkinleştirilen bazı özelliklere bağlıdır. Bu saldırıda saldırgan, saldırıyı başlatmak ve sonuçları toplamak için aynı kanalı kullanamadığında oluşur.
Out-of-band teknikleri, bir saldırgana özellikle de sunucu yanıtları çok kararlı olmadığı zamanlarda, inferential time-based tekniklere bir alternatif sunar, (inferential time-based saldırıyı güvenilmez kılar).
Out-of-band SQLi teknikleri, veri tabanı sunucusunun bir saldırgana veri sağlamak için DNS veya HTTP talepleri yapma becerisine dayanır.
SQL Injection saldırılarını önleme ve azaltma
SQLI saldırılarının gerçekleşmesini önlemenin yanı sıra, bunlara karşı korunmanın birkaç etkili yolu vardır.
İlk adım, kullanıcı girdilerini kontrol edilmesi gerekmektedir. Kullanıcı herhangi bir SQL cümlesi girmesi halinde sistem tarafından bu girdinin kontrol edilmesi, değerlendirilmesi zorunlu olmalıdır.
Diğer bir çözüm ise SQL Injection veya diğer çevrimiçi tehditleri filtrelemek için yaygın olarak bir web uygulaması güvenlik duvarı (WAF) kullanılması gerekmektedir. Modern web uygulaması güvenlik duvarları da genellikle diğer güvenlik çözümleriyle entegredir.
Genel olarak toparlamak gerekirse:- Dinamik SQL kullanmayın
- Kullanıcı tarafından sağlanan girdileri kontrol edilmesi
- Hassas verileri düz metin olarak bırakmayın
- Veritabanı izinlerini ve ayrıcalıklarını sınırlayın
- Veritabanı hatalarını doğrudan kullanıcıya göstermekten kaçının
- Veritabanlarına erişen web uygulamaları için bir Web Uygulaması Güvenlik Duvarı (WAF) kullanın
- Veritabanlarıyla etkileşim kuran web uygulamalarını rutin olarak test etmek için bir web uygulaması güvenlik testi çözümü kullanın
- Veri tabanlarını güncel tutun
Son maddeye dikkat edin. Veritabanını kesinlikle güncel tutmaya özen gösterin.
4. SQL INJECTION’I NASIL ÖNLERİZ?
Programlama dilleri veritabanı sürücülerini kullanarak SQL veritabanları ile konuşur. Bir sürücü bir uygulamanın veritabanında SQL ifadeleri oluşturmasına ve çalıştırmasına verileri gerektiği gibi çıkarmasına ve değiştirmesine izin verir. Parametreli ifadeler SQL ifadelerine aktarılan parametrelerin güvenli bir şekilde ele alınmasını sağlar. Eğer uygunsa her zaman parametreli ifadeler kullanılmalıdır.
Bunların yanında her zaman en kötü senaryoyu da ele alıp verilerinizin yedeklerini tutmanızda fayda vardır.
--
---
akblog.net
