ARİDOSHİKA

Ulaşabildiğin her yerde

SQL Injection(SQLI) Nedir? -1

5 min read
SQL Injection, veri tabanına dayalı uygulamalara saldırmak için kullanılan bir atak tekniğidir; burada saldırgan SQL dili özelliklerinden faydalanarak standart uygulama ekranındaki ilgili alana (input box'lara) yeni SQL ifadelerini ekler

SQL Injection(SQLI) Nedir?

           SQL Injection, veri tabanına dayalı uygulamalara saldırmak için kullanılan bir atak tekniğidir; burada saldırgan SQL dili özelliklerinden faydalanarak standart uygulama ekranındaki ilgili alana (input box’lara) yeni SQL ifadelerini ekler. (Örneğin saldırgan, veritabanı içeriğini kendisine aktarabilir).SQL Injection, uygulamaların yazılımları içindeki bir güvenlik açığından faydalanır, örneğin, uygulamanın kullanıcı giriş bilgileri beklediği kısma SQL ifadeleri gömülür, eğer gelen verinin içeriği uygulama içerisinde filtrelenmiyorsa veya hatalı şekilde filtreleniyorsa, uygulamanın, içine gömülmüş olan kodla beraber hiçbir hata vermeden çalıştığı görülür. SQL Injection, çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veritabanına dayalı tüm uygulamalarda gerçeklenebilir. Eğer sayfada input alanı bulunmuyor ise ne yapmalıyız. aşağıda da belirttiğim şekilde sayfa içerikleri incelenmelidir:
       Sitede ASP, JSP, CGI veya PHP gibi sayfalar aramalısınız. Özellikle aşağıdaki gibi parametre alan sayfalara dikkat edin:              
        http://www.example.com/index.asp?id=4
       Burada id değişkeninin 4’e eşit oluğu satırı ekrana vereceği kısımdır. Bizler burada o 4 değeri yerine veya devamına ek sql kodları ekleyerek işlemler yapacağız.  Şimdilik bu yazımızda en basit sql injection anlatacağız, amaç sql injecton nedir bunu kavramak. Daha sonrasında biraz daha seviyeyi yükselteceğiz. 
      Gelelim şimdi bu sqli nasıl ve nerede gerçekleşiyor.
     Basit bir sql sorgusunu kullanarak nasıl sql injection nasıl yapılır gösterelim.
NOT : Sayfayı Web For Pentester 1 sanal makinesi kullanarak. Amaç eğitim olduğu için herhangi bir site üzerinden göstermiyorum. Başımız derde girmeiş olucaktır böylelikle 😉

ÖRNEK 1:

Sorgu içeriği = SELECT * FROM kullanicilar WHERE isim =‘ ” kullaniciAdi ” ‘;
Normal olarak buradaki sorguda kullanıcı adı kısmına girilen değeri karşılaylan çıktı gelir. Örneğin kullanıcı ali olan personelin bilgileri içeren tabloyu çeker. SQL İnjection işlemi gerçekleştirdiğimizde o veri tablosundaki bütün listeyi görüntülemiş olacağız. Örnek bir çıktı sonucu aşağıda göreceksiniz.
Sorgu içeriği = SELECT * FROM kullanicilar WHERE isim =‘ root ‘;
           Burada gördüğünüz gibi root oturumun bilgileri karşımıza çıkıyor. Şimdi buraya sqli uygulayalım. Taraycının adres çubuğu kısmında bulunan ve name=root ile biten kısma gelelim. Burada ‘ or ‘1’=’1 değerini girelim bakalım ne olacak.
           Evet. İçerik olduğu gibi önümüze serildi. Tabloda ne kadar kullanıcı varsa hepsi şuan karşımızda. Şimdi sorgunun işleyiş şeklini inceleyelim.
Sorgu içeriği = SELECT * FROM kullanicilar WHERE isim =‘ root ‘ or ‘1’=’1 ‘;
linkde :   http://192.168.220.136/sqli/example1.php?name=root ‘ or ‘1’=’1
           İçeriğinde sadece name yazan kısımda farklı bir sql kodu yazdık. Gelelim yazdığımız metinin özelliğine.
           ‘ or ‘1’=’1    ==> buradaki ilk tırnak sorgu içeriğinde isim sütununun sorgusu bitirip yazdıklarımızı metin içeriği değil de kod olarak işlemesini sağlıyoruz. Böylelikle metin içeriğinden çıkıp artık kod enjecte etmeye başlıyoruz. Sonrasında “or” parametresi ile devam ediyoruz. Bunun nedeni de tüm tablo için çıktı çekmek istememiz. Bu yüzden “and” parametresini kullanmıyoruz. Ve peşindeki ‘1’=’1 yazıyoruz. Burada ise gerçekleşen olay şöyle; Yukarıda da kodun tamamına dikkat ederseniz aslında olayı kavrarsınız. Çünkü sorgu içeriğinin demek istediği kendine esit olan içerikleri diz. Yani ismi root olan oturum ismi root ise göster. Böylelikle bütün satırları çekmeye başlar. Çıktı ekranımız ise ayne şöyle olacak:

 


       ÖRNEK 2:   Küçük bir örnek daha verelim;
Aşağıdaki SQL ifadesindeki “kullaniciAdi” na girilen değer, kişiler tablosunun silinmesine ve kişiBilgileri tablosundaki tüm verilerin ifşa edilmesine neden olur.
a’;DROP TABLE kullanıcilar; SELECT * FROM kullanıciBilgileri WHERE ‘t’ = ‘t’
Bu girdi Sql ifadesinin aşağıdaki şekilde işlenmesine neden olur:
SELECT * FROM kullanicilar WHERE kullaniciAdi = ‘a’;DROP TABLE kullanicilar; SELECT * FROM kullaniciBilgileri WHERE ‘t’ = ‘t’;
          Çoğu SQL sunucusu, bir çağrı ile birden fazla SQL ifadesinin yürütülmesine izin verirken, PHP’nin mysql_query () fonksiyonu gibi bazı SQL API’leri güvenlik nedenlerinden dolayı buna izin vermez. Bu durum, saldırganların farklı sorgular açmalarını engeller, ancak sorguları değiştirmelerine engel değildir.

 ÖRNEK 3:
        Şimdide bir veri tabanında hangi tablolar mevcut bunları ekrana dökelim. Bunun için önceki örneklerdeki gibi mantık olarak aynı metodu kullanacağız. Yani Link kısmındaki  name parametresinin yanına kodumuzu ekleyerek gideceğiz.
               http://192.168.220.136/sqli/example1.php?name=root  şeklindeki linkimizin sonundaki root kelimesinin hemen peşine aşağıdaki kodu ekliyoruz.
             ‘ union select table_name,2, 3,4,5 FROM information_schema.tables %23
            Linkin yeni hali şöyle olmalı :
             http://192.168.220.136/sqli/example1.php?name=root  ‘ union select table_name,2, 3,4,5 FROM information_schema.tables %23
          Açıklaması:  Union deyimi SQL cümleciğinde iki tablodan birden kayıt çekmek için kullanılır.
         Burada union ifadesi kullanılırken neden 2,3,4,5 ifadesini yazdığımız aklınızı kurcalamıştır. Union ifadesi iki tabloyu birleştirerek tek bir sonuç kümesinde verme işlemini yapar. Ama bu işlem yapılırken iki tabloda çekilen sutun sayısının aynı olmasını ister. Burada ilk tabloda 5 sutun çekildiği için union ifadesinde de 5 sutun çekildi. Peki kaç sütün çekildğini nereden öğreneceğiz? Bu birazcık deneme yanılma yöntemi. Bunu rakamları silerek tek tek ekran çıktılarını inceleyerek anlayabiirsiniz.
Buradaki sqli açığı herhangi bir dosyayı okumak için kullanılabilir. Tabi dosya okuma işleminin gerçekleşebilmesi için mysql kullanıcısının bu yetkisinin olması gerekir. Aksi halde yetkisinin olmadığı dosyaları okuyamayız.
          Sondaki %23 ifadesi # işaretinin encode edilmiş halidir. # ifadesi ise mysqlde yorum satırı demek olduğu için ondan sonraki tüm ifadeler geçersiz kılınacak ve bu şekilde syntax hatasından kurtulmuş olacağız.
çıktı ekranımız:

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.