- 8 Ara 2022
- 103
- 39
PortSwigger | Web Security Academy
SQL Injection
What is SQL Injection? Tutorial & Examples | Web Security Academy
In this section, we explain: What SQL injection (SQLi) is. How to find and exploit different types of SQLi vulnerabilities. How to prevent SQLi. Labs If ...
portswigger.net
Bölüm 1: SQLi Temelleri
SQL Injection Nedir?
"SQL enjeksiyonu (SQLi), saldırganın bir uygulamanın veritabanına yaptığı sorgulara müdahale etmesine izin veren bir web güvenlik açığıdır."
Kısaca web sitesinin bağlı olduğu veritabanına açıklardan faydalanarak erişmemize olanak tanır.
Ürünleri farklı kategorilerde görüntüleyen bir alışveriş uygulaması düşünün. Kullanıcı, Hediyeler kategorisine tıkladığında, tarayıcısı şu URL'yi ister:
https:// insecure-website.com/products?category=Gifts
Bu URL'yi istediğimizde web sitesinin bağlı olduğu sunucuda şuna benzer bir SQL sorgusu döner:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Burada bu tarz bir sorgu yakaladığımız zaman hemen "bunu nasıl manipüle edebilirim?" diye düşünmemiz gerekir. Örneğin, "released = 1, yani "yayınlanmış = 1" bölümünün sonunu "0" ile değiştirirsek muhtemelen mağazada henüz yayında olmayan ancak veritabanına eklenmiş ürünleri göreceğiz.
Manipülasyon işlemini genelde Burp gibi bir uygulama üzerinden yaparız ancak yeteri kadar güvenli olmayan sitelerde bu tarayıcının URL alanından da yapılabilir. SQLi saldırısını URL üzerinden yapmak isterseniz aradaki tek fark bazı karakterlerin URL ile encode edilmesi olacaktır.
Şimdi bu sorguyu manipüle etmeyi deneyelim:
https:// insecure-website.com/products?category=Gifts'+OR+1=1--
Sunucuda dönecek sorgu:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
Burada "+" boşluklar yerine kullanılıyor. Biz ise turuncu kısımları normal sorguya ekleyerek sorguyu manipüle etmeye çalışıyoruz. Lacivert bölüm ise manipülasyonumuzdan sonra geçersiz olanlar.
Tek tırnak işareti ile mevcut sorgu alanını kapatıyoruz. Burada "OR" dönen diğer değerleri ezer ve sorgunun herhangi bir tarafında "true" değeri dönüyorsa dönen tüm değerlerin "true" döndürülmesini sağlar. "--" ile de sonraki komutları yorum satırına çeviriyoruz. Böylece bir, bire eşit olduğundan "category" içerisindeki tüm değerler döndürülüyor.
Gerçek bir senaryoda tabii ki bu kadar basit sorgular kullanmıyoruz. En başta "1=1" gibi klasik sorgular yerine "124=124" gibi daha öngörülemez bir eşitlik tanımlamamız daha doğru olacaktır. Bunun yanı sıra sorguyu olabildiğince karmaşık hale getirmemiz gerekiyor ki, sunucu tarafında alınan önlemleri bir şekilde geçebilelim. Bazen SQL sorgularının doğruluğunu bozacak değerler bile bize doğru sonuçları verebilir. Örneğin yukarıda kullandığımız "' OR 1=1--" yerine "''''ORR 1=1--" yazsaydık, bu sorgu normalde yanlış olsa da belki de sunucunun güvenlik algoritması tarafından tekrar düzenlenecek ve bize istediğimiz sonucu verecekti.
Lab 1: Kategorilerde WHERE Sorgusunu Manipüle Ederek Verilere Ulaşmak
Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data | Web Security Academy
This lab contains a SQL injection vulnerability in the product category filter. When the user selects a category, the application carries out a SQL query ...
portswigger.net
[1] Burada kategorileri manipüle etmemiz gerektiğini biliyoruz. O yüzden Burp'den Intercept'i açıp herhangi bir kategoriye tıklıyoruz
[2] Burp'de gördüğümüz sorgu şu şekilde
Bu sorgu URL ile encode edildiği için bu şekilde görünüyor. Gördüğümüz "%2C" aslında virgül. "+" ise boşluklar yerine kullanılmış. Henüz yeniysek ve göndereceğimiz sorguların doğruluğundan emin olamıyorsak değiştireceğimiz yeri metin belgesine kopyalayıp orada düzenleyebiliriz. SQLi mantığını biraz kavradıktan sonra bunun için repeater kullanmak daha doğru olacaktır.
[3] Sorguyu kopyalayıp metin belgesi içerisinde düzenledim. Bundan sonra bu şekilde göstermeyeceğim. Kafanızın karıştığı yerde metin belgesine alarak sorguyu inceleyebilirsiniz.
[4] Burp'de gördüğümüz sorgu şu şekilde
Düzenlediğimiz sorguyu Burp'de yerine yazıyoruz ve gönderiyoruz. Yanlış yazma ihtimalimize karşı sorguyu repeater'a attım. Sorguyu gönderirken bir boşluk dahi olsa kaydırma yapmamamız gerekiyor. Yaparsak hata alırız. Örneğin SQL sorgusunun yanındaki "HTTP/1.1" kısmını kaydırmamamız gerekiyor.
[5] Bunu yaptıktan sonra sadece tıkladığımız değil, tüm kategorilerin ürünlerinin listelendiğini görüyoruz ve lab çözülmüş olarak işaretleniyor.
Lab 2: SQLi Aracılığıyla Login Bypass
Lab: SQL injection vulnerability allowing login bypass | Web Security Academy
This lab contains a SQL injection vulnerability in the login function. To solve the lab, perform a SQL injection attack that logs in to the application as ...
portswigger.net
[1] Giriş paneline ulaşabilmek için "My account" seçeneğine tıklıyoruz.
[2]Intercept'i açıp rastgele veriler girerek giriş isteği yolluyoruz.
[3]Düzenlememiz gereken turuncuyla işaretlediğim yerler. Burada nasıl bir manipülasyon uygularsak giriş yapabileceğimizi düşünmek gerekiyor. Örneğin "administrator" hesabı var olmasını bekleyebileceğimiz bir hesap. O yüzden kullanıcı adı yerine "administrator" yazarak giriş yapmayı deneyebiliriz. Bu çalışmasaydı "admin" gibi farklı seçenekleri de deneyebilirdik.
[4]SQL mantığına uygun olarak "mr246" yazan kullanıcı adı bölümünü "administrator'--" olarak düzenliyoruz. Yani kullanıcı adını "administrator" olarak aldıktan sonra uygulamanın arka planda sorguyu kapatmak için kullanacağı tek tırnağı biz ekliyoruz ve "--" kullanarak diğer bölümleri yorum satırı haline getiriyoruz. Böylece şifre sorgulanmadan yalnızca kullanıcı adını göndererek giriş yapabiliyoruz.
[5]Düzenlediğimiz isteği gönderiyoruz ve administrator kullanıcısının hesabıyla giriş yapmış oluyoruz.
Gerçek hayatta tabii ki hiçbir şey bu kadar basit değil. İlk lab'ler tamamen arka planda dönen sorguların mantığını öğretmek üzerine kurulu olduğundan basitçe çözebildik. Ayrıca gerçek hayatta "administrator" kullanıcısının var olduğunu bilmemiz mümkün olmadığından belki de yüzlerce kullanıcı adı deneyecektik.
Konu altına yararlı/yararsız tarzında dönüşlerinizi bekliyorum. Bunu yapmak daha iyi öğrenmemi sağlasa da fazla vaktimi alıyor. Birileri gelip bir şey öğrenecekse devam edeceğim.
Ana konunun linki: https://www.turkhackteam.org/konular/ana-konu-portswigger-web-security-academy.2031465/
Ana konunun linki: https://www.turkhackteam.org/konular/ana-konu-portswigger-web-security-academy.2031465/
Son düzenleme: