Study in Nosql-Injection-Mongodb


السلام عليكم ورحمة الله وبركاتة،



موضوع المقال اليوم عن حقن النو سكيول في قواعد Mongodb
مع بعض الامثله بينها وبين  للتوضيحMysql ,سوف احاول قدر المستطاع ابسط الموضوع مع ذكر اهم الاجزاء في الثغرة.








في البداية ناخذ تعريف عن  NOSQL


 nosql هي قاعدة بيانات ولكن لا تعتمد على لغة محدده في الاستعلام مثل mysql
حيث الاستعلام في mysql يكون ب»لغة "Structured Query Language"
  اما في نظيرتها nosql في mongodb
Document-Oriented language
بحيث انه يقوم بحفظ الوثائق بترميز bson في الجدول المعين او collection من ثم ارسال الطلب من بعدserialzation الى المستخدم سوا كان الترميز 
 content-type json format or html/-text/plain



صوره للتوضيح


 


وهنا فرق json عن bson في ترميز mongodb


 لنفرض وجدنا موقع يطبع ريكوست جيسون ل mongodb 
يحتوي على hello world
mongodb يقوم بقراءه hello world هاكذا
الاختلافات واضحه وصريحه ولكن في تشابه في الية العمل الى حد ما لناخذ امثله mysql+nosql ونقارنهم حتى يتبين 
لنا الية الثغرة

 كما نلاحظ قمنا بوضع قيم داخل table admin في الماي سكيول عن طريق insert into table

لل columns [username,password,id]
 هنا قمنا بالامر نفسه ولكن تختلف الاومر او طرق الاستعلام بالاصح بين القاعديتن

 نقوم بشرح الاساسيات في بعض التعريفات وا الاستعلامات في mongodb





سبب حدوث الثغرة : 



كالعاده عدم الفلتره  المدخل بحيث يستطيع المخترق بتالاعب في المدخل وهنا تحدث الحقنه.

الية وقوع الثغرة
بحكم انه nosql يعتمد على object query
وهنا اساس وقوع الثغرة بحيث لو فرضنا
 لدينا كود يقوم بمقارنه يوزر وا باسورد في القاعدة


من خلال الكود نلاحظ في خانه object
{ }
username: user, password: pass, isActive: true


مدخل اليوزرنيم ومدخل الباسورد 
لم يقم باي فلتره وهنا تكمن الثغرة بحيث لو فرضنا
المدخل الذي هو داخل الاقواس {} "object" استطاع المخترق بالتحكم فيه
يستطيع باضافه operator للobject
حيث operator يقوم بتحديد البيانات داخل القاعده وتعديلها

 اهم ستعلامات  operators









يعني لو فرضنا
{username: user, password: pass, isActive: true}
المدخلات للusername+password
opreator $ne لليوزر نيم والباسورد
 $ne= يطابق جميع القيم الموجوده داخل collection
app.use(require('body-parser').json());
بحكم body-parser محدد للجيسون نرسل الريكسوت بترميز الجيسون هاكذا

يعني لو فرضنا قيمه username داخل القاعده
r3m0t3nu11
وقيمه الباسورد
password00
$ne يقوم بمطابقه اليوزر نيم r3m0t3nu11 وا password00 داخل المتغيرات
وذالك يؤدي الى auth bypass

 في node-js,express
وكذالك في php
 بحكم php driver في mongodb
يقوم بقراءه المدخل [$ne] كا array من ثم ارسالها للقاعدة
مثال


مثال







or
login[$ne]&password[$ne]
login[$regex]=^ first second&password[$regex]=^rest
login=admin&password[$not][$type]=1
login[$gt]=&password[$gt]=

طبعا هاذي التخطيات في node-js وا غيرها في حالة
content-type = url encode /html ,etc...
 اما في حالة content-type = json 

نقوم بارسالها با format json هاكذا مثل ماذكرت في بدايه المقال
اي ان الطلب يصبح هاكذا في القاعدة
gt$ => اكبر من 

طيب لو فرضنا يوزر الادمن والباس في الكوليكشن داخل القاعدة هاكذا



بحيث الاستعلام في القاعدة يكون بتحديد جميع الوثائق"documents" داخل الكوليكشن"admin" وين قيمه username = اكبر من 0 او ١ يعني قيمه اليوزر نيم تتطابق مع احدى اليوزرات داخل الكوليكشن داخل القاعده بكذا تم الدخول للوحة بحيث انه قيمه اليوزر نيم اكبر من 0 = admin value 
access granted


.
logic injection


الان نتوجه الى $where
 تقريبا هي نفس عمليه where clause
في الماي سكيول مثال من الماي سكيول

لو فرضنا لدينا كود يقوم بالاستعلام عن يوزرنيم معين عن طريق opreator
$where

مثال

 الان نريد ان نحقن username  باقيمه صحيحه true بمحاكة الاستعلام ليصبح قيمه صحيح 
في الماي سكيول or 1=1 = true 
 لكن في نو سكيول = or 1==1 
الان نيجي نحاكي الاستعلام
[--] [#] [] [//] [-->] comment to bypass rest of query

 البايلود يكون هاكذا 
والنتيجة

ناخذ مثال
الاستعلام في القاعدة يصبح هاكذا 
query = { $where: `this.username == ''' || 0x1 , this.password == '${password}'` }
بحيث قام بتخطي الاستعلام الاخر للpassword

في المستقبل القريب بأذن الله راح اتعمق اكثر وا اتطرق عن
blind nosql injection
+
SSJS injection

هاذا كل شي ،دمتم  بود.


تعليقات

المشاركات الشائعة من هذه المدونة

Deserialization vulnerability in Node.js RCE

Html code injection-[Post-Get-StoredData!]-

CRLF injection [\r\n Carriage Return]