SQLi 101:Ortama Girmek!
SQL Injection 101
1.Makale, Serisi ve Öğretim Yöntemi Hakkında
2.SQL Injection Nedir, Ne Değildir?
3.Suç Kimde?
4.Yazılımsal Detaylar
5.Magic_Quotes Meselesi
6.Biraz SQL Bilgisi
7.Uğurlama
Makale, Serisi ve Öğretim Yöntemi Hakkında
Bu makale ve arkasından yazılacaklarla oluşacak seri, SQL Injection mevzuunu okuyuculara öğretmeyi amaçlamaktadır. Yoksa okuyucunun öğrendikleriyle sağı solu deface etmesini amaçlamaz, vereceği zarar-ziyan için de sorumlu tutulamaz.
Öğretim, teori ve uygulama olarak iki aşamada gerçekleşecektir. Öncelikle konuyla ilgili teknik temeller ve mevzuular anlatılacak, Lab kısmında ise verilecek örnek uygulamalar, kaynak kodları vs. üzerinde nasıl uygulama yapılacağı gösterilecektir.
SQL Injection Nedir, Ne Değildir?
SQL, structured query language, veritabanı sunucusu ile konuşmak için kullanılan dildir.Yani, atıyorum forumunuza yeni bir kayıt ekleyince, forumunuzdan MySQL sunucuya giden komut cumlesi SQL dilindedir ve bu komut cumlesine "query" denir. SQL Injection dediğimiz şey ise, web uygulamasından veritabanı sunucusuna giden SQL query'inin(dinamik SQL query) saldırgan tarafından manipüle edilebilmesidir.Yani sadece kullanıcı parola bilgisini veritabanından doğrulamak için kullandığınız şu kod:
$result=mysql_query("SELECT * FROM users WHERE username='$user' AND password = '$pass'");
if (mysql_num_rows($query) == 0)
echo "Not Logged";
else
echo "Logged Succesfully";
username parametresine, gerçekten kullanıcı ad'ı gelecekse sorunsuz şekilde çalışır. Ama gerçekler çok daha acımasız! Yani kullanıcı adı yerine girilecek, ' OR '1'='1 ibaresinin ardından SQL query'nin alacağı hal :
SELECT * FROM users WHERE username='' OR '1'='1' AND password = '' OR '1'='1'
Bu query'nin de geri döndüreceği sonuç, tüm kayıtlar olacaktır. Sebebi ise ya kullanıcı adı boş olanları, ya da '1'='1' şartını sağlayanları, (ve aynı koşulları password bölmesi için de geçerli) döndürmesidir. Bu da daha önce dediğimiz gibi tablodaki tüm kullanıcı kayıtları olacak, ve veritabanındaki ilk kullanıcı adı ve hakları ile login olmuş olacaksınız.İlk kullanıcı da genellikle yönetici olacağı için, geriye kalan login olduğunuz script'in yönetici haklarıyla kafanıza göre değişiklikler yapmak!
Umarım temel olarak SQL Injection nedir, anladınız.
Neyse bu örneği daha sonra SQL Injection 101 Lab : Login Bypass 'de ayrınılı olarak inceleyeceğiz.
Haricinde, SQL Injection ile yapabilecekleriniz, veritabanındaki verilere doğrudan erişimle sınırlı değil! Kullandığınız veritabanı sunucusunun yetenekleriyle ilgilidir. Örneğin MSSQL Server kullanan bir asp uygulamasında bulacağınız herhangi bir SQL Injection ile (eğer xp_cmdshell aktifse) o veritabanı sunucusunun shell'inden çalışıyor gibi command'lar yollayabilirsiniz.
Suç Kimde?
SQL Injection açığında en az suçu olan ise SQL Server'lardır. Zira açığın varolmasından veritabanı sunucusu değil SQL Server'a yollanacak query'lere eklenecek parametreleri doğru düzgün filtrelemeyen,denetlemeyen "web uygulama programcısı" suçludur.Yoksa her veritabanı sunucusu için,SQL Injection aynı şekilde varolur, lakin onun exploit edilmesi aşamasında kullanılacak olanlar veritabanı sunucusunun fonksiyonlarına ve sentaks farklılıklarına göre değişebilir.
Şimdi, doğru düzgün çalışabilmek için yapmanız gereken şeylerden bahsedeyim.
Yazılımsal Detaylar
Öncelikli olarak,web sunucusu, bir web programlama dili yorumlayıcısı ve veritabanı sunucusu kurmanız gerekiyor. Makalelerde verdiğim kodlar ve kullandığım veritabanı PhP:MySQL ikilisi olacağı için:
- Web Sunucusu Olarak : Apache
- Programlama Dili : PhP
- Veritabanı Sunucusu :MySQL
üçlüsünü kurmak gerekiyordu,ben bunların tamamını halletmesi için AppServ paketini kullanıyorum, size de tavsiye ederim.Tek pakette bahsettiğim bu üç yazılımı da kuruyor.
Detay derken kastım anlatacağım şeylerin aslında diğer platformlarda da uygunabileceğidir.Netekim, ileride platform bazlı şeyler anlatırken MSSQL Server tarafına da zaman zaman kayacağız, ve bunların uygulamalarında göreceğiniz üzere SQL Injection her platformda aynı mantıkla çalışıyor.
Magic_Quotes Meselesi
Gerekli Lab uygulamaları, gerekse arada vereceğim şeyleri deneyebilmek için kuracağınız bu yazılımdan sonra, php.ini dosyasındaki:
- magic_quotes_gpc = Off
- magic_quotes_runtime = Off
- magic_quotes_sybase = Off
Gibi ayarları, off yaparsanız daha kolay şekilde çalışabileceksiniz.Zira magic_quotes ayarları, PhP'ye yeni başlayanlar için SQL Injection'dan korunmak amacıyla kullanılan bir otomatik savunma mekanizması.Zira girdiğiniz her ',",\ gibi SQL Injection başlatabilecek işaretlerin önüne escape character dediğimiz \ karakterini koyar ve Injection'i geçersiz hale getirirler.İleride, bu tarz diğer mekanizmalar ve bunlardan nasıl kaçılabileceği üzerine de söyleyecek şeylerimiz olacak, fakat temel düzeydeki uygulamaları rahatça exploit etmek için bu ayarları disable hale getirmeniz gerekmektedir. Ayrıca sadece bu sebeple değil, aynı zamanda bünyesinde farklı problemler barındırdığı için zaten bu mekanizmayı kullanmanız ya da kodlarınızı buna dayalı olarak yazmanız tavsiye edilmez. Netekim yazacağınız kodun çalışacağı ortamı bilemezsiniz, onun için bu yönetimsel detaya çok fazla güvenmemek gerekiyor.
Biraz SQL Bilgisi
Gerekli yazılımları yükledikten sonra, SQL Injection mevzuunu kavrayabilmek için, en azından temel seviyede ANSI-SQL bilmeniz gerekmektedir. Nasıl SQL öğrenirim diyorsanız, daha bir çok kere önereceğim üzere google'a danışmanızı öneririm. Haricinde, çok temel şeyler haricinde gereken yerlerde SQL bilgisi de vereceğiz.
Uğurlama
Artık, ilk bölümün uygulaması olan SQL Injection 101 Lab : Login Bypass 'e geçebilirsiniz.