SQL Enjeksiyon saldırısı nasıl çalışır?

İçindekiler

Web uygulamalarındaki, neden olabilecekleri önem derecesi nedeniyle en büyük etkiye sahip olan güvenlik açıklarını listelersek, şüphesiz aşağıdakileri bulacağız. SQL Enjeksiyonu. Bu güvenlik açığı saldırganın veritabanının içeriğini listelemekten sunucuya tam erişim elde etmesine bile izin verebilir.Nelerden oluştuğunu görelim.

Dönem enjeksiyon, uygulamanın veritabanına yürüttüğü bir sorguya SQL ifadelerini enjekte etmek veya eklemek anlamına gelir, bu, uygulamanın kullanıcıdan doğrudan veya dolaylı olarak talep ettiği herhangi bir veri girişinden yararlanarak gerçekleştirilir, doğrudan alanlara atıfta bulunuruz, örneğin formlar kullanıcının belirli verileri girdiği yerde, dolaylı olarak bunlar URL (GET) yoluyla iletilen parametreler olabilir. SQL ifadelerini sorguya enjekte etmenin amacı, söz konusu sorgunun mantığını veya veritabanı tarafından döndürülecek sonucu değiştirmektir.

Bu, özel bir alana erişmek için bir kullanıcı adı ve parolanın istendiği tipik bir formdur. Sorguyu oluşturan sunucu tarafı kodu aşağıdaki gibi olacaktır:

 $ kullanıcı adı = $ _POST ['kullanıcı adı']; $ şifre = $ _POST ['şifre']; $ sql = "SELECT * FROM users WHERE username = '$ username' AND password = '$ password'"; 
Gördüğümüz gibi, önce kullanıcı adı ve şifre değişkenlerine girilen kullanıcı adı ve şifre sırasıyla saklanır, daha sonra söz konusu kullanıcının var olup olmadığını kontrol etmek için veritabanına gönderilecek olan sorguya bu değerler dahil edilir. Örneğimizde kullanıcının kullanıcı adı admin ve şifre olarak girdiğini varsayalım. geçmek123, form gönderildiğinde, oluşturulan sorgu aşağıdaki gibi olacaktır:
 SELECT * FROM users WHERE username = 'admin' AND password = 'pass123'
Gördüğümüz gibi, giriş verileri yerleştirildiğinde, bunlar bir metin dizesi olduğunu göstermek için tek tırnak işaretleri arasındadır. Bu sorgu veritabanına gönderilecek ve varsa söz konusu kullanıcının verileriyle bir sonuç döndürecek ve özel alana erişime izin verilecek, aksi takdirde boş bir sonuç döndürecek ve erişim reddedilecektir.

Daha önce de belirttiğimiz gibi, SQL enjeksiyonu Bir sorguya SQL kodu eklemekten oluşur ve bu form, SQL enjeksiyonuna karşı savunmasız bir uygulamamız olması için giriş alanlarından geçmesine izin verir.

Güvenlik açığından yararlanma
Bu güvenlik açığından yararlanmanın amacı, doğru kullanıcı adı veya parolayı bilmeden özel alana erişmek ve güvenlik açığından yararlanmaktır. O halde elde etmemiz gereken, geçerli bir sonuç döndüren bir sorgu oluşturmak için SQL kodunu enjekte etmektir.

Şifre alanına aşağıdaki SQL kodunu enjekte edersek sorgunun nasıl oluştuğunu görelim:

Sorgu oluşturulduğunda aşağıdaki gibi olacaktır:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' veya 1 = 1 # '
Girilen kodun parolayı içine alan tek tırnak işaretleri arasında olmasına dikkat edilmelidir, eklenen kodun başındaki tek tırnak işareti parola = 'kısmındaki açık tırnak işaretinin tamamlanmasından sorumludur. sorgu, bu şekilde geçici olarak aşağıdaki sorguyu elde ederiz:
 SELECT * WHERE kullanıcı adı = 'hacker' VE şifre = '' kullanıcılardan
Şu anda bu sorgu, bu kimlik bilgilerine sahip böyle bir kullanıcı olmadığı için sonuç döndürmeyecektir, ancak eklenen kodun geri kalanını analiz edelim:
 veya 1 = 1 #
Cümle veya 1 = 1 koşullu bir sorguda bildiğimiz gibi, sorgunun mantığını kökten değiştirir. VEYA İki ifadeden en az biri yerine getirildiğinde true dönecek, bizim durumumuzda ilk ifade kullanıcı adı = 'hacker' VE şifre = '' , ve ikinci veya 1 = 1 , ikincisi her zaman doğrudur, yani 1 her zaman 1'e eşittir, çünkü sorgu geçerli bir sonuç döndürür.

Son olarak cümleyi kapatan tırnak işaretinden kurtulmamız gerekiyor, bunun için cümlede kullanılan yorumları kullanabiliriz. SQL: #, - (çift tire), o iyi /* */ . bu nedenle tam sorgu:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' veya 1 = 1 # '
# işaretinden sonraki her şey yorum olarak dikkate alınacak ve sorgunun parçası olmayacaktır.

Geçerli bir sonuç elde etmek için kodda ekleyebileceğimiz birçok başka varyasyon vardır, örneğin:

wave wave wave wave wave