MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

बाहरी इंजेक्शन हमलों से MongoDB को सुरक्षित करना

MongoDB सुरक्षा केवल प्रमाणीकरण प्रमाणपत्र कॉन्फ़िगर करने या डेटा एन्क्रिप्ट करने से पूरी तरह से गारंटी नहीं है। कुछ हमलावर HTTP अनुरोधों में प्राप्त मापदंडों के साथ खेलकर "अतिरिक्त मील जाएंगे" जो डेटाबेस की क्वेरी प्रक्रिया के हिस्से के रूप में उपयोग किए जाते हैं।

एसक्यूएल डेटाबेस इस प्रकार के हमले के लिए सबसे कमजोर हैं, लेकिन मोंगोडीबी जैसे नोएसक्यूएल डीबीएम में बाहरी इंजेक्शन भी संभव है। ज्यादातर मामलों में, बाहरी इंजेक्शन क्वेरी बनाते समय स्ट्रिंग्स के असुरक्षित संयोजन के परिणामस्वरूप होते हैं।

बाहरी इंजेक्शन हमला क्या है?

कोड इंजेक्शन मूल रूप से अप्रमाणित डेटा (अनमिटिगेटेड वेक्टर) को एक कमजोर प्रोग्राम में एकीकृत कर रहा है, जो निष्पादित होने पर, आपके डेटाबेस तक विनाशकारी पहुंच की ओर जाता है; इसकी सुरक्षा को खतरा है।

जब अस्वच्छ चरों को MongoDB क्वेरी में पास किया जाता है, तो वे दस्तावेज़ क्वेरी ओरिएंटेशन संरचना को तोड़ देते हैं और कभी-कभी स्वयं जावास्क्रिप्ट कोड के रूप में निष्पादित होते हैं। यह अक्सर ऐसा होता है जब Nodejs सर्वर के लिए सीधे बॉडी-पार्सर मॉड्यूल से प्रॉप्स पास करते हैं। इसलिए, एक हमलावर आसानी से एक Js ऑब्जेक्ट सम्मिलित कर सकता है जहाँ आप एक स्ट्रिंग या संख्या की अपेक्षा करते हैं, जिससे अवांछित परिणाम प्राप्त होते हैं या आपके डेटा में हेरफेर होता है।

छात्रों के संग्रह में नीचे दिए गए डेटा पर विचार करें।

{username:'John Doc', email:'[email protected]', age:20},

{username:'Rafael Silver', email:'[email protected]', age:30},

{username:'Kevin Smith', email:'[email protected]', age:22},

{username:'Pauline Wagu', email:'[email protected]', age:23}

मान लें कि आपके प्रोग्राम को उन सभी छात्रों को लाना है जिनकी उम्र 20 के बराबर है, आप इस तरह एक कोड लिखेंगे...

app.get(‘/:age’, function(req, res){

  db.collections(“students”).find({age: req.params.age});

})

आपने अपने http अनुरोध में एक JSON ऑब्जेक्ट सबमिट किया होगा 

{age: 20}

यह उन सभी छात्रों को लौटाएगा जिनकी आयु अपेक्षित परिणाम के रूप में 20 के बराबर है और इस मामले में केवल {उपयोगकर्ता नाम:'जॉन डॉक्टर', ईमेल:'[email protected]', आयु:20} .

अब मान लें कि एक हमलावर एक नंबर के बजाय एक ऑब्जेक्ट सबमिट करता है यानी {'$gt:0'};

परिणामी क्वेरी होगी:

db.collections("students").find({age:{'$gt:0'}); जो एक मान्य क्वेरी है कि निष्पादन पर उस संग्रह के सभी छात्र वापस आ जाएंगे। हमलावर के पास अपने दुर्भावनापूर्ण इरादों के अनुसार आपके डेटा पर कार्रवाई करने का मौका होता है। ज्यादातर मामलों में, एक हमलावर एक कस्टम ऑब्जेक्ट को इंजेक्ट करता है जिसमें MongoDB कमांड होते हैं जो उन्हें उचित प्रक्रिया के बिना आपके दस्तावेज़ों तक पहुंचने में सक्षम बनाते हैं।

कुछ MongoDB कमांड डेटाबेस इंजन के भीतर Javascript कोड निष्पादित करते हैं, जो आपके डेटा के लिए एक संभावित जोखिम है। इनमें से कुछ कमांड हैं '$where', '$group' और 'mapReduce'। MongoDB 2.4 से पहले के संस्करणों के लिए, Js कोड की क्वेरी के भीतर से db ऑब्जेक्ट तक पहुंच है।

MongoDB नेटिव प्रोटेक्शन

MongoDB अपने प्रश्नों और दस्तावेज़ों दोनों के लिए BSON डेटा (बाइनरी JSON) का उपयोग करता है, लेकिन कुछ मामलों में यह बिना क्रम के JSON और Js एक्सप्रेशन (जैसे कि ऊपर वर्णित) को स्वीकार कर सकता है। सर्वर को दिया गया अधिकांश डेटा एक स्ट्रिंग के प्रारूप में होता है और इसे सीधे MongoDB क्वेरी में फीड किया जा सकता है। MongoDB अपने डेटा को पार्स नहीं करता है, इसलिए संभावित जोखिमों से बचता है जो प्रत्यक्ष मापदंडों के एकीकृत होने के परिणामस्वरूप हो सकते हैं।

यदि किसी एपीआई में प्रारूपित पाठ में डेटा एन्कोडिंग शामिल है और उस पाठ को पार्स करने की आवश्यकता है, तो इसमें सर्वर के कॉलर और डेटाबेस के कैली के बीच असहमति पैदा करने की क्षमता है कि उस स्ट्रिंग को कैसे पार्स किया जा रहा है . यदि डेटा को गलती से मेटाडेटा के रूप में गलत तरीके से व्याख्या किया गया है, तो परिदृश्य संभावित रूप से आपके डेटा के लिए सुरक्षा खतरे पैदा कर सकता है।

MongoDB बाहरी इंजेक्शन के उदाहरण और उन्हें कैसे हैंडल करें

 आइए छात्रों के संग्रह में नीचे दिए गए डेटा पर विचार करें।

{username:'John Doc', password: ‘16djfhg’, email:'[email protected]', age:20},

{username:'Rafael Silver',password: ‘djh’, email:'[email protected]', age:30},

{username:'Kevin Smith', password: ‘16dj’, email:'[email protected]', age:22},

{username:'Pauline Wagu', password: ‘g6yj’, email:'[email protected]', age:23}

$ne (बराबर नहीं) ऑपरेटर का उपयोग करके इंजेक्शन

यदि मैं अनुरोध से प्रदान किए गए उपयोगकर्ता नाम और पासवर्ड के साथ दस्तावेज़ वापस करना चाहता हूं तो कोड होगा:

app.post('/students, function (req, res) {

    var query = {

        username: req.body.username,

        password: req.body.password

    }

    db.collection(students).findOne(query, function (err, student) {

        res(student);

    });

});

अगर हमें नीचे अनुरोध प्राप्त होता है

POST https://localhost/students HTTP/1.1

Content-Type: application/json

{

    "username": {"$ne": null},

    "password": {"$ne": null}

}

क्वेरी निश्चित रूप से इस मामले में पहले छात्र को वापस कर देगी क्योंकि उसके उपयोगकर्ता नाम और पासवर्ड को शून्य नहीं माना जाता है। यह अपेक्षित परिणामों के अनुसार नहीं है।

इसे हल करने के लिए, आप इसका उपयोग कर सकते हैं:

mongo-sanitize मॉड्यूल जो '$' से शुरू होने वाली किसी भी कुंजी को MongoDB क्वेरी इंजन में जाने से रोकता है।

पहले मॉड्यूल स्थापित करें  

​npm install mongo-sanitize

var sanitize = require(‘mongo-sanitize’);

var query = {

username: req.body.username,

password: req.body.password

}

अपने स्कीमा फ़ील्ड को मान्य करने के लिए नेवला का उपयोग करना जैसे कि यदि यह एक स्ट्रिंग की अपेक्षा करता है और एक ऑब्जेक्ट प्राप्त करता है, तो क्वेरी एक त्रुटि फेंक देगी। हमारे मामले में ऊपर शून्य मान एक स्ट्रिंग "" में परिवर्तित हो जाएगा जिसका शाब्दिक रूप से कोई प्रभाव नहीं पड़ता है।

$जहां ऑपरेटर का उपयोग करके इंजेक्शन

यह सबसे खतरनाक ऑपरेटरों में से एक है। यह सर्वर के अंदर ही एक स्ट्रिंग का मूल्यांकन करने की अनुमति देगा। उदाहरण के लिए, उन छात्रों को लाने के लिए जिनकी आयु Y मान से अधिक है, क्वेरी होगी 

var query = { 

   $where: “this.age > ”+req.body.age

}

 db.collection(students).findOne(query, function (err, student) {

        res(student);

    });

सैनिटाइज़ मॉड्यूल का उपयोग करने से इस मामले में मदद नहीं मिलेगी यदि हमारे पास '0; रिटर्न ट्रू' क्योंकि परिणाम उन सभी छात्रों को लौटाएगा, जिनकी उम्र किसी दिए गए मूल्य से अधिक है। अन्य संभावित तार जो आप प्राप्त कर सकते हैं वे हैं '\'; वापसी \ '\' ==\'' या यह ईमेल ===''; वापसी '' ==''। यह क्वेरी केवल उन छात्रों के बजाय सभी छात्रों को लौटाएगी जो इस खंड से मेल खाते हैं।

$जहां क्लॉज से काफी बचना चाहिए। उल्लिखित झटके के अलावा यह प्रदर्शन को भी कम करता है क्योंकि यह इंडेक्स का उपयोग करने के लिए अनुकूलित नहीं है।

$जहां क्लॉज और वेरिएबल MongoDB दायरे में पहुंच योग्य नहीं होंगे, वहां एक फ़ंक्शन पास करने की भी बहुत संभावना है, इसलिए आपका एप्लिकेशन क्रैश हो सकता है। यानी

var query = {

   $where: function() {

       return this.age > setValue //setValue is not defined

   }

}

आप इसके बजाय $eq, $lt, $lte, $gt, $gte ऑपरेटरों का भी उपयोग कर सकते हैं।

मोंगोडीबी बाहरी इंजेक्शन से खुद को सुरक्षित रखना

यहां तीन चीजें हैं जो आप खुद को सुरक्षित रखने के लिए कर सकते हैं...

  1. उपयोगकर्ता डेटा सत्यापित करें। यह देखते हुए कि आपके डेटा तक पहुंचने के लिए $जहां अभिव्यक्ति का उपयोग कैसे किया जा सकता है, यह सलाह दी जाती है कि उपयोगकर्ता आपके सर्वर को जो भी भेजते हैं उसे हमेशा सत्यापित करें।
  2. नेवला मॉड्यूल के साथ अपने स्कीमा को सत्यापित करने के लिए JSON सत्यापनकर्ता अवधारणा का उपयोग करें।
  3. अपने प्रश्नों को इस प्रकार डिज़ाइन करें कि Js कोड की आपके डेटाबेस कोड तक पूर्ण पहुँच न हो।

निष्कर्ष

MongoDB के साथ बाहरी इंजेक्शन भी संभव है। यह अक्सर अमान्य उपयोगकर्ता डेटा के साथ MongoDB प्रश्नों में शामिल होने से जुड़ा होता है। आपके सर्वर द्वारा प्राप्त किए जा सकने वाले किसी भी डेटा का परीक्षण करके NoSQL इंजेक्शन का पता लगाना और उसे रोकना हमेशा महत्वपूर्ण होता है। यदि उपेक्षा की जाती है, तो इससे उपयोगकर्ता डेटा की सुरक्षा को खतरा हो सकता है। सबसे महत्वपूर्ण प्रक्रिया सभी शामिल परतों पर अपने डेटा को सत्यापित करना है।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडीबी $toString

  2. मोंगोडब खोल पर प्रत्येक के लिए अद्यतन करें

  3. Mongodb का उपयोग करके गैर-संबंधपरक डेटाबेस के साथ शुरुआत करना

  4. मोंगोडब नेवला में E11000 डुप्लिकेट कुंजी त्रुटि सूचकांक

  5. समय श्रृंखला डेटाबेस के रूप में MongoDB