در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به مبحث آشنایی با NoSQL Database می پردازیم.
NoSQL Database : Definition
هیچ تعریف مشخصی از پایگاهداده NoSQL وجود ندارد. در عوض، پایگاههای داده NoSQL احتمالا به بهترین شکل با این حقیقت که آنها پایگاههای داده SQL نیستند، تعریف میشوند. SQL یک زبان پرس وجوی عمومی است که طیف وسیعی از ویژگیها را فراهم میکند.
به طور سنتی، پایگاههای داده SQL پایگاههای داده “رابطهای” هستند که دادهها را در جداول سازماندهی میکنند و اجازه میدهند که این جداول از طریق کلیدهای مشترک با یکدیگر مرتبط باشند. علاوه بر این، بسیاری از پایگاههای داده SQL از تراکنش پشتیبانی نموده و یکپارچگی دادهها را به شدت ارزیابی میکنند.
پایگاههای داده NoSQL اغلب به گونهای طراحی شدهاند که تنها در شبکههای مورد اعتماد یا از طریق Loopback Interface مورد استفاده قرار گیرند. به عنوان مثال، راهنمای Redis میگوید: “Redis برای دسترسی توسط کلاینت مورد اعتماد در محیطهای مورد اعتماد طراحی شدهاست”. در نتیجه، ویژگیهای احراز هویت و کنترل دسترسی محدود هستند. اگر ویژگیهای احراز هویت ارائه شوند، احراز هویت اغلب در ساختار Cleartext اتفاق میافتد.
بسیاری از پایگاهدادههای NoSQL از طریق کتابخانههای استاندارد، ارتباط مبتنی برTLS را فراهم میکنند.
با تمرکز قوی بر سرعت و تاخیر کم، بسیاری از پایگاههای داده NoSQL ویژگیهای خاصی را برای رمز گذاری دادهها در سیستم (Data at Rest) فراهم نمیکنند.
شما میتوانید از یک سیستم فایل رمزگذاری شده استفاده کنید که در اکثر موارد کار خواهد کرد (اما نه برای پایگاهدادههای درون حافظه مانند memcached). رمزگذاری مبتنی بر دیسک تنها حفاظت محدودی را در برابر حملات خاص پایگاهداده فراهم میکند.
Databases
برای سنجش اینکه پایگاهداده NoSQL تا چه حد پیش رفتهاست، فقط به رتبهبندی جهانی نگاه کنید که توسط dbengines.com/en/ranking ارائه میشود.
سه مورد از ۱۰ پایگاهداده برتر، رابطهای نیستند و از SQL استفاده نمیکنند.MongoDB به طور مداوم در ۴ یا ۵ رتبه برتر در چند سال گذشته قرار دارد. به همین دلیل، ما در بحث خود در مورد حملات تزریق NoSQL بر MongoDB تمرکز خواهیم کرد.
رتبه های 11 تا 20 نیز به صورت زیر می باشد:
mongodb
MongoDB یک پایگاهداده سند محور است. به جای استفاده از پایگاههای دادهای مانند Oracle،Microsoft SQL Server و MySQL،MongoDB از یک پرس وجوی فرمت NoSQL در پیامهای شبیه JSON استفاده میکند. زبان دقیق پرس و جو که از MongoDB استفاده میکند، BSON یا Binary JSONنامیده میشود.
این متفاوت از یک پایگاهداده رابطهای است که در آن طرحها پویا هستند و می توان آنها را براساس تقاضا تغییر داد. واقعیت جالب دیگر BSON و برخی دیگر از پرس وجوهای مبتنی بر JSONپایگاه های داده NoSQL قابلیت گنجاندن توابع JavaScript در خود پرس وجوها است. اگرچه این میتواند برای یک توسعه دهنده قدرتمند باشد، اما اگر در معرض یک مهاجم قرار گیرد میتواند خطرناک باشد.
Understanding How NoSQL Works
زبان پرس وجوی ساختاریافته یا همان SQLمعمولا در پایگاههای داده استاندارد استفاده میشود. یک پایگاهداده استاندارد از ردیفها و جداول تشکیل شدهاست و مطابق با ACID(Atomicity, Consistency, Isolation and Durability) در نظر گرفته شدهاست.
ACID اساسا به این معنی است که ثبات را حفظ میکند حتی اگر ثبات، مقیاس پذیری بانکداده را محدود کند. زمانی که شما یک Query را در یک پایگاهداده رابطهای جست وجو میکنید، همیشه نتایج یکسانی به دست میآورید، حتی اگر زمان زیادی طول بکشد تا Query کامل شود.
NoSQL شامل جفت مقادیر کلیدی است، که در MongoDB به آن document گفته شده و در Riak تحت عنوان buckets نامگذاری میشود. دیتابیس های NoSQL سازگار با BASE در نظر گرفته میشوند. اساسا BASE که برگرفته از Basically Available, Soft State, Eventually Consistent می باشد.
یک مثال خوب این است که به نتایج جست و جو از یک پایگاهداده NoSQL نگاه کنید (مانند Gmail یا جستجوی گوگل). Refresh کردن همان جستجو یا پیشرفت در صفحات پاسخ معمولاً منجر به تغییر مداوم کل نتایج جستجو می شود. دادهها همه آنجا هستند، فقط بسته به عملیاتی که درخواست میشود، همیشه 100٪ در دسترس نیست.
Reference
برای آشنایی بیشتر با ACID و BASE به لینک زیر مراجعه نمایید:
queue.acm.org/detail.cfm?id=1394128
NoSQL vs SQL
این مثالی از MySQL در مقابل MongoDB است. هر پایگاهداده NoSQL مانند MongoDB عمل یا رفتار نمیکند، اما شما باید برخی از تفاوتهای نحوی بین هر کدام را درک کنید.
برای مثال MongoDB مفهومی به شکل یک جدول را ندارد. شما میتوانید مجموعهای از کاربران را ایجاد کنید، اما اغلب شما در حال ایجاد اسناد کاربری منحصر به فرد در داخل Mongo هستید. به این ترتیب هیچ معادلی برای ایجاد یک جدول وجود ندارد.
Mongodb NoSQL Injection
نشان دادن تفاوتهای ظریف بین SQL و NoSQL بسیار مهم است، زیرا به اندازه ای نیست که در برابر تزریق SQL نفوذ ناپذیر باشد، بلکه مستعد تزریق یک کلاس متفاوت است. تزریق در NoSQL نیز امکان پذیر است اما متفاوت از تزریق SQL سنتی میباشد که به زبان SQL برای وارد کردن رکوردها یا ردیفهای جدید یا استخراج محتویات از یک پایگاهداده متکی است.
از نظر مفهومی، هر دو حمله تزریق هستند و میتوانند تاثیر یکسانی داشته باشند ولی تزریق SQL و تزریق NoSQL تا حدودی متفاوت انجام میشوند.
Operator ها و Clause هایی مانند $where، $gt، $lt و $ne را می توان برای ایجاد پرس و جو در این پایگاههای داده استفاده کرد.
Mongodb Fuzzing
مجموعههای کمی از رشتهها برای تزریق در NoSQL وجود دارد که نمونه هایی از آن در لینک زیر قرار داده شده است:
github.com/fuzzdb-project/fuzzdb/blob/master/attack/no-sql-injection/mongodb.txt
NoSQL Injection Methodology
روش شناسایی و بهرهبرداری از آسیبپذیریهای تزریق NoSQL بسیار شبیه به بسیاری از حملات تزریق دیگر است و شباهت قابلتوجهی با تزریق SQL دارد. اگر خطاهای پایگاهداده AND / OR دادهها به مرورگر بازنگردند، احتمال وجود تزریق کور NoSQL نیز میباشد. همانند مدلهای مختلف حملات تزریق کور، امکان انجام حمله از طریق کانالهای جانبی نیز وجود دارد.
مراحل به شرح زیر است:
یک درخواست پایه با پارامترهای معتبر را ارسال کنید که با موفقیت توسط برنامه پردازش شود و پاسخ آن را یادداشت کنید.
سپس توالیهای نامعتبر از کاراکترها را ارسال میکنیم تا پایگاه داده دچار خطا شده و آن را به کلاینت بازگرداند.
سه نوع اصلی تزریق NoSQL وجود دارد که در مقابل MongoDB موفق هستند.
• Query operator ها که به ما اجازه میدهند منطق پرس و جو را تغییر دهیم.
• Query های مبتنی بر Union یا Stack، که به ما اجازه میدهد تا یک جستجوی اضافی را اجرا کنیم.
• جاوا اسکریپت که همه انواع امکانات جالب را ممکن میسازد.
با فهرستی از رشتههای فازی که هر یک از موارد بالا را انجام میدهند، میتوانیم حملاتی مانند Authentication Bypass، دستکاری دادهها، Data Exfiltration، یا حذف را انجام دهیم.
NoSQL Injection Projects
تعدادی ابزار برای کمک به شناسایی و بهرهبرداری از تزریق NoSQL وجود دارد؛