1. Ana Sayfa
  2. Siber Güvenlik
  3. SQL Injection Exploration (Keşif) Aşaması
Trendlerdeki Yazı

SQL Injection Exploration (Keşif) Aşaması

sql-6060942_1280

Web uygulama güvenliği ve web geliştiriciliği ile uğraşanların karşılarına sık sık çıkan konulardan birisi de SQL injection’dur. Zafiyetin nasıl oluştuğunu , nasıl tespit edilip nasıl sömürülebileceğini (exploitation) ve nasıl önlem alınabileceğine değinmeye çalışacağım.

Veri Tabanı Nedir ?

Temelde veri depolama yöntemi olarak isimlendirebileceğimiz sistemlerdir. Biraz daha dar anlamı ile programlar tarafından işlenebilecek olan veri yığınlarının bilgisayar üzerinde sistematik halde saklanan halidir diyebiliriz. Bu veriler yönetilebilir, güncellenebilir, taşınabilir ve birbirleri ile tanımlı ilişkiler kurulabilir.

Kişisel bilgisayarda bir MS Excel tablosu veritabanı işlevi görürken, günümüzde büyük ve kurumsal sistemler için kullanılan çeşitli veritabanı yönetim sistemleri ( database management systems) mevcuttur.

MySQL, PostgreSQL,Oracle,MsSQL bu yönetim sistemlerine örnek olarak gösterilebilir.

1-) Tablolar

Veri tabanında bilgilerin saklandığı alt birimlerdir. Tablolar veri tabananı oluşturur. Aynı isimde iki tablo bulanamaz.

2-) Kolonlar

Tabloları oluşturan ve içerisinde aynı türden veri saklayan birimlerdir. Mesela çalışan bilgilerinin tutulduğu bir tabloda, bir kolon çalışanının telefon numarasını, bir kolan çalışan ismini diğer kolon da soyismini tutar. Her özelleşmiş veri, bir kolonda tutulur.

3-) Satırlar

Tablodaki bilgiler satırlar üzerinde saklanır. Her veri kendi sırasında tutulur.

4-) Veri Tabanı Sorguları

SQL Injection saldırıları neredeyse veri tabanı sorgularından ibarettir diyebiliriz. Basit düzeyde veri tabanı sorgularının bilinmesi kolaylık sağlayacaktır. Bu aşamada MySQL veri tabanı sistemi üzerinde çalışacağız. Sql synta’imiz diğer veri tabanları için farklı olsa da yürüteceğimiz mantık aynı olacaktır.

SQL’in davranışlarını bilmeden SQLi aramak mümkün olsa da bazı bilgiler elimizi güçlendirecektir.

 SELECT 1; 

sorgusu 1 değeri döndürür.

sql injection
SQL üzerinde SELECT 1 sorgusu
 SELECT 2-1; 

sorgusu 1 değeri döndürür.

sql injection
SQL üzerinde SELECT 2-1 sorgusu
Basit bir SQL veri tabanı yapısı

Yukarıda Öğrenciler ismli bir veri tabanı görülmekte. Iki adet tablosu vardır; İşletim Sistemleri ve Algoritma Analizi.

Bu veri tabanı üzerinde sorgular oluşturarak çalışma mantığını anlamaya çalışalım.

SELECT isim,no FROM İşletim Sistemleri WHERE isim=’Ali’;

sorgusu : İşletim Sistemleri isimli tabloya giderek; isim adındaki kolonlar içerisinde Ali kelimesini bulursan o satıra ait isim ve no kolonundaki bilgileri getir demektir.

Benzer şekilde

SELECT * FROM Algoritma Analizi WHERE no > 19237077 ;

sorgusunda :Algoritma Analizi isimli tabloya giderek ; no değeri 19237077‘ den büyük olan kolonlardaki bilgileri getir demektir.

Tek bir sorgu içerisinde iki tablo içerisinden de veri çekmek istersek, iki defa SELECT kullanmamız gerekecek. Bu durumda kendinin sağında ve solunda bulunan iki farklı sorguyu da çalıştırabilen UNION ifadesini kullanırız. UNION ifadesini kullanabilmemiz için sağ tarafında çalıştırmak istediğimiz sorgunun kolon sayısı ile sol tarafında çalıştırmak istediğimiz kolon sayısı eşit olmak zorundadır. UNION ifadesi SQL İnjection işlemlerinde çok sık kullanılan yöntemlerden birisidir.

SELECT isim,no FROM İşletim Sistemleri WHERE isim=’Ali’
UNION
SELECT * FROM Algoritma Analizi WHERE no > 19237077;

sorgusu ile iki sorgumuzu da birleştirmiş oluruz. İşletim Sistemleri ve Algoritma Analizi tablolarında bulunan kolon sayıları eşit olduğu için bu sorgu hatasız şekilde çalışacaktır. Basitçe: İşletim Sistemleri isimli tabloya giderek; isim adındaki kolonlar içerisinde Ali kelimesini bulursan o satıra ait isim ve no kolonundaki bilgileri ve Algoritma Analizi isimli tabloya giderek ; no değeri 19237077‘ den büyük olan kolonlardaki bilgileri getirmesini istemiş olduk.


Injection (enjeksiyon) Nedir ?

Enjeksiyon isminden de anlaşılacağı üzere bir girdi noktasından bir şeyler enjekte etmektir. Bu açıdan SQLi; SQL sogusu içerisine yeni sorgular enjekte etmek, olarak tanımlanabilir. Az önce her ne kadar yalnızca var olan tablolar üzerinde işlemler yapmış olsak da yetkilendirilmiş bir kullanıcı okuma,yazma ve silme işlemleri yapabilir. Bu durum gözönüne alınırsa SQLi ‘ın neden bu kadar tehlikeli olabileceği anlaşılacaktır.

Web Uygulamaları İçerisinde SQL Sorguları

Bir web uygulması içerisinde SQL sorgusu çalıştırabilmek için ;

→ Web uygulamasının veri tabanına bağlanması ,

→ Veri tabanını sorgulaması,

→ Sonuçları web uygulamasına döndürmesi ve amacına göre kullanması gerekir.

Genel olarak aşağıdaki gibi bir php kodu ile bu işlemler yapılabilir.

<?php 
$host = “10.1.0.7”;
$user = “user”;
$pass = “password”;
$database = “test”;
$mysqli = new mysqli($host,$user,$pass,$database);
$mysqli→select_db($database);

id=$_GET[‘id’];

$mysqli = new mysqli($host,$user,$pass,$database);
$mysqli→select_db($database);
$Query=$mysqli->query(“Select username, control FROM users WHERE id=’$id’;”);
$result = $Query→fetch_object();
echo $result;
?>

new mysqli(); => Belirtilen veri tabanına bağlantı sağlar

select_db(); => Veri tabanı sorguları için varsayılan veri tabanını seçer

query(); => Belirtilen veri tabanı üzerinde sorgu işlemi yapar

Bu örnekte kullanıcıdan alınan “id” parametresi konrtol edilmeden sorgu ifadesi içerisine gönderiliyor. Bu gibi durumlar SQL Injection’un oluşma nedenidir.

Sorgumuzun örnek kodumuz için çalışmasını beklediğimiz durum;

id = 1 için ;

 SELECT username, parameters FROM users WHERE id=’1’;

id = username için;

SELECT username, parameters FROM users WHERE id=’username’;

gibi olacaktır.

Ancak, saldırgan $id parametresi içerisine ‘ or ‘x’=’x değer girdiği zaman sorgu;

SELECT username, parameters FROM users WHERE id=’’ OR ‘x’=’x’;

veri tabanı iki koşulu konrtol edecektir. İlk koşul boş bir id ararken bulamaz, ardından ikinci koşul (‘x’=’x’) her zaman doğru olacak ve 1 döndürecektir.


SQLi Bulma

Saldırı metodolojisi her zaman önce bir zafiyetin tespitinden (exploration) sonra sömürülmesi (exploitation) biçiminde gerçekleşir.

Injection işlemini yapabilmek için bir girdiye (input) ihtiyacımız vardır. Web uyuglamasında girdiler GET veya POST istekleriyle ya da HEADERS ve COOKIE ile sağlanır.

Bu gibi senaryoları test edebileceğimiz http://testphp.vulnweb.com ortamını kullanacağız.

http://testphp.vulnweb.com/listproducts.php?cat=1 Adresine giriş yaptığımızda karşımıza çeşitli posterlerin bulunduğu bir liste çıkıyor. http://testphp.vulnweb.com/listproducts.php?cat=2 Adresinde ise bir tane poster olan liste çıkıyor.

Cat değeri değiştiğinde sayfa içerikleri değiştiğine göre şöyle bir çıkarım yapabiliriz; listproduct.php dosyası cat değişkeni ile aldığı veriyi

SELECT * FROM tablo WHERE id=$cat

biçiminde bir sorgu içerisinde kullanıyor.

Bu durumda kontrol etmemiz gereken durum biz bu sorguyu manipüle edip edemeyeceğimizdir. Daha önceden biliyoruz ki SELECT 2-1 sorgusu sonuç olarak 1 döndürüyor.

Biz http://testphp.vulnweb.com/listproducts.php?cat=1 sayfasını referans kabul edip, veri tabanı üzerinde çıkarma işlemi yaptırarak tekrar referans sayfamıza dönebilirsek SQLi vardır.

Bu durumda http://testphp.vulnweb.com/listproducts.php?cat=1 ve http://testphp.vulnweb.com/listproducts.php?cat=2-1 adresleri aynı sonuçları döndürmüş ise SQLi varlığını tespit etmiş oluruz.

İki adresinde bize aynı sonucu döndürdüğünü görüyöruz. Zafiyetin varlığını tespit ettik gelecek yazımızda exploitation aşamasındaki çeşitli yöntemlere değinmeye çalışacağız.

Yorum Yap

Yorum Yap

Yorumlar (1)

Bir cevap yazın

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