Syntax injection, NoSQL sorgu sözdizimini sistematik olarak test ederek tespit edilebilir. Her girdi alanına fuzz string'ler ve özel karakterler göndererek veritabanı hatası veya tespit edilebilir davranış tetiklenip tetiklenmediği kontrol edilir.
MongoDB'de Syntax Injection Tespiti
Test URL'si:
https://insecure-website.com/product/lookup?category=fizzy
MongoDB Sorgusu:
this.category == 'fizzy'
Test için Fuzz String:
'"`{;$Foo}$Foo \xYZ
URL-encoded saldırı:
https://insecure-website.com/product/lookup?category='%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
Eğer bu istek orijinal yanıttan farklı bir yanıt veriyorsa, kullanıcı girdisinin doğru şekilde filtrelenmediği veya sanitize edilmediğini gösterebilir.
Önemli Not: NoSQL injection açıkları çeşitli bağlamlarda ortaya çıkabilir. Fuzz string'lerinizi bu bağlamlara uygun şekilde adapte etmelisiniz. URL, JSON, XML gibi farklı formatlar farklı encoding gerektirir.
Karakter Analizi
Hangi karakterlerin uygulama tarafından sözdizimi olarak yorumlandığını belirlemek için, tek tek karakterler enjekte edebilirsiniz.
Eğer bu syntax error verirse, tek tırnak karakterinin sorgu sözdizimini bozduğu anlamına gelir.
Koşullu Davranış Kontrolü
False Koşul: ' && 0 && 'x
True Koşul: ' && 1 && 'x
Eğer uygulama bu iki koşul için farklı davranıyorsa, sorgu mantığını etkileyebildiğiniz anlamına gelir.
Mevcut Koşulları Override Etme
Boolean koşulları etkileyebildiğinizi belirledikten sonra, mevcut koşulları override etmeye çalışabilirsiniz:
Always true koşulu:
'||'1'=='1
URL'de kullanım:
category=fizzy%27%7c%7c%27%31%27%3d%3d%27%31
Bu tüm kategorilerdeki ürünleri gösterir.
Dikkat: Her zaman true değerlendiren koşulları NoSQL sorgusuna enjekte ederken dikkatli olun. Başlangıçta zararsız görünse de, uygulamalar tek bir istekten gelen veriyi birden fazla farklı sorguda kullanabilir.
Null Karakter Bypass
MongoDB null karakterden sonraki tüm karakterleri görmezden gelebilir:
Null karakter saldırısı:
category=fizzy'%00
Eğer orijinal sorgu şuysa:
this.category == 'fizzy' && this.released == 1
Null karakterden sonraki kısım görmezden gelinir.