Study in Nosql-Injection-Mongodb
موضوع المقال اليوم عن حقن النو سكيول في قواعد Mongodb
مع بعض الامثله بينها وبين للتوضيحMysql ,سوف احاول قدر المستطاع ابسط الموضوع مع ذكر اهم الاجزاء في الثغرة.
في البداية ناخذ تعريف عن NOSQL
nosql هي قاعدة بيانات ولكن لا تعتمد على لغة محدده في الاستعلام مثل mysql
حيث الاستعلام في mysql يكون ب»لغة "Structured Query Language"
اما في نظيرتها nosql في mongodb
حيث الاستعلام في 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 ونقارنهم حتى يتبين
لنا الية الثغرة
بحيث انه يقوم بحفظ الوثائق بترميز 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]
هنا قمنا بالامر نفسه ولكن تختلف الاومر او طرق الاستعلام بالاصح بين القاعديتن
سبب حدوث الثغرة :
كالعاده عدم الفلتره المدخل بحيث يستطيع المخترق بتالاعب في المدخل وهنا تحدث الحقنه.
الية وقوع الثغرة
بحكم انه nosql يعتمد على object query
وهنا اساس وقوع الثغرة بحيث لو فرضنا
لدينا كود يقوم بمقارنه يوزر وا باسورد في القاعدة
من خلال الكود نلاحظ في خانه object
{ }
username: user, password: pass, isActive: true
يعني لو فرضنا
{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
بحكم انه 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
هاذا كل شي ،دمتم بود.
تعليقات
إرسال تعليق