4 Eylül 2019 Çarşamba

Mysql Injection - Union Based - Part 1

Sql injection şudur budur, şöyledir, böyledir adlı tanıtım yazısını geçersek... 
Bu yazı Union Based Sql Injection üzerine biraz anlatım biraz da notlar niteliğinde olacaktır. Biraz MYSQL biraz PHP biraz da neden nasıl olayı var. İyi okumalar :+)





Örnekler ve görseller yukarıdaki basit sql sorgusu üzerine olacaktır.

MYSQL Default Databases

Mysql'de varsayılan olarak gelen 2 veritabanı vardır. Bunlar:

mysql --> root yetkisi ister

information_schema --> Mysql v5 ve üstünde bulunur. 

Mysql v5 altındaki versiyonlarda information_schema bulunmadığı için table ve column isimlerini bulmak daha doğrusu tahmin etmek gerekiyordu. Neyseki column, table isimleri, tipleri ve bir çok bilgiyi information_schema'dan edinebiliyoruz. Varsayılan olarak gelen 2 veritabanı sonradan oluşturulacak veritabanı ve kullanıcılar hakkında bize bilgi verir aynı zamanda yönetimini de sağlar. Bir nevi bu 2 veritabanı sistemin ta kendisi.   

Testing Sql Injection

Strings


İlk resimde gözüktüğü gibi PHP kodunda String değerin içerisinde tekrar tırnak kullanabilmek için geliştirici tek tırnak kullanmış fakat bu tam tersi de olabilirdi önce tek tırnak daha sonra ise içinde çift tırnak kullanabilirdi ama olmuyor neden ? Bu PHP dilinin yapısı ile alakalı bir durum.

$adi = "OguzBey";

echo 'Adiniz : $adi'; ----> Adiniz : $adi

echo "Adiniz : $adi"; ----> Adiniz : OguzBey

Bir de bunun backtick ile olanı var ama konumuzu daha fazla dağıtmayalım. 

Görselle gösterecek olursak:



Yukarıda görüldüğü gibi bir olay var PHP'de. Tabi PHP yazan biri olmadığım için bu durum değişti mi bilmiyorum ama sanırım değişmedi. Galiba bu dilin bir özelliği olarak geçiyor. Hal böyle olunca sql sorgularında yani String'in içerisinde değişken kullanabilmek için geliştiriciler önce çift tırnak daha sonra ise tek tırnak kullanmak zorunda -- tabi tek tırnak kullanmak isterse -- . İlk resimdeki gibi.. Buraya kadar her şey OK

$query = "SELECT * FROM haberler WHERE haber_id = '$id'";


Yukarıda $id değişkenine Tek tırnak gelirse ( ' ) 3 tırnaklı bir yapı oluşur ve bu SQL dilinin syntax yapısını bozacaktır. Bu sorgu çalıştığında Syntax hatası verecektir. 

Resimli gösterimi : 





Syntax hatası bize SQL Injectionın olabileceğini gösteren bir kanıt oluyor. Aynı şekilde bu hatayı ters slash ( \ ) atarak da alabiliriz. Ters slash'ın özelliği önüne gelen ilk karakteri yok saymaktır. Regex'de ise ters slash regex kuralı olmadığını normal bir karakter olduğunu göstermek için kullanılır.  


Ters slash her zaman işe yaramayabilir çünkü '   $id   ' gibi bir kullanım söz konusu olabilir.  O zaman Ters Slash'in önüne boşluk ifadesi gelir '  \  ' ve tek tırnak ifadesi escape edilemez. 


Yukarıdaki resimde de görüldüğü gibi geliştirici ters slashden bu şekilde kolayca korunabilir. 



Syntax hatası bu 2 karakter üzerinedir. Tek tırnak ve ters slash

Numeric

Sql sorgusunda '$id' kullanmak yerine id değerleri numeric olduğu için geliştirici tırnaksız direkt $id de kullanabilirdi sql sorgusunda. ( where id = $id )

$query = " SELECT * FROM haberler WHERE haber_id = $id ";


gibi. Gene tek tırnak koyarak hata alabiliriz. Hatta çift tırnak ile de alabiliriz.  Her türlü SQL dilinin syntax yapısına aykırı olacaktır. Fakat bu şekilde sql sorgusunun yapısını anlamayabiliriz. Her şey anlamaktan ibaret. 

Eğer numeric ise aşağıdaki gibi mantıksal ve matematiksel sorguların çalışması gerekecektir.

SELECT * FROM haberler WHERE haber_id = 10 AND 0; --> False dönecektir.

SELECT * FROM haberler WHERE haber_id = 10 - 10; ---> 0 dönecektir

SELECT * FROM haberler WHERE haber_id = 10 AND 0; ---> False dönecektir

// false == 0 ve true == 1 'dir.

SELECT * FROM haberler WHERE haber_id = 1-false;  --> 1 dönecektir

SELECT * FROM haberler WHERE haber_id = 1-true; ---> 0 dönecektir.


Mesela  haberler.php?id=10 sayfasındayken 10 id'sine sahip haber geliyor ve sitede o haberi okuyorken  haberler.php?id=10 AND 0 yaptığımızda sayfaya veritabanından haber dönmeyecektir ve haber sayfasındaki içeriklerin yeri boş gözükecektir. Ya da bizi 404 sayfasına da yönlendirebilir. Geliştiricinin nasıl kodladığını düşünmek gerek. 

%100 emin olmak için haberler.php?id=9'da bir haber var ise haberler.php?id=10-1 yaparak karşımıza haberler.php?id=9 daki haberi çıkartmaya çalışabiliriz. Bu şekilde sql sorgusundaki $id  değerinin tırnaklı mı tırnaksız mı olduğunu anlayabiliriz. Bu da Sql injectiona bir kanıt tabi.

Daha iyi anlamak adına bir kaç görsel.




Şimdilik bu kadar. Part 2,3,4... şeklinde seriyi tamamlamaya çalışacağım. Esen kalın




0 yorum:

Yorum Gönder