SQL Injection

SQL Nedir?

SQL (Structured query language) Injection’ından önce SQL’in ne demek olduğundan bahsedelim. SQL veri tabanında tutulan bilgileri görüntüleme, ekleme ve silme işlemleri için kullanılan bir çeşit programlama dilidir.

Veri tabanında veri kümeler halinde tutulur. Bu kümeleri anlamlı hale getirmek ve görüntülenmek için SQL sorgusu kullanılır. İnternette web sayfalarında görüntülenen çoğu grafikler, tablolar ve verilerin birleştirilerek anlamlı hale gelmesini SQL sorguları yardımıyla hazırlanır bir başka değiş ile kullanıcı grafiği ya da tabloyu görüntüleyebilmesi için kullanılan ilk araç SQL sorgusudur.

Günümüzdeki internet uygulamalarının neredeyse tamamında veri tabanı kullanılmaktadır, buralarda kullanıcı bilgileri, şifreler, fotoğraflar, videolar gibi çeşitli veriler tutulmaktadır. Veri tabanı olarak Oracle, MySql, MsSql gibi uygulamalar kullanabilirsiniz ancak hepsi verileri görüntülemek için SQL kullanmaktadır.

SQL Injection Nedir?

Teknik, uygulamanın kullanıcı için oluşturduğu dinamik sorgu içerisine beklentiden çok daha fazla bilginin sorguya müdahale edilerek getirilmesine denir.

İnternet uygulamalarında, çoğu işlem için kullanıcıdan gelen parametreye göre dinamik sorgu oluşturulur. Bilgilerin bir kısmı kullanıcıya özeldir yani diğer kullanıcıların bu bilgiye ulaşamaması gerekir. SQL Injection teknikleri ile bu bilgiler istenmeyen kötü amaç güden kişilerin eline geçebilir.

SQL Injection zaafı bir uygulama için en tehlikeli hassas veri gizliliği açığıdır. Güvenli internet sitesi oluşturmak için SQL Injection önlemlerinin eksiksiz alınmış olması gerekir.

İnternet uygulamaları ilk çıktığı zamanlar CSS, Javascript yoktu, sadece birkaç resim ve sabit yazılar vardı. İnternet uygulamaları popüler olmaya başladıktan sonra ASP, JSP ve PHP dilleri geliştirildi ve ilişkili veri tabanları ile uygulama geliştirilmeye başlandı, bunlara da dinamik internet projeleri dendi. Dinamik projeler ilk yaygınlaşmaya başlamasıyla birlikte kötü amaç güden kişilerin keşfettiği metotların başında SQL Injection yer almaktadır.

Nasıl ve Neden SQL Injection Saldırısı Yapılır?

SQL Injection saldırısı yapılabilmesi için internet sitesinde SQL Injection zaafının bulunması ve kötü amaç güden kişiler tarafından tespit edilmesi gerekir.

Zaafın gerçekleşebilmesi için ziyaretçi tarafından gelen parametrenin hiçbir kontrolden geçmeden SQL üzerinde kullanılması ile meydana gelir. Kötü amaç güden kişi bu açığı kullanarak SQL içerisine kötü niyetli scripti yerleştirir ardından veri tabanı üzerindeki tablo isimleri, tabloların içerikleri (kullanıcı, şifre, kredi kartı bilgisi vs.) gibi bilgileri ele geçirirler yani yerleştirilen script ile saldırgan veri tabanı üzerindeki tüm bilgiye erişir.

Uygulama finans ile ilgili ise ya da bakiye durumu gibi bir özellik mevcutsa saldırgan bu veriler üzerinde değişiklik, hesaplar arasında para transferi yapabilir.  

Veri tabanı üzerindeki bilgiler silinip, uygulama çalışamaz duruma gelebilir. Yetkili veri tabanının yedeğini almış bile olsa, bilgiler tekrar yüklenmeden uygulama çalışamaz.

Basit SQL Injection Örneği

String sql = “Select * from members where username = ‘“ + pUsername + “’ and password=’“ + pPassword + “’”;

Yukarıdaki gibi basit bir SQL sorgusu olsun. Burada pUserName ve pPassword parametreleri internet sayfası üzerindeki login (kullanıcı giriş) formundan girişinin yapıldığını varsayalım ve görüldüğü gibi hiçbir kontrolden geçmeden SQL sorgusu içerisine yerleştirilmiş. Bu sorgu SQL Injection zaafı içeren sorgu örneğidir.

Kodu hazırlayan kişi bu sorgu üzerinde pUsername ve pPassword alanlarının düzgün bir şekilde doldurulacağını öngörmüş.

pUsername = trycteach
pPassword = admin123

Bu durumda SQL şu şekilde olur.

String sql = “Select * from members where username = ‘trycteach’ and password=’ admin123’”;

SQL injection yapmak isteyen saldırgan buraya

pUsername = ' OR ''='’
pPassword = ' OR ''='’

yazabilir. Bu durumda SQL sorgusu şu şekilde görüntülenir.

String sql = “Select * from members where username = ‘' OR ‘'=’' and password=’' OR '’='’”;

Bu yukarıdaki sorgu ile members tablosundaki tüm veri saldırganın eline geçmiş olur.

SQL Injection Çeşitleri

Error Based SQL Injection

Uygulama geliştirme aşamasında geliştirici kendisine yardımcı olması amacıyla hataları geliştirme düzeyinde görüntüler. Bu açıkların düzeltilmesini kolaylaştırır, ancak bu düzey canlı ortamda da benzer şekilde çalıştırıldığında hatalar kötü amaç güden kişiler tarafından da görüntülenir. Saldırganlar veri tabanı hataları yardımıyla, veri tabanı üzerindeki tablo ve alanların isimlerine erişebilirler.

Boolean Based SQL Injection

Bazen SQL sorgusu hataya düştüğünde ekrana hiçbir hata mesajı ya da veri döndürmeyebilir ama bu saldırganın veri çekemeyeceği anlamına gelmez. Bazı durumlarda ise ekrana gelmesi gereken bilgilerin bir kısmı gelir bir kısmı gelmez.

Saldırgan zaafı içeren SQL’e benzer metotlar ile farklı komutlar göndererek veri çekmeye çalışır.

https://trycteach.com/index.php?id=1+AND+1=1

Yukarıdaki sorgu ile ekran düzgün bir şekilde çalışıyorsa sayfada SQL Injection açığı var demektir. Saldırgan bunun üzerine şunu deneyebilir.

https://trycteach.com/index.php?id=1+AND+1=2

Bu durumda ise sorgu çalışmamalıdır.

https:// trycteach.com/index.php?id=1+AND+IF(version()+like+’5%’, true, false)

Yukarıdaki durumda ekran düzgün çalışıyorsa versiyon 5 demektir. True ve false değerleri ile saldırgan zaaftan yararlanır.

Time Based SQL Injection

Bazı durumlarda ise SQL Injection açığı olan sorgudan hiç tepki gelmeyebilir ama saldırganlar bu sorgudan da veri elde edebilir. Bunun için zaman fonksiyonlarını kullanırlar. Zaman fonksiyonları ile ekranın açılma süreleri ayarlanabilir. Aynı boolean based SQL Injection da olduğu gibi true false fonksiyonları kullanılarak ekranın yüklenme süreleri ayarlanır. Bu şekilde kötü amaç güden kişiler veri tabanı üzerinden çeşitli sistemsel veri ve hassas bilgi çekebilir.

Out of Band SQL Injection

SQL Injection açığına sahip olan sorgular üzerine sabit fonksiyonların yardımıyla veri saldırganın belirlenmiş olduğu bir sunucu üzerine gönderile bilinir. Bunu DNS ve http protokolleri kullanılarak yapılır. MySql, MsSql ya da Oracle tabanlı bir veri tabanı kullanımı bu açığı engelleyemez, her türlü veri tabanı uygulaması için Out of Band SQL Injection yapıla bilinir. Bu açıktan yararlanarak saldırgan internet sitesinin hangi veri tabanını kullandığı, versiyonu, veri tabanı kullanıcıları gibi bilgileri çekip bunları farklı amaçlar için kullanabilir.

SQL Injection’dan Korunma Önlemleri

PreparedStatement Kullanımı

Sorgunun parametreler yardımıyla çalıştırılması anlamına gelir yani kullanıcının yazmış olduğu veri önce bir parametreye eşlenir. Bu eşlemeden sonra parametre execute methodu ile SQL sorgusunun içerisine yerleştirilir, bir başka değiş ile araya katman eklenmiş olur. Katmanlardan geçen kullanıcı verisi SQL sorgusuna eklenir. Kullanıcının veri tabanına erişmesi için bu katmanları geçmesi gerekir. Saldırganın hazırlanmış olduğu kötü amaç güden scriptler bu durumda çalışmaz ve veri tabanı bilgilerine erişememiş olur.

Obje tabanlı dillerin hepsinde (Java, .net, php) preparedstatement olarak kullanılmaktadır. Sorgu içerisine parametrenin geleceği yerin işaretlenmesi ile kullanılır.

$stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?");
$stmt->execute(array($username, $password));

Yukarıda php ile hazırlanmış preparestatement örneği gösterilmiştir. Burada ‘?’ yazılan yerlere parametre geleceği ifade edilmektedir.

Veri tabanı Yetkilendirme

Veri tabanı yetkilendirme ayarları ile SQL Injection’dan korunabilirsiniz. Bunun için yetkili kullanıcıların sınırlandırılması, her kullanıcının ekleme, güncelleme ve silme yetkisinin verilmemesi. Her kullanıcının her tabloya erişiminin olmaması gibi çeşitli yetkilerin sınırlandırılması, açıkların bir nebzede olsa azalmasını sağlar. Ancak veri tabanı yetkilendirme işlemi SQL Injection için temel koruma yöntemi değildir.

Sqlmap

Yapılan çalışmalar büyükte olsa küçükte olsa mutlaka test edilmesi gerekir. Sqlmap uygulaması siteniz için SQL Injection test aracıdır. Bir sitenin SQL Injection konusunda açığının olup olmadığını raporlayan ve kullanıcıyı bilgilendiren, gerekli önlemlerin hangi sorgular için alınması gerektiğini belirleyen kapsamlı açık kaynak kodlu bir uygulamadır.

Sonuç

Bir internet sitesinin SQL Injection zafiyetinin olması yazılımın düzgün ve güvenilir bir şekilde hazırlanmadığını ifade eder. Önleme yöntemi oldukça basit olan bu açıktan korunmak sitenin itibarı ve site içerisinde bilgilerin gizliliği için gereklidir. Siber güvenlik firmaları çeşitli araçlar ile kontrollerini yaparlar, SQL Injection ise kritik seviye yani en üst, en dikkat edilmesi gereken seviye olarak belirlenir. Bunun için gerekli önlemleri her site sahibinin alması beklenir.


Kaynak