NoSQL Enjeksiyon Saldırıları Nedir, Nasıl Tedbir Almalıyız?

NoSQL Enjeksiyon Saldırıları Nedir, Nasıl Tedbir Almalıyız?

NoSQL enjeksiyon açıklığı, saldırganların kimlik doğrulama kontrollerini atlatmasına, verileri çalmasına ve uygulama üzerinde kontrol sağlamasına imkan veren bir web uygulaması güvenlik açıklığıdır. NoSQL terimi anahtar-değer veya anahtar-doküman modellerini kullanan ilişkisel veri tabanlarına göre daha esnek veri tabanları için kullanılmaktadır.

NoSQL veri tabanları, ilişkisel veri tabanlarında olduğu gibi standart sorguları desteklemezler. NoSQL veri tabanlarında sorgular uygulama yöntemlerine göre değişmektedir. Ancak günümüzde kullanılan birçok NoSQL veri tabanı uygulamaları JSON temelli olup, kullanıcı veri girişini bu formatta kabul etmektedir. Kullanıcı tarafından sağlanan veri girişi uygun bir şekilde sterilize edilmediği durumlarda enjeksiyon saldırılarına sebep olmaktadır.

NoSQL veri tabanına örnek bir kayıt aşağıda yer almaktadır:

Normal SQL enjeksiyon saldırılarında, aşağıdaki SQL sorgusunda ikinci satırda yer alan

username = ‘test’ OR username != ‘test’ doğrulaması gönderildiğinde her zaman doğru olarak sonuçlanacaktır.

NoSQL veri tabanlarında ise benzer şekilde kullanıcı adı kontrolünün atlatılması için $eq(eşittir), $ne(eşit değildir) veya $gt(büyüktür) gibi operatörler kullanılabilmektedir.

Aşağıda yer alan sorgu ifadesini atlatmak amacı ile kullanıcı tarafından username[$ne]=test değeri gönderildiğinde sorgu sonucunda test kullanıcısı olmamasına rağmen doğru olarak kabul edecektir.

Nasıl Önlem Alabiliriz?

NoSQL enjeksiyon saldırılarına karşı, kullanıcı veri girişi olan alanlar her zaman güvenilmez olarak değerlendirilmeli ve sterilize edilmelidir. Bunu sağlamak için aşağıdaki tedbirler uygulanabilir:

  • Uygulamada mongo-sanitize veya mongoose benzeri sterilizasyon kütüphanesinin(sanitization library) kullanılması,
  • Uygun kütüphane bulunamıyorsa beklenen kullanıcı adı ve parolası formatı dışında (örneğin; sadece string  formatında veri olması) veri kabul edilmemesi,

                 “type(some_input) is str “ benzeri kontroller yapılması

  • MongoDB kullanılması durumunda kullanıcı veri girişi olan alanlarda where, mapReduce veya group operatörlerinin kullanılmaması,
  • Ek olarak; en az yetki (least privilege) prensibi ile uygulamanın mümkün olan en az yetkilerle çalıştırılmasının uygun olacağı değerlendirilmektedir.

Yazar: Emre Çalışkan

Kaynak:

  1. https://www.netsparker.com/blog/web-security/what-is-nosql-injection/
  2. https://www.mongodb.com/nosql-explained
  3. https://www.acunetix.com/blog/web-security-zone/nosql-injections/
  4. https://ichi.pro/tr/nosql-enjeksiyonu-nedir-ve-kendimi-nasil-koruyabilirim-248522010365734