SQL Injection Anlamak

ѕeleɴια

Kıdemli Üye
18 May 2018
2,619
907
ZYZZ
SQL Enjeksiyonunu Anlamak

Merhaba. SQL Enjeksiyonu kendim dahil biraz da olsun anlamak için açtığım bir konu. Konuyu açmam da fikir veren ve ilham olan @x4807 ye ve @нydrαтнαlleѕ hocalarıma teşekkür ediyorum..


SQL Enjeksiyonu

SQL Enjeksiyonu web uygulamalarındaki en büyük açıkların başında gelir. Günümüzde kullanılan veritabanı tiplerinin güncelliğinden dolayı yeni yazılan bir web sitesinde rastlamak zordur ama hala sql enjeksiyonu varlığını yitirmemiştir. Ne kadar eski de olsa bir web güvenliği ile ilgilenen veya siber güvenlik ile ilgilenen birinin öğrenmesi bilmesi kullanması gerek olduğunu düşünüyorum. Hem web siteyi yazan hemde saldırgan SQL i iyi anlamadığı için amaçlarına ulaşamıyor. Web siteyi yazan saldırgana koz veriyor saldırgan da bilmediği için onu alamıyor.



Konu farklı olacak ama ben açarken bir şeyler öğrendiğimi his ettim.
MySQL Veri Tabanında Çalışmak

Şimdi SQL Enjeksiyonuna ne sebep veriyor bunlara yavaştan gireceğiz. Öncelikle bir admin panelinde username'e selenia değerini password'e de tht değerini atarsak SQL deki isteğimiz şu şekilde olacaktır.


Kod:
SELECT * FROM users WHERE USERNAME='selenia' PASSWORD='tht'

Şeklinde SQL isteğimiz olacaktır. Biz yani admin panelinde dedik ki users tabanından selenia ve tht ile giriş yapmaya çalışıyorum. Veri tabanı burda bakar benim users tablomda selenia ve tht var mı? Yoksa biz burda login olamayız. Ama şöyle bir şey var SQL Bypass dediğimiz. Şuan çok kısa bahsedeceğim ama sorgular ve ilerleyen yazılarda daha iyi anlarsınız.

Username' OR 1=1- yazarsak. Sorgumuz bu durumda;

Kod:
SELECT * FROM users WHERE USERNAME=''OR 1=1-'

Şeklinde olacaktır. Burda web sitenizi yazan arkadaşımız bu karakterlerin girilmesi durumunda hata ver veya girişi sağlama gibi if else koşulları yapmadıysa burda kişi şifreyi bilmese dahil girer. Çünkü OR 1=1- True karakterdir. Yani veritabanında mesaj true olarak gidecek ve bizim login yapacaktır. Bunlara m3ta karakterleri deniyor. Bu m3ta karakterlerini php kodları ile engellemek gerekir bu engellemeler de koşullar ile sağlanıyor. Bu m3ta-karakterleri dediğimiz şeyleri girince hata ver login olma mesajını admin panelinde ki php kodunda çalıştırırsak enjeksiyonu engelleriz.

MySQL SELECT Sorguları

Şimdi MySql deki select sorgularına bakacağız. Kali linux'den mysql i açarak doğruluğunu test edebilirsiniz.

SELECT 1; = Sonuç olarak bize 1 verir.

SELECT 2-1; = Sonuç olarak yine 1 verir. Yani veri tabanı işlem yapabiliyor. Yani üstdeki ile bunun bir farkı yok. Eğer yazılımcı abimiz bunu da engellemezse Order By dediğimiz bir olay var o da bir bug o da bir enjeksiyon anlatacağım..

SELECT 2+1; = Bu da tabi ki 3 verir.

SECELT '2-1'; = Peki böyle bir şey yaparsak? Tek tırnak burda string değeri gördüğü için burda bir işlem yapmaz ve sonucu 2-1 olarak verir. Ama...

SELECT '2'-'1'; = Ama bunu yaparsak. Önce 2 yi alacak string olarak. Sonra yanındaki eksiyi görecek daha sonra da 1 i alacak. Orda string içinde olmayan işlem her şeyi bozuyor ve 2 ve 1 i integer a atıyor. Bu durumda sonucu 2-1'den 1 veriyor.

SELECT '2'+'1'; = 3 verir tabi ki bu durumda.

SELECT '2'+'a'; = Şimdi a yerine bir sayı olsaydı bunu integer'a atayacaktı. Lakin bu sefer string bir değer var ve integer a dönemez. Bu durumda veritabanının 2a vermesini beklersiniz ama vermez. Çünkü ortadaki işlem yine her şeyi bozuyor.. Burda 2 yi integer alıyor toplama işlemini görünce ama a ya gelince onu integer alamadığı için onu "sıfır" olarak kabul ediyor ve 2+0 dan bize 2 sonucunu veriyor.

SELECT 'b'+'a' = O zaman bu durumda da cevabı sıfır verir.

SELECT '2' '1';
= Yaparsak peki. Burda ne yaptım bir boşluk bırakdım ortada bir işlem yok görünen. Şimdi bu SELECT aslında hani print komutu gibi düşünün ekrana yazdırması için. Burda boşluğu string değer alır ve önemsemez 2 ile 1'i birleştirir ve bize 21 sonucunu verir. Bu da demek oluyor ki tek tırnaklar arasındaki boşlukar veri tabanında önemsenmeyebiliyor. Bu da bir enjeksiyon oluşumuna sebebiyet verebilir.

SELECT '2' '1' 'a'; = Bu durumda 21a verir hepsini birleştirerek.

SELECT '2' '1' 'a'-1; = Biraz da böyle garip bir şey yaparsak cevabı 20 verir. Çünkü önce 21 i aldık normal bir şekilde. Daha sonra a yı gördük güzel integer olmuyor eğer bir işlem yoksa onu da yazdıracağız ama baktık hemen yanında -1 var o orda olayı bitirdi. a yı bundan dolayı sıfır aldı ve 0-1 den = -1 i verdi. Ve bunu string değil artık integer aldı. 21-1 den de sonucu 20 verdi bu durumda.

SELECT 2^1; =
Burda cevabı 3 veriyor. Bu toplama işlemi mi? Hayır.
SELECT 2^2; = O zaman bu da 4 olmalı ama değil. Bu da sıfır. Neden XOR mantığı. Açıklayayım.


Nedir XOR Mantığı?

Bir kere SQL Enjeksiyonunda fazlasıyla kullanılan ve mutlaka bilinmesi gereken bir durum. Türkçe de ki yada bağlacı gibi düşünün. 9.sınıf matematik ilk konuda ki olasılık olayları. Burda xor tablosu dediğimiz bir şey var.

0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0

Bir yerden tanıdık gelmiş olabilir. Tablo bu şekilde. Burda ki mantık şöyle. Ben ya da sen gidecek. 0 xor 0 da ne ben ne sen o zaman cevabı sıfır verir. 1 xor 0 da ben ya da sen diyor. Örneğin ben ya da sen bakkala gidecek. Tamam güzel burda doğru sonuç verir 1. 0 ve 1 de de aynı şekilde. 1 ve 1 de ise hem ben hem sen diyor ben ve sen diyor yani. Burda sonucu 0 verir. Çünkü xor da böyle kabul etmiyor.

Az önceki select sorgusunda ise. 2^1 i gördü. Farklı rakamlar. Ben ya da sen oluyor olumlu sonuç gördü bunu 3 verdi. 2^2 de ise hem ben hem sen olmadı bunu sıfır verdi olmaz dedi.

Şimdi kaldığımız yerden MySQL sorgularına devam edelim...

SELECT !1; = Burda cevap sıfır. 1'in natını alıyor o da sıfırdır.

SQL Tabloları Nasıl Oluşturuluyor

Şimdi az çok MySQL'in bize verdiği cevapların nasıl düşündüğümüz gibi olmayacağını anladıysak. Bundan bir sonraki başlık için SQL Tablolarını nasıl oluşturuyoruz bilmemiz gerek. Yani o tablolardan veri tabanı nasıl veri alıyor. Nasıl siliyor nasıl ekliyor gibi. Bunun için SQLite denilen bir site var ben oradan anlatacağım resimli olarak.
https://sqliteonline.com/

Site bu giriyoruz buna.


Burda hazır da bir veri tabanı var. Adı da demo'imiş. Sol tarafda table dediğimiz bir yer var orda bizim var olan tablolarımız bulunuyor. Şuan bir tek demo var ama içine ekleyeceğiz. Burda bir kod yazıyoruz Run basınca bunu çalıştırıyor.


Kod:
SELECT * FROM demo;

Burda diyorki SELECT seç FROM demo dan. Demonun içindekileri seç yazdır şeklinde gibi düşünebilirsiniz. Bunun tüm verilerini alt da yazdırıyor. Şimdi bir tablo oluşturalım.

Kod:
CREATE TABLE IF NOT EXISTS selenia (id INTEGER PRIMARY KEY, name VARCHAR, age INTEGER);

Bu kodda SQL'e şunları söyledik.

# Eğer daha önce selenia adlı bir tablo yoksa selenia adlı bir tablo oluştur #
# selenia da ki verileri id columuna kaydet #
# Bir isim değeri olacak ve metin olacak #
# Bir yaş değeri olacak ve tam sayı değerinde olacak #


Şeklinde dedik veri tabanına. Şimdi bu kodu yazıp Run dersek.




Hiç bir şey olmadı. Çünkü henüz bir veri çekmesini istemedik sadece bir tablo oluşturduk bir veri de atamadık. Ama sol da table tarafında selenia tablomuz oluştu.

Tablolara Veri Yazmak

Şimdi bu oluşturduğumuz tabloya nasıl veri yazarız ona bakacağız. Eğer şuanda SELECT * FROM selenia; yaparsak veri çekmez çünkü veri yok. Koyalım veriyi.

Kod:
INSERT INTO selenia (name , age) VALUES ('tht' , 2002);

# selenia içinde bulundurduğum name ve age columslarına veri girmek istiyorum #
# name'e string değer olmamı sağlayan tek tırnak ile tht, age'e ise 2002 olarak giriyorum #

Bunu yaptığımızda artık içine veri kaydettik. Run yaparsak hiç bir şey olmayacak ama veri kaydetti aslında. Bunu silip veriyi çekmek için

Kod:
SELECT * FROM selenia;

yaparsak run dediğimizde. Bize verileri verecektir.

Filtrelemeler Nasıl Yapılıyor?

Şimdi ise tabloya yazdığımız verileri çekerkenki filtreleme işlemlerine bakacağız. Filtreleme dediğim yani tabloda 2 veri var diyelim. Bu 2 veriden 1 ini çekmek istiyoruz bunu anlatacağım.

Kod:
SELECT * FROM selenia WHERE id =1;

Yaptığımızda bize id si 1 olan yani id 1 columunda olan verileri bize verecektir. Bu durumda bize tht ve 2002 verisini verir. 2 yapsaydık 2 yi verecekti. 2. bir veri eklemedik ama eklesek öyle. Peki 2-1 yapsaydık? Bunu göstermek için veri ekledim içine.





Önce 1 istedik güzel sonucumuzu verdi. Sonra 2-1 dedik gene 1. id deki sonucu verdi. Bu MySQL sorgusunda anlattığım olayların kanıtıdır yani biraz. Zaten onlar doğru istediğiniz bir MySQL tabanında bir yerde deneyebilirsiniz kali de böyle bir şey var hazırda. Birde şöyle yapalım.

Kod:
SELECT * FROM selenia WHERE name = 'tht';

tht ismi olanları getir dedik. Bize tht nin bulunduğu columu getirdi verilerini verdi.

Kod:
SELECT * FROM selenia WHERE name LIKE 't%' ;

Burda LIKE benzer manasına geliyor. t ile başlayanları getir dedik yüzde ifadesi ise t den sonra ne gelirse gelsin sen bana t yi getir gerisi önemli değil diyor.


Peki Bunlar Ne İşimize Yarayacak?


Sql Enjeksiyonunu anlamanın başında SQL Sorgularını,kodlarını bilmek gelir. Bu sayede order by,blind gibi bazı terimleri öğrenirken daha rahat ederiz.



Veri Tabanı Neye Göre Nasıl Veri Çekiyor?

Cevabı hemen üst de tablo oluşturup çekme kısımları. Şimdi bir web sitemiz olsun www.selenia.com/xx.php?id=1

Şeklinde. Bu url yi biz veri tabanı çeken bir araca atarsak örneğin jsql'e. Arka plan da SELECT * FROM xx WHERE id=1 yani 1. id deki verileri bana getir dedik. Eğer bir bug yoksa bir enjeksiyon yoksa getirmez. O enjeksiyonun engellenmesini de güvenlik duvarları ile engelleyebiliriz. Sadece bunun üzerinden gitmeyelim url yi girdiğimiz de de bu kod çalışır. Ve 1. id de girilen resimler, haberler, yazılar tüm bunları site de getirir.


Peki Bundan Önce Enjeksiyon Var Mı Nasıl Anlarız?

Gidersin sitedeki id=1 kısmına 2-1 yazarsın. Bakarsın eğer 2-1 verince sana yine 1. id de olan sayfayı getiriyorsa hayırlı olsun bu bir enjeksiyondur. Bazen vermeye de bilir hata olabilir. Bu önemli değil sebebini şimdi anlarsınız yine de enjeksiyon olabilir nasıl mı? . Bunun tespiti için UNION SELECT dediğimiz bir terim kullanacağız. Saldırganın kendi select lerini oluşturmasını sağlıyor. URL ye biz gidip yanına UNION SELECT 1,2,3,4,5,6,7,8,9,10,11 yazalım. Niye böyle yazdık 2-1 den bize 1. sayfayı getirmedi. Bizde dönene kadar bunu birer birer arttırdık. Ve enter bastığımızda hani örnek diyorum şimdi test bir sayfa da da göstereceğim zaten. Bize 1. sayfayı verir. Güzel verdi incelersin harbiden de 1. sayfa mı diye yani 1. id deki sayfa mı diye bakarsın farklı bir şeyler de var. Ne demek bu aslında gitmiş bizim yazdığımız bu 1,2,3 ..... 11 de olan id leri de almış yazdırmış. Buda bir enjeksiyondur. Order By dediğimiz manuel enjeksiyon bundan kaynaklanıyor. Artık siteden böyle veri çekebiliriz. Baktık siteye 2. id yi mi getirmiş bu kod da 2 nin yerine bi tane version() helper'ı koyarsın gider sana versiyonu verir site üzerinde. Artık veri çekiyoruz. Tüm bu dediklerimi test bir site de anlatayım resim olarak.






# Girdik id 1. deki sayfaya. Sayfayı inceledik onu tanıdık. #
# 2-1 dedik girdik 1. sayfayı verdi gayet güzel tamam inceledik aynı bir fark yok #
# Peki manuel çekermiyiz veri acaba dedik çünkü 2-1 i burda bana çalıştırdı. Gittik UNION SELECT kullandık kendi SELECT lerimizi oluşturduk. Sayfayı inceledik bu sefer alt da bir farklılık gördük güzel dedik bundan manuel olur. #
# Tuttuk helper'lar ile manuel veri çektik versiyonu gördük #

İşte buna Order By deniliyor ...


Database'i Kontrol Etmek

Manuel bir enjeksiyon gördük. Database i kontrol nasıl ederiz. Şimdi genelde sitelerde -999999 yoktur yani böyle bir id numarası yoktur. Gidersin www.selenia.com/xx.php?id=-999999 yazarsın yanına da UNION SELECT 1,2,3,4,5,6,version(),8,9,10,11 yazarsın. Ne yapar bu bize. -99999 diye bir id columu olmadığı sadece unıon select deki columları alacak ve onu çalıştıracak bu durumda sayfamız daha tertipli olacak.



Bakın sayfa temize çıktı sadece bizim istediğimiz şeyi aldık. Bu da bir enjeksiyon artık dememe gerek yok bakın tek bir enjeksiyon neler doğurdu. Dahası var tabiki. Artık gidersin version() yerine database() yazarsın ve database'i görürsün. Sonra o database e girer admin bilgileri görürsün. Tehlikelidir yani.



Bakın database ismini çıkardı. Acuart'ı. Artık veri çıkartabiliyoruz yani. Aslında bu anlattığım UNİON SQL Enjeksiyonu olarak geçiyor ama manuel bir şekilde site den veri çekmemizi sağladığı için biraz öyle adlandırdım.

Admin Panelindeki PHP Kodunu Aşmak


Şimdi arkadaşlar SQL Bypass da admin panelinde hani 1=1 vermesi için gidip oraya '1=1' yazıyoruz. Şimdi web sitesini kodlayan adam bunu engellemiş olabilir. Şimdi aslında ezber yapmamak gerek. Or yerine and de kullanılıyor yani. 1=1 vermesi için illa string 1=1 mi yapmalıyız hayır. Gidip biz oraya '2'-'1'='2'-'1' yaparsak gene sonucu burda bize 1=1 verir. Adam belki bunu filtrelememiştir yani. Peki nasıl oluyor bu mantık derseniz. Şimdi admin panelinde bir login var adam gitmiş kişi buraya 1=1 girerse engelle onu demiş. Ama biz 1=1 veren farklı bir durum girdik burda php kodundan geçiyoruz bir kere. Php kodu sonra gidip database e bakıyor eğer engelleyecek bir durum söz konusu değilse bizi burda login ediyor. Sonuç gene 1=1 evet ama php kodundan en azından bu şekilde sıyrılıyoruz. İllaki bir admin paneline '1=1' uygulamak zorunda değilsiniz veya 'or' '=' gibi..

Blind Enjeksiyonu Mantığı

Yine veri tabanı tepkileri devreye giriyor. Url lerde yapılan deneme yanılma yolu ile tespiti ve sömürülmesi gerçekleştirilen bir zaafiyet. Yukarda anlattıklarım bu zaafiyete de giriyor aslında. Burda tek farkı 1=1 gibi değerler yakalamak değil farklı rakamlardan oluşan değerlerden veri tabanına ulaşma ve union selectle veri çekmektir. Yani aslında xor mantığı biraz burda devreye giriyor. Şimdi bazı SQL Enjeksiyonu çözümleri yapacağız test ortamında.


Konum bu kadardı. Umarım bir katkısı olur iyi forumlar.









 
Son düzenleme:

Ghost Killer

Yaşayan Forum Efsanesi
13 Ocak 2019
11,239
7,722
Cevap: SQL Enjeksiyonunu Anlamak

Bilmeyenler için faydalı konu olmuş, eline sağlık.
 

x4807

Katılımcı Üye
10 Ağu 2019
985
17
Cevap: SQL Enjeksiyonunu Anlamak

Eline sağlık. Bu tarz konular sevindirici...
 

'Medusa

Katılımcı Üye
18 Ocak 2021
839
370
JAPAN
Cevap: SQL Enjeksiyonunu Anlamak

eline koluna sağlık böyle uzun konuları yazmak herkesin harcı değil çok güzel
 

M3m0ry

Kıdemli Üye
3 Haz 2017
4,411
129
4
xD
Cevap: SQL Enjeksiyonunu Anlamak

Gerçtekten konuların güzel. Bunu okuyacam güzlece , ellerine sağlık :))
 

kiss4u

Üye
9 Şub 2019
240
10
Cevap: SQL Enjeksiyonunu Anlamak

Sürekli takıldığım konulardan birisi, eline sağlık bazı şeyleri kavramaya başladım gibi :D
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.