MongoDB ve NoSQL Injection Zafiyetleri

Merhaba

İlişkisel veri tabanı sistemlerine yapılan SQL Injection saldırılarının temeli query string oluşturulmasına dayanmaktadır. Bu durumda saldırı vektörü oluşturulmasında mantıklar, gelenekselleşmiş ilişkisel veri tabanı sistemleri mimarileri gölgesinde kalmaktadır.

Örnek olarak aşağıdaki gibi URL’in var olduğunu kabul edelim.

Bu link üzerinde GET talebi ile taşınan id değişkeninin %99 ihtimalle SQL sorgusunun WHERE statement’ında kullanılacağı düşünülmektedir.

Bu durumda saldırı yapılan noktada kullanılan veri tabanı sorgusu yukarıdaki gibi düşünülecektir ve saldırı payloadları bu alınan kararlar neticesinde şekillenecektir. Eğer saldırı vektörleri bu geleneksel yaklaşım çerçevesinde kalırsa, noSQL veri tabanı sistemlerinde herhangi bir zafiyet tespiti yapılması imkansızdır.

mongoDB ve NoSQL Injection Test Ortamı

Benim gibi ilişkisel veri tabanı sistemlerinin kullanıldığı uygulamlara sızma testi gerçekleştiren insanların, atak vektörü oluşturma noktasında mongoDB ile problemler yaşayacağı aşikardır. Çünkü MySQL veya PostgreSQL gibi veri tabanı sistemlerini kullanan uygulamalarda genellikle query string’ler oluşturulmaktadır ve sql injection saldırıları bu query string’in oluşturulmasında ki kontrol hatalarından kaynaklanmaktadır. İş MongoDB’ye geldiğindeyse query string olayı alışılagelmiş bir mantıkta değildir.

Örnek olarak mongoDB veri tabanına aşağıdaki şekilde 3 adet kayıt girilmiştir.

Şimdiyse bu kullanıcıları veri tabanında arayarak ekrana yazan PHP uygulamasının kaynak kodlarını okuyalım.

Kullanıcı girdisi olarak alınan isim değişkeni veri tabanında aratılıp, sonuçlar ekrana yazılmaktadır. Bu uygulamayı sqlmap ile test ettiğimizde herhangi bir güvenlik açığı bulunamamış olacaktır. Çünkü güvenlik testi yaklaşımında veri tabani sistemi olarak ilişkisel veri tabanı kullanıldığı varsayılarak ciddi bir hata yapılmıştır.

MongoDB NoSQL Injection Saldırı Vektörü

Uygulamaya kullanıcı girisi olarka MEHMET yazıldığında aşağıdaki sonuç elde edilmiş olacaktır.

Eğer saldırı vektörü olarak aşağıdaki şekilde bir talep gönderilirse bu sefer veri tabanında ki tüm veriler ekrana yazılmış olacaktır. Tıpkı ilişkisel veri tabanı sistemlerine yapılan saldırılarki tırnak or tırnak bir tırnak eşittir tırnak bir = ‘ or ‘1’=’1 saldırıları gibi.

Dönen sayfa sonucu ise aşağıdadır.

Screenshot from 2014-03-26 16:36:46

 

Peki bu durum nasıl oluştu ?

Kullanıcı girdi olarak name[$ne]=merhababenaslindayokum yazıldığında oluşan mongoDB objesi aşağıdadır.

Yani mongoDB değeri merhababenaslindayokum string’ine eşit olmayan dökümanları döndürecektir.

Sonuç

2014 yılı nodeJS, mongoDB , socket.io gibi gelenekselleşmiş web uygulaması mimarilerinden çok farklı mimarilerde projelere gebe durumdadır.

Web uygulama sızma testleri gerçekleştiren ekiplerin/bireylerin bu yeni teknolojilere ve mantıklarına aşina olmaları çok önemlidir. Aksi takdirde bu yazıda demo olarak gösterine güvenlik açığı, login modüllerinde Authentication Bypass olarak karşınıza çıkacaktır ve kritik düzey bu bulgunun tespiti pentester tarafından gerçekleştirilemeyecektir. Bu nedenledir ki en development olmadan, pentester olunamaz.

  • Ancak alışılagelmiş injection önlemlerinin yanı sıra mongoDb’de tek alınması gereken önlem parametleri değişken türleri tanımlı olarak göndermek.
    Yukarıdaki örnek için önlem gelen inputu (string) ile ilgili türe dönüştürmek :

    $cursor = $collection->find(array(
    “isim” => (string)$name
    ));