Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | WFP I SQLi

WFP I SQLi Çözümü

Web For Pentester Nedir ? 

PentesterLab tarafından hazırlanmış, içerisinde çeşitli Web zafiyetleri barındıran, üzerinde egzersiz yapabileceğiniz bir disk uygulamadır.
İçerisinde XSS,SQLi,Directory Traversal,File include,Code Injection gibi birçok
alıştırma vardır.Bu yazıda SQLi çözümlerine bakacağız.
Web For Pentester I : Web For Pentester 1

SQLi nedir ?
SQLi den bahsetmek için öncelikle SQL’den bahsetmek gerekir. SQL ( Structed Query Language );
en kısa tabiriyle veritabanında sakladığımız verileri SQL motoruna bağlı olarak belirli sorgular ile yönetebildiğimiz
bir veritabanı yönetim sistemidir.
SQL tamam ama bu sonundaki i harfi de nedir ? İ harfi burada injection kısaltmasıdır. Nedir bu injection ? Örnekle açıklayalım.
Üye giriş formumuz olsun ve bizden kullanıcı adı istesin. Arkaplanda çalışan en güvensiz kod şu şekilde olacaktır.

js"]SELECT * FROM users WHERE kullaniciadi='$kadidegiskeni'

Yukarıdaki kod, aksi belirtilmediği veya kötüye kullanım harici düzgün bir şekilde işlevini yerine getiricektir.
Injection tam bu kullaniciadi = ‘$kadidegiskeni’ kısımdadır. Burada ki değişkenin değerini
‘ ( tek tırnak ) yaptığımızda WHERE kullaniciadi = ‘ ‘ şeklinde yorumlanacaktır. Ve bu da bize sorgunun devamına kendi sorgu cümlemizi yazabilme olanağı sağlar. Neyse kısa keselim en basit anlamıyla SQL Injection bu şekildedir. Temelinde bu vardır.

Şimdi Web For Pentester I üzerindeki egzersizleri çözelim.

Öncelikle SQLi yedirdikten sonraki kısımlar birbirine benzeyeceği için bütün aşamalar ilk kısımda verilmiş. Geri kalan egzersizlerde nasıl bypass edeceğimiz gösterilmiştir.

Level 1
Selection_013

Adress çubuğunda gördüğünüz gibi example1.php?name=root yazıyor.

Admin’den sonra “ tırnak atmayı deneyelim.
Tablomuzda hiçbir şey gözükmüyor. Yani bir etkisini göremedik. Bir de tek tırnak deneyelim.
Admin’ yaptığımızda tablo kayboldu, bu ne demek ? Bir şeylere müdahale edebildik demektir.
Hemen bakalım sqli var mı deneyelim.

or '1'='1

yazalım. Dikkat edin burada 1 den sonra tek tırnağı kapatmıyoruz. Çünkü SQL sorgusunun sonunda bir tırnak var ve onun kapatmasını sağlıyoruz.
Selection_014

Gördüğünüz gibi bütün tabloyu ekrana döktük ama burada işimize yarayacak pek bir bilgi yok. Ama injection var değil mi ? O yüzden gerisini getirelim ve ele geçirelim.
Sırada kaç kolon çekildiğini öğrenmek var onun için order by kullanacağız.

1'order by 5 %23

Bu kodu yazdığımızda tablomuzun yapısında bir bozulma olmuyor fakat 5 sayısını 6 yaptığımızda tablo kayboluyor. Bu da demektir ki sql sorgusuyla birlikte gelen veri 5 sutünlu bir veri. %23 ise # işaretinin encode edilmiş halidir.
Hemen ardından hangi kolonlarımızda zararlı kodları kullanabiliriz ona bakalım.

1'union select 1,2,3,4,5 %23

Selection_015

Gördüğünüz gibi 1,2,3 numaralı kolonlara bazı bilgileri yazarsak bize ekranda gösterecek.
Not:Ekranda ki bilgilerin 1,2,3 numaralı kolonlardan alındığını buradan anlayabiliriz.
Selection_016

union select database(),user(),3,4,5 %23

Burada 1 ve 2 numaralı kolonlara bize database ismini ve bunun kullanıcısını göster dedik.

Sırada tablo ismini/isimlerini öğrenmek var.

'union select group_concat(table_name),2,3,4,5+from+information_schema.tables+where+table_schema=database()%23

Burada group_concat kullanmamın amacı , evet burada başka bir tablo yok ama bu gerçek hayatta olamayacağı anlamına gelmez eğer yüzlerce tablo var ise union select etkisiz kalacaktır.

Selection_017

Kolonlarımızı çekelim şimdi de.

'union select group_concat(column_name),2,3,4,5+from+information_schema.columns+where+table_schema=database()%23

Selection_018

Gördüğünüz gibi 5 adet kolon bulunuyor. Bunlar : id,name,age,groupid,passwd

Şimdi son işlemimiz olan şifreleri çekelim.

Selection_019

union select group_concat(name),group_concat(passwd),3,4,5+from+users%23

Burada sırasıyla kullanıcıların şifrelerini sağ tarafta görmekteyiz.

Şimdi diğer levellere geçelim.

Level 2

Bu kısımda dikkat etmemiz gereken sonuna %23 koyarsak eğer ERROR NO SPACE hatası veriyor.Yani sorgumuz aslında devam ediyor ve araya girdiğimizde hata veriyor.

-1'%09or%09'1'='1 ]

Selection_020
%09 boşluk karakterinin encode edilmiş halidir.

Level 3

Selection_021

-1'/**/or/**/'1'='1

Burada developer bir önceki levelde kullandığımız %09 gibi karakterleri engellemiş.O zaman ne yapıyoruz ? İmdadımıza php yorum satırı karakterleri yetişiyor.

Level 4

Selection_022

-1 or 1=1

Burada developer arkadaşımız bir fonksiyon ile kaçış karakterlerini kullanmış.Örneğin pythonda ki “ \ “ karakteri gibi.Yazılacak ‘ veya “ gibi karakterleri kaçış karakterine yakalandığı için işlevsizleşiyor.
Biz de direk deneriz 🙂

Level 5

Selection_023

2%09or%091=1

Burada developer arkadaşımız kaçış karakterlerini kullanıyor zaten üstüne üstlük boşluk karakterlerini de engellemiş bizde daha önceden bildiğimiz %09’u kullanıyoruz.

Level 6
Selection_024

2%09or%091=1

Level 5 ile aynı şekilde geçilebiliyor.

Level 7
Selection_025
Burada şimdiye kadar kullandığımız payloadlar işe yaramıyor. Bizden bir integer istiyor. Ve biz de bunu

2%0A or 1=1

 

Burada %0A line feed encode hali yani aslında koda multiline özelliğini kazandırdık. Normalde SQL kodumuz tek satırlıktı fakat biz bunu 2 satır haline getirdik.

Level 8

Selection_026

Burada order by ile sıralama yapıldığını görüyoruz.Burada herhangi bir sql injection bulabilsek bile sadece sql injectionun varlığını kanıtlayabiliriz herhangi bir veri elde edemeyiz.

Level 9

Level 8 ile aynıdır.

Son 2 bölüm bize her SQL İnjectiondan veri elde edemeyeceğini öğretiyor 🙂