SQL injection with filter bypass via XML encoding
SQL injection with filter bypass via XML encoding

Bu lab’da klasik bir SQL injection senaryosu var ama küçük bir twist ile geliyor: filtre bypass. Uygulamanın stock check özelliği üzerinden veri tabanına giden bir sorgu bulunuyor ve güzel tarafı şu — sorgu çıktısı direkt response’a yansıyor. Yani elimizde net bir attack surface var.

Ama iş o kadar kolay değil. Araya bir WAF koymuşlar ve klasik SQL injection payload’larını direkt blokluyor. Yani bildiğimiz ' OR 1=1-- tarzı denemeler burada işe yaramıyor. Biraz daha yaratıcı düşünmek gerekiyor.
Lab’in amacı oldukça net: users tablosundan admin kullanıcısının username ve password bilgisini çekip sisteme giriş yapmak. Bunun için UNION tabanlı bir SQL injection gerçekleştirmemiz gerekiyor. Ancak filtreler yüzünden payload’ı düz şekilde gönderemiyoruz.
İlk olarak uygulamanın stock check özelliğine baktım. Buradan giden isteği yakalayınca fark ettim ki veri JSON falan değil, direkt XML formatında gönderiliyor. productId ve storeId değerleri XML içinde gidiyor.
Request’i alıp Repeater’a attım. Amacım basit: gönderdiğim değer gerçekten backend’de işleniyor mu, yoksa sadece sabit bir response mu dönüyor?

Sonra küçük bir test yaptım. storeId değerini değiştirip 1' yazdım
<storeId>1'</storeId>waf a takıldı ve engelledi.Burada olay netleşti: SQL injection var ama WAF düz payload’ları yakalıyor.Payload doğru ama “çok açık” olduğu için bloklanıyor. O yüzden gizlemem gerekiyor.
Buradan sonra klasik ilerledim. Kaç kolon döndüğünü anlamak için UNION denemesi attım:
<storeId>1 UNION SELECT NULL</storeId>Ama burada direkt blok yedim. Response gelmedi, request filtreye takıldı.

Burada Hackvertor kullandım. Payload’ı seçip sağ tık → Extensions → Hackvertor → Encode → hex_entities yaptım.

payload encode edilince XML entity formatına dönüyor. Yani WAF artık bunu direkt SQL injection olarak algılamıyor.
Aynı request’i tekrar gönderdiğimde bu sefer bloklanmadı. Normal response aldım. Yani WAF bypass olmuş oldu.
bir null daha eklediğimde hata vermedi
Query tek kolon döndürüyor
- Birden fazla kolon döndürmeye çalışınca sonuç bozuluyor ( 0 units gibi)
O yüzden username ve password’u tek kolonda birleştirdim:
<storeId><@hex_entities>1 UNION SELECT username || '~' || password FROM users</@hex_entities></storeId>burada ~ sadece ayırıcı.

Response’ta direkt username ve password’ler geldi. Admin hesabını aldım, login oldum ve lab çözüldü.

Bir sonraki laboratuvarda görüşmek üzere 🌸







