linkedin github youtube instagram

 

SQL INJECTION 1

 

SQL nedir?

 

SQL, Structured Query Language türkçe olarak Yapılandırılmış Sorgu Dili olarak çevirebiliriz. Adından da anlışalacağı üzere bir sql bir sorgulama dilidir. Veritabanından kayıt alma, kayıt ekleme, kayıt silme gibi işlemler için kullanırız

 

SQL Injection nedir?

 

SQL Injection sql sorgusuna saldırgan tarafından zararlı kod parçacıkları enjekte edilmesidir. 

 

SQL Injection zaafiyeti nereden doğuyor?

 

Bir web uygulamasında en kritik noktalardan birisi kullanıcıdan veri girişi alındığı durumlardır. Biz kullanıcıdan nerelerde veri girişi alabiliriz gelin tek tek inceleyelim.

1) Siteye tıkladığı anda

----Evet siteye tıkladığı an bize GET metodu olarak kullanıcıdan bazı veriler gelir. Ara bir proxy yazılımı kullanarak bazı verilerimize bakalım.

 

GET / HTTP/1.1
Host: degirmencimehmet.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

 

Siteye tıkladığım an sunucu kayıtlarıma bu gibi veriler gelicektir. Ara bir proxy yazılımla buradaki bazı değerleri değiştirebilirim, eğer sunucu tarafında bu veriler veritabanında loglanıyorsa ve güvenli

bir kodlama yapılmamışsa buradan sql sorgusuna zararlı kod enjekte edebilirim. Nasıl yapıldığına birazdan değineceğim.

 

 

2)Kullanıcıdan veri alınan durumlarda

Örneğin bir sitede yorum bölümü veya mesaj gönderme bölümü var. Yazdığımız mesajlar veritabanında tutulur ve bir sql sorgusuyla kayıt edilir. Bu sql sorgusuna, bu yorum kutuları sayesinde müdahele edebilirim.

 

 

3)URL üzerinden

Evet url üzerinden de zararlı kod enjekte edebilirim. Gelin URL üzerinden sql zaafiyetini inceleyelim.

 

SQL Zaafiyeti

Programımızın backend tarafında bir programlama dili çalışır, bu php python asp node farketmez. Bu örnekte php kullanarak anlatacağım. Sitemizin 

 

https://degirmencimehmet.com/post.php?id=4

 

Şeklinde bir url yapısı olduğunu düşünelim. Veya 

 

https://degirmencimehmet.com/post/4
https://degirmencimehmet.com/post/yazi-adi

 

bu şekilde de olabilir. Hepsinin yaptığı iş aynıdır. 

 

Buradaki temel mantık şudur,  post.php dosyasına veya fonksiyonuna bir değer geliyor. Bu bir sayı veya yazı olabilir artık programcı nasıl kodladıysa ona bağlıdır. Biliyorum konuyu çok karışık bir hale getirdim o yüzden biz ilk url yapısı üzerinden devam edelim.

 

post.php dosyasına bir istek geliyor ve sonunda ?id=4 gibi bir değer geliyor. Bu genellikle şu manaya gelir, Veritabanından id'si 4 olan yazıyı getir.

 

$yazi_id = $_GET['id'];

$sql_sorgusu = "SELECT *FROM posts where id='$id'";

$sql_sorgusu->execute();

 

 

Kodu biraz incelersek ilk satırda urldeki id değerine yazi_id değerine atıyor.

 

İkinci satırda bir string değer olarak sql sorgusu yazıyor ve SELECT ile tabloyu seçiyor, where ile nereden getireleceğini belirtiyor.

 

Üçüncü satırda sorguyu çalıştırıyor.

 

Aslında kullanıcının girdiği ?id=4 değeri programın bir nevi kaynak koduna müdahale ediyor. Eğer ben id=4 yerine şunu yazarsam

 

?id=1'

 

SQL sorgumuz şuna dönüşür

 

"SELECT *FROM posts where id='$id'"

"SELECT *FROM posts where id='1' '"

 

Örnekten de anlaşılacağı üzere  yazdığımız kod tırnaklara müdahale ederek sql sorgusunu bozdu. Hatta site bu yüzden bize SQL hatası verecektir. Aslında SQL injection'un temel noktası buradan çıkıyor.

 

Tırnaklara müdahele edebiliyorsak buraya istediğimiz kodu yazabiliriz. Buradan sonra tırnaklarla oynayarak bulmaca çözmek gibi. Koda müdahale ederek istediğimiz veriyi görebilir/silebilir/ekleyebilir ...

Bu da başka bir dersin konusu. 

 

İyi günler dilerim