SQL Injection All Examples (Web for Pentester)

Merhabalar, SQL Injection Example 1’de kullanıcıları ve şifrelerini yazdırmaya kadar gitmiştik. O örnekte tüm detayları verdiğimizden ötürü bundan sonraki örnekler sadece önümüze koyulan engelleri deşifre edip o engelleri nasıl aşacağımızı paylaşacağım. Sadece bunları paylaşacağım için de tüm örnekleri tek bir yazıda aktaracağım.

Eğer ilk örneği henüz incelemediyseniz buradan ulaşabilirsiniz.

SQL Injection Example 2

SQL Injection 2 örneğini açtığımızda karşımıza çıkan örnekte gördüğümüz üzere adres çubuğu ilk örnekteki ile aynı gibi duruyor. İlk örnekte denediğimiz name=root’ OR ‘1’=’1 scriptini burada da deniyoruz ve karşımıza aşağıdaki resimdeki gibi bir hata veriyor.

Bu engeli bypass etmek için, aşağıdaki örnekte de görüldüğü gibi, boşluk yerine TAB kullanmak. Fakat bunun için TAB’ın URL karşılığı olan %09 kullanacağız.

SQL Injection Example 3

Bu örneğe geçtiğimiz zaman yine ilk örneklerdeki gibi denediğimizde yukarıdaki çözümümüzün de engellendiğini, artık %09 yönteminin işe yaramadığını görüyoruz.

Bu engeli aşmanın yolu ise, aşağıdaki resimde de görüldüğü üzere, her boşluk kullanacağımız yere yorum açıp kapatma: /**/

SQL Injection Example 4

Bu örneği ilk açtığımızda adres çubuğunda diğer örneklerden farklı olduğunu seziyoruz. Adres çubuğunda da görüldüğü üzere name=’root’ ile değil de id ile girilen değerin karşılığı olarak kullanıcı listelediğini görüyoruz. Bu örnekte kullanıcıları listelemek için pek de bir şey yapmamıza gerek kalmıyor aslında, id parametresine denk gelecek rakamları değiştirerek, aşağıdaki resimdeki gibi, teker teker kullanıcıları listeleyebiliriz.

Ha eğer yine de tüm kullanıcıları aynı listede görecem derseniz, ilk örnekte yaptığımız scripti aşağıdaki resimde de görüldüğü gibi yazarak, hiçbir filtre engeline takılmadan listeleyebiliriz.

Bu örnekte de, aşağıdaki resimde de görüldüğü gibi, injection yaparak, yine kullanıcıları şifreleri ile birlikte listeleyebiliriz.

id=2 union select name, passwd,3,4,5 from users

SQL Injection Example 5

Arkadaşlar burada garip bir durum var. Ben bu örnekte herhangi bir engelleme göremedim. Bir önceki örnekte yazdığımız id=2 OR 1=1 aynı şekilde burada da işliyor görünüyor.

Bu durumla ilgili internette araştırma yaptığım zaman, integer kontrolü yapıldığı yazılmış. Bu yüzden ikinci satıra geçmemiz gerektiğini ve bu yüzden de New Line (enter) tuşunun URL encoder %0a kullanılmalı denmiş.

Bir diğer yöntem olarak, id=2 den sonra UNION SELECT kullanılabilir. Fakat dediğim gibi benim denememde eski örnek sorunsuz çalıştı. Çalışmayanlar için:

http://192.168.112.128/sqli/example5.php?id=2 UNION SELECT name, passwd, 3,4,5 from users

http://192.168.112.128/sqli/example5.php?id=2%0a OR 1=1

SQL Injection Example 6

Bu örnekte ise, yukarıda denediğimiz gibi id=2 OR 1=1 scriptini adres çubuğuna yazdığımızda örneğin işlediğini görüyoruz. Ee, o zaman hemen şifreleri yazdıralım dediğimizde ise aşağıdaki resimdeki gibi ERROR INTEGER REQUIRED hatasını görüyoruz.

Durumları analiz ettiğimizde bu integer kontrolünün adres çubuğunun sonuna ve başına bakarak çalıştığını görebiliyoruz. Bu yüzdendir ki, id=2 OR 1=1 yazdığımızda çalıştı fakat sonunda from users yazınca çalışmadı.

%100 güvenlik olmayan bir siber dünyada, böyle integer kontrolünün de gözünün yaşına bakmazlar efendim hiç kusura bakmayın. Bunun çözümü için de şifreleri yazdıran script (  ) kodumuzu biraz düzenliyoruz.

http://192.168.112.128/sqli/example6.php?id=2 UNION SELECT name, passwd, 3,4,5 from users — -1

Bu şekilde sonuna eklemiş olduğumuz rakam ile bu engeli de bypass etmiş oluyoruz. 1’in öncesinde yer alan — – ile sonrasında yazılan her şey yorum olarak algılanacağı için sonuna eklenmiş rakam syntax’ı bozmuyor.

SQL Injection Example 7

Bu örnekte deminki gibi OR 1=1 yazınca aşağıdaki gibi yine aynı hatayı verdi: ERROR INTEGER REQUIRED

Bunu geçmek için ilk düşündüğüm şey, acaba bunu ikinci satır için de kontrol ediyor mu oldu? Bu yüzden id=2 kısmından sonra alt satıra geçmek için New Line tuşunun URL encode edilmiş hali olan %0a yazdım. Daha sonrasında OR 1=1 yazdım ve, resimdeki gibi, bu kontrolü bypass etmiş oldum.

SQL Injection Example 8

Bu örneği açtığımız zaman adres çubuğunun sonunda order=name yazdığını görüyoruz. Burada, _ORDER BY_ kullanılmış olduğunu düşünüp, name yerine age yazarak bu varsayımımızı doğrulamış oluruz.

ORDER BY ifadesi, aşağıdaki gibi, sorgunun sonunda kullanılır. Bu yüzden yapabileceğimiz tek şey sorgunun parametresini ve yönünü değiştirmek olur. Bu durumda bu sayfada SQL Injection açığı var diyebiliriz fakat yapabileceklerimiz sadece bununla kısıtlı kalır.

“SELECT * FROM table ORDER BY name ASC”

SQL Injection Example 9

Son örnekte de 8. örnek gibi order by kullanılmış. Bu örnek de yine aşağıdaki resimde görüldüğü gibi sıralamanın yönünü değiştirebiliriz fakat bir önceki örnekte olduğu gibi yapabileceğimiz sadece bununla kısıtlı. Yine de sayfada SQL Injection var diyebiliriz.

SQL Injection örneklerini bu yazıda tamamlamış oluyoruz. Diğer yazılarda görüşmek üzere.

Leave a Comment

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