NoSQL Injection nedir ve nasıl önleyebilirsiniz?

By Hacker at 17 days ago • 0 Üye Abone Oldu • 29 Defa Görüntülendi

NoSQL enjeksiyon güvenlik açıkları, saldırganların MongoDB gibi SQL sorguları kullanmayan veritabanları için komutlara kod enjekte etmesine izin verir. NoSQL enjeksiyon saldırıları özellikle tehlikeli olabilir, çünkü kod sunucuya web uygulaması dilinde enjekte edilir ve yürütülür, bu da olasılıkla isteğe bağlı kod yürütülmesine izin verir. NoSQL enjeksiyonunun geleneksel SQL enjeksiyonundan nasıl farklı olduğunu ve bunu önlemek için neler yapabileceğinizi görelim .

NoSQL enjeksiyonu

NoSQL'e Hızlı Bir Giriş

Veritabanları ile çalışmasanız bile, muhtemelen son birkaç yıldır bulutla ilgili terimler arasında NoSQL'i duymuşsunuzdur. NoSQL (“SQL olmayan” veya “yalnızca SQL” olarak da bilinir), SQL sorgu dilini kullanmayan veritabanlarını kapsayan genel bir terimdir. Uygulamada, popülaritesi artan dağıtılmış bulut platformları ve web uygulamaları için arka uç olarak ilişkisel olmayan veritabanlarına atıfta bulunmak için kullanılır. İlişkisel veritabanlarında olduğu gibi tablolarda veri depolamak yerine NoSQL veri depoları, belgeler, grafikler, nesneler ve diğerleri gibi belirli amaçlar için daha uygun olan diğer veri modellerini kullanır. 

Şu anda en popüler NoSQL veritabanı ürünlerinden biri olan MongoDB , verileri JSON'a (JavaScript Nesne Gösterimi) benzer bir sözdizimi kullanarak belge olarak saklar. Bu, diğer avantajların yanı sıra, geliştiricilerin yalnızca JavaScript kullanarak tam yığın uygulamalar oluşturmasına olanak tanır. Saldırganların NoSQL veritabanı tarafından desteklenen bir web uygulamasına kod enjekte etmek için onaylanmamış kullanıcı girdilerinden nasıl yararlanabileceğini göstermek için MongoDB sorgularını kullanacağız.

MongoDB Enjeksiyonu Neden Mümkün?

Geleneksel SQL enjeksiyonu ile saldırgan, uygulamanın bir veritabanı motoruna gönderdiği SQL sorgularını (veya diğer SQL ifadelerini) değiştirmek veya değiştirmek için güvenli olmayan kullanıcı girişi işleminden yararlanır. Başka bir deyişle, bir SQL enjeksiyonu saldırganın veritabanındaki komutları yürütmesine izin verir. İlişkisel veritabanlarının aksine, NoSQL veritabanları ortak bir sorgu dili kullanmaz. NoSQL sorgu sözdizimi ürüne özeldir ve sorgular uygulamanın programlama dilinde yazılır: PHP, JavaScript, Python, Java, vb. Bu, başarılı bir enjeksiyonun saldırganın yalnızca veritabanında değil, uygulamanın kendisinde de komutları yürütmesine izin verdiği anlamına gelir; bu da çok daha tehlikeli olabilir.

MongoDB, İkili JSON (BSON) veri formatını kullanır ve güvenli bir BSON sorgu montaj aracı ile birlikte gelir. Sorgular ayrıca BSON nesneleri (örn. İkili veriler) olarak temsil edilir, bu nedenle doğrudan dize enjeksiyonu mümkün değildir. Ancak, MongoDB kasıtlı olarak uygulamaların $whereve mapReduceişlemleri içinde sunucuda JavaScript çalıştırmasına izin verir Dokümantasyon çok açıktır bu işlevsellik kullanılırsa, geliştirici kötü amaçlı JavaScript göndererek engellemek için özen gerektiğini söyledi. Başka bir deyişle, MongoDB kasten potansiyel bir enjeksiyon vektörü içerir. Geliştirici Yani eğer kötü niyetli bir kullanıcı ne yapabilir değil dikkatli?

PHP Basit MongoDB Enjeksiyonu

Temel bir kimlik doğrulama baypası için, saldırgan MongoDB operatörlerini alan değerlerine girmeye çalışabilir, örneğin $eq(eşittir), $ne(eşit değil) veya $gt(daha büyük). Parametre değerleri doğrudan bir formdan alınmış bir PHP uygulamasında veritabanı sorgusu oluşturmanın güvenli olmayan bir yolu:

$query = array("user" => $_POST["username"], "password" => 
    $_POST["password"]);

Bu sorgu daha sonra oturum açma kimlik bilgilerini denetlemek için kullanılırsa, saldırgan PHP'nin yerleşik ilişkilendirilebilir dizi işlemesini kötüye kullanarak her zaman true döndüren ve kimlik doğrulama işlemini atlayan bir MongoDB sorgusu enjekte edebilir. Bu, aşağıdaki POST isteğini göndermek kadar basit olabilir:

username[$ne]=1&password[$ne]=1

PHP bunu bir dizi diziye çevirecektir:

array("username" => array("$ne" => 1), "password" => 
    array("$ne" => 1));

Bir kullanıcı deposuna MongoDB sorgusu olarak gönderildiğinde, kullanıcı adı ve parolanın 1'e eşit olmadığı tüm kullanıcılar bulunur; bu, büyük olasılıkla doğru olur ve saldırganın kimlik doğrulamasını atlamasına izin verebilir.

MongoDB'de JavaScript Ekleme

Diyelim ki geliştirici MongoDB'nin $wheresorgu operatörünü onaylanmamış kullanıcı girişleriyle kullanıyor. Bu, bir saldırganın JavaScript kodu içeren kötü amaçlı girdi enjekte etmesine olanak tanır. Saldırgan tamamen rasgele JavaScript enjekte edemese de, yalnızca sınırlı bir işlev kümesi kullanan bir kod olsa da , bu yararlı bir saldırı için yeterlidir.

MongoDB veri deposunu işleçle sorgulamak için $where, normalde find()işlevi kullanırsınız, örneğin:

db.collection.find( { $where: function() { 
    return (this.name == 'Netsparker') } } );

Bu, kayıtları Netsparker adıyla eşleştirir. Güvenlik açığından etkilenen bir PHP uygulaması, sorguyu oluştururken örneğin değişkenten doğrudan onaylanmamış kullanıcı girdisi ekleyebilir $userData:

db.collection.find( { $where: function() { 
    return (this.name == $userData) } } );

Saldırgan daha sonra , enjeksiyon başarılı olursa sunucunun 5 saniye duraklaması için 'a'; sleep(5000)içine bir istismar dizesi enjekte edebilir $userDataSunucu tarafından yürütülen sorgu:

db.collection.find( { $where: function() { 
    return (this.name == 'a'; sleep(5000) ) } } );

Sorgular uygulama dilinde yazıldığından, bu mümkün olan birçok enjeksiyon türünden sadece biridir. Örneğin, popüler MEAN yığınında (MongoDB, ExpressJS, AngularJS ve Node.js) olduğu gibi, sunucu tarafı komut dosyası oluşturma için Node.js kullanılıyorsa , Node.js'ye sunucu tarafı JavaScript enjeksiyonu mümkün olabilir.

NoSQL Enjeksiyon Saldırılarını Önleme

Başarılı bir MongoDB enjeksiyonunun veya diğer NoSQL enjeksiyon saldırısının sonuçları geleneksel SQL enjeksiyonundan daha ciddi olabilir Saldırganlar yalnızca veritabanından veri ayıklamakla kalmaz, aynı zamanda uygulama bağlamında kod yürütebilir, örneğin hizmet reddi saldırıları gerçekleştirebilir, hatta yönetici kullanıcı hesaplarını tehlikeye atabilir ve sunucunun kontrolünü ele geçirebilir. Bu tür saldırılar özellikle tehlikelidir, çünkü NoSQL veri depoları genellikle yalnızca ilişkisel veritabanı ürünlerine aşina olan geliştiriciler için güvenli olmayan kod riskini artıran bir yeniliktir.

Birçok popüler NoSQL ürünü hala genç ve yoğun geliştirme aşamasındadır, bu nedenle en son sürümü kullanmak her zaman iyi bir fikirdir. Örneğin, MongoDB'nin önceki sürümleri birçok düzeyde kötü şöhretli ve güvensiz enjeksiyon güvenlik açıklarına sahipken, daha yeni sürümlerde güvenlik çok daha ciddiye alınıyor.

Web uygulaması güvenliğinde olduğu gibi, NoSQL enjeksiyon saldırılarını önlemenin en iyi yolu, özellikle veritabanı sorguları oluştururken uygulama kodunda onaylanmamış kullanıcı girişlerini kullanmaktan kaçınmaktır. Örneğin MongoDB, JavaScript olmadan güvenli sorgu oluşturma için yerleşik özelliklere sahiptir. Sorgularda JavaScript kullanmanız gerekiyorsa, her zamanki en iyi uygulamaları izleyin: tüm kullanıcı girdilerini doğrulayın ve kodlayın, en az ayrıcalık kuralını uygulayın ve savunmasız yapıları kullanmaktan kaçınmak için dilinizi bilin. Daha fazla tavsiye için NoSQL enjeksiyon testine ilişkin OWASP sayfasına bakın .


Giriş Yapılması Gerekli

Loading...