NoSQL injection
زمان مطالعه :5 دقیقه
NoSQL injection, Types of NoSQL injection, NoSQL syntax injection
NoSQL injection
NoSQL injection | Web Security Academy (portswigger.net)
تزریق NoSQL یک آسیبپذیری است که در آن مهاجم میتواند با Queryهایی که یک برنامه به یک پایگاه داده NoSQL ارسال میکند، دخالت کند. تزریق NoSQL ممکن است به مهاجم امکان دهد تا:
احراز هویت یا مکانیزمهای حفاظتی را دور بزند.
دادهها را استخراج یا ویرایش کند.
موجب ایجاد سرویسدهی محروم (Denial of Service) شود.
کد را بر روی سرور اجرا کند.
پایگاههای داده NoSQL دادهها را به فرمت دیگری به جز جداول رابطهای سنتی SQL ذخیره و بازیابی میکنند. آنها از زبانهای Query متنوعی به جای استاندارد جهانی مثل SQL استفاده میکنند و دارای محدودیتهای رابطهای کمتری هستند.
اطلاعات بیشتر
برای اطلاعات بیشتر در مورد پایگاههای داده NoSQL و تفاوتهای آنها با پایگاههای داده SQL، به NoSQL databases مراجعه کن
Types NoSQLinjection
دو نوع مختلف از تزریق NoSQL وجود دارد:
Syntax injection- این اتفاق زمانی رخ میدهد که میتوانید Query NoSQL SYNTAX را بشکنید و به شما امکان تزریق Payload خود را میدهد. روش این کار مشابه با SQL Injection است. اما ماهیت حمله به طور قابل توجهی متفاوت است، زیرا پایگاههای داده NoSQL از زبانهای Query مختلف، انواع Query SYNTAX و ساختارهای داده متفاوت استفاده میکنند.
Operator injection- این زمانی اتفاق میافتد که میتوانید از عملگرهای Query NoSQL برای دستکاری Queryها استفاده کنید.
در این موضوع، ابتدا به نحوه تست برای آسیبپذیریهای NoSQL به طور کلی نگاه خواهیم کرد و سپس بر روی بهرهبرداری از آسیبپذیریها در MongoDB، که محبوبترین پایگاه داده NoSQL است، تمرکز خواهیم کرد. همچنین برخی از آزمایشگاهها را ارائه دادهایم تا بتوانید آنچه را که یاد گرفتهاید تمرین کنید.
NoSQL syntax injection
شما میتوانید پتانسیل آسیبپذیریهای تزریق NoSQL را با تلاش برای شکستن Query SYNTAX شناسایی کنید. برای انجام این کار، هر ورودی را به صورت سیستماتیک با ارسال رشتههای Fuzz و کاراکترهای ویژه که یک خطای پایگاه داده یا برخی رفتارهای قابل تشخیص دیگر را ایجاد میکنند اگر به درستی Sanitized یا فیلتر نشده باشند، تست کنید.
اگر زبان API پایگاه داده هدف را میدانید، از کاراکترهای ویژه وstrings Fuzz استفاده کنید که مربوط به آن زبان هستند. در غیر این صورت، از مجموعهای از strings Fuzz برای هدف قرار دادن چندین زبان API استفاده کنید.
Detecting syntax injection in MongoDB
یک برنامه خرید را در نظر بگیرید که محصولات را در دستهبندیهای مختلف نمایش میدهد. زمانی که کاربر دستهبندی نوشابههای گازدار را انتخاب میکند، مرورگر آنها URL زیر را درخواست میکند:
https://insecure-website.com/product/lookup?category=fizzy
این باعث میشود که برنامه یک Query JSON برای بازیابی محصولات مرتبط از مجموعه محصولات در پایگاه داده MongoDB ارسال کند:
this.category == 'fizzy''
برای تست اینکه آیا ورودی ممکن است آسیبپذیر باشد، یک string Fuzz را در مقدار پارامتر category ارسال کنید. یک string نمونه برای MongoDB به شرح زیر است:
'"`{ ;$Foo} $Foo \xYZ
از این Fuzz string برای ساختن حمله زیر استفاده کنید:
اگر این باعث تغییر از پاسخ اصلی شود، ممکن است نشان دهد که ورودی کاربر به درستی فیلتر یا Sanitized نشده است.
توجه
آسیبپذیریهای تزریق NoSQL میتوانند در زمینههای مختلفی رخ دهند و شما بایدstrings Fuzz خود را بر این اساس تطبیق دهید. در غیر این صورت، ممکن است به سادگی خطاهای اعتبارسنجی را تحریک کنید که باعث میشود برنامه هرگز Query شما را اجرا نکند.
در این مثال، ما fuzz stringرا از طریق URL تزریق میکنیم، بنابراین رشته URL-encoded شده است. در برخی از برنامهها، ممکن است نیاز داشته باشید که Payload خود را از طریق یک خصوصیت JSON تزریق کنید. در این حالت، این Payload به صورت '"`{\r;$Foo}\n$Foo \xYZ\u0000 تبدیل میشود.
Determining which characters are processed
برای تعیین اینکه کدام کاراکترها به عنوان نحو توسط برنامه تفسیر میشوند، میتوانید کاراکترهای فردی را تزریق کنید. به عنوان مثال، میتوانید ' را ارسال کنید که منجر به Query MongoDB زیر میشود:
this.category == '''
اگر این باعث تغییر از پاسخ اصلی شود، ممکن است نشان دهد که کاراکتر ' QUERY SYNTAXرا شکسته و باعث خطای SYNTAXشده است. میتوانید این را با ارسال یک رشته Query معتبر در ورودی تأیید کنید، به عنوان مثال با escaping نقل قول:
this.category == '\''
اگر این باعث خطای SYNTAXنشود، ممکن است به این معنی باشد که برنامه در برابر حمله تزریقی آسیبپذیر است.
Confirming conditional behavior
پس از شناسایی یک آسیبپذیری، مرحله بعدی تعیین این است که آیا میتوانید شرایط منطقی را با استفاده از NoSQL SYNTAX تحت تأثیر قرار دهید.
برای تست این موضوع، دو درخواست ارسال کنید، یکی با یک شرط غلط و یکی با یک شرط صحیح. به عنوان مثال میتوانید از عبارات شرطی ' && 0 && 'x و ' && 1 && 'x به صورت زیر استفاده کنید:
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+0+%26%26+'x
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+1+%26%26+'x
اگر برنامه به شکل متفاوتی رفتار کند، این نشان میدهد که شرط غلط بر منطق Query تأثیر میگذارد، اما شرط صحیح نمیدهد. این نشان میدهد که تزریق این سبک ازSYNTAX بر یک SIDE_SERVER Query تأثیر میگذارد.
Overriding existing conditions
اکنون که شناسایی کردهاید که میتوانید شرایط منطقی را تحت تأثیر قرار دهید، میتوانید تلاش کنید شرایط موجود را برای بهرهبرداری از آسیبپذیری لغو کنید. به عنوان مثال، میتوانید یک شرط JavaScript که همیشه به true ارزیابی میشود را تزریق کنید، مانند '||1||':
https://insecure-website.com/product/lookup?category=fizzy%27%7c%7c%31%7c%7c%27
این منجر به Query MongoDB زیر میشود:
this.category == 'fizzy'||'1'=='1'
از آنجا که شرط تزریق شده همیشه true است، Query تغییر یافته همه موارد را بازمیگرداند. این به شما امکان میدهد همه محصولات در هر دستهبندی را مشاهده کنید، از جمله دستهبندیهای مخفی یا ناشناخته.
هشدار
هنگام تزریق یک شرط که همیشه به true ارزیابی میشود به یک Query NoSQL دقت کنید. اگرچه این ممکن است در زمینه اولیهای که تزریق میکنید بیضرر باشد، اما برنامهها معمولاً دادههای یک درخواست را در چندین Query مختلف استفاده میکنند. اگر برنامهای از آن هنگام بهروزرسانی یا حذف دادهها استفاده کند، به عنوان مثال، این میتواند منجر به از دست دادن تصادفی دادهها شود.
همچنین میتوانید یک کاراکتر null را بعد از مقدار دستهبندی اضافه کنید. MongoDB ممکن است تمام کاراکترها بعد از یک کاراکتر null را نادیده بگیرد. این به این معنی است که هر شرایط اضافی در Query MongoDB نادیده گرفته میشود. برای مثال، Query ممکن است دارای محدودیت اضافی this.released باشد:
this.category == 'fizzy' && this.released == 1
محدودیت this.released 1 برای نمایش فقط محصولاتی که منتشر شدهاند استفاده میشود. برای محصولات منتشر نشده، احتمالاً this.released 0 است.
در این حالت، یک مهاجم میتواند حملهای به شکل زیر انجام دهد:
https://insecure-website.com/product/lookup?category=fizzy'%00
این منجر به Query NoSQL زیر میشود:
this.category == 'fizzy'\u0000' && this.released == 1
اگر MongoDB تمام کاراکترها بعد از کاراکتر null را نادیده بگیرد، این نیاز به تنظیم مقدار فیلد released به 1 را حذف میکند. در نتیجه، تمام محصولات در دستهبندی fizzy نمایش داده میشوند، از جمله محصولات منتشر نشده.
فادیا مرادنژاد
مشاهده مقاله های بیشتر
مقالات مرتبط
NoSQL operator injection & Exploiting syntax injection to...
زمان مطالعه :5 دقیقه
Timing based injection, Preventing NoSQL injection & NoSQL databases, NoSQL database models
زمان مطالعه :5 دقیقه
Exploiting syntax injection to extract data, Exploiting NoSQL operator injection to extract data &...
زمان مطالعه :5 دقیقه