
در این بخش از دوره آموزشی SEC542 به آشنایی با یکی از حملات معروف در تست نفوذ وب که همان حمله SQL Injection می باشد، خواهیم پرداخت.
معرفی حمله SQL Injection
یکی از معروفترین مباحث حوزه امنیت وباپلیکیشن و از شناخته شده ترین آسیبپذیریهای وباپلیکیشن، آسیبپذیری SQL injection (SQLi) میباشد. اکثر متخصصان امنیت با حملات SQLi آشنا هستند. حتی بسیاری از افرادی که کمتر فنی هستند نیز یک درک نسبی از این آسیبپذیری دارند.
علیرغم محبوبیت این آسیبپذیری در دراز مدت، هنوز هم SQLi در بسیاری از اپلیکیشنهای مدرن و قدیمی دیده میشود.
خاستگاه حمله SQL injection
تابحال رایجترین نحوه ذخیره دیتا در یک اپلیکیشن، استفاده از دیتابیسهای رابطهای مبتنی بر SQL بوده است. اپلیکیشنها برای ذخیره اطلاعات خود، بطور مداوم از دیتابیسهای رابطهای (SQL) استفاده میکنند. ارتباط وباپلیکیشن با ذخایره دادهای، اغلب برای بازیابی، رندر، افزودن یا ویرایش دیتا برقرار میشود.
گاهی اوقات ارتباطات دیتابیس تحت تاثیر کاربران اپلیکیشن قرار میگیرد. این مسئله، امری طبیعی بوده و نشانگر وجود آسیبپذیری SQL injection در اپلیکیشن نیست. آسیبپذیری زمانی ایجاد میشود که اپلیکیشن اجازه میدهد ورودی کنترل نشده کاربر در کوئریهای ساخته شده SQL بنشیند و به پایگاهداده ارسال شود.
دیتابیسهای رابطه ای
استفاده از واژه “پایگاه داده” بسیار بیشتر از “دیتابیس رابطهای” است. به همین علت، ممکن است فکر کنید که استفاده از دیتابیسهای رابطهای منسوخ شده است. اما اشتباه میکنید.
استفاده از دیتابیسهای رابطهای به همراه اکوسیستم پشتیبانی کننده آنها، که همان RDBMS (Relational Database Management Systems) است، روز به روز درحال رشد است.
اگرچه ما SQL injection را در معنای کلی خود بررسی میکنیم، اما در واقعیت، جنبههای متعددی از SQLi وجود دارد که هر یک به نوع RDBMS مورد استفاده بستگی دارد (مثلا Oracle Database ، MySQL ، MS SQL Server و غیره). این بستگی در زمان انتخاب تکنیکهای exploit و post-exploit اهمیت بیشتری مییابد.
دستورات کلیدی SQL
برای شروع، نیاز داریم تا کمی با SQL آشنا شویم. در این مسیر بر روی جزئیاتی که ارائه دهندگان دیتابیس را متمایز میسازد، تمرکز نخواهیم داشت. هدف اصلی این بخش این است که مطمئن شویم همگی با مفاهیم اولیه آشنایی داشته و میتوانیم به ادامه بحث بپردازیم.
در زیر، رایجترین دستوراتی که توسط RDBMS های مختلف پشتیبانی میشوند، آورده شده است:
SELECT – رایجترین دستور، دریافت دیتا از یک جدول
INSERT – افزودن دیتا به جدول
UPDATE – ویرایش دیتای موجود
DELETE – حذف دیتا از یک جدول
DROP – حذف یک جدول
UNION – ترکیب دیتای حاصل از چند کوئری
SQL Query Modifiers
در این بخش، لیست کوتاهی از آیتمهایی با نام SQL query modifiers را میبینید که اغلب برای اعمال تغییر در نتایج دستورات SQL استفاده میشوند. پراستفادهترین آنها عبارتند از:
WHERE – فیلتر کوئری SQL به نحوی که تنها در صورت برقرار بودن یک شرط نتیجه بازگردانده شود.
AND/OR – با شرط WHERE ترکیب شده تا کوئری را محدودتر کند.
LIMIT #1,#2 – از ردیف شماره #1 شروع کن و تعداد #2 ردیف را برگردان.
ORDER BY # – بر اساس ستون # مرتب کن.
شرط WHERE همه جا وجود دارد. در واقع این شرط جایی است که معمولا در آن SQL injection پیدا میشود زیراکه ورودی در این عبارت قرار میگیرد.
انواع دادههای مهم SQL
برخلاف دستورات و modifier هایی که گفته شد، RDBMS ها در اشاره به انواع دادهها، اختلافات زیادی با هم دارند. با این حال، فارغ از نحوه نامگذاری، همه آنها این انواع داده را میشناسند.
نامی که افراد با آن بیشترین مشکل را دارند، نام varchar است. ما میتوانیم به عنوان یک رشته ساده به آن نگاه کنیم. رشتهها و اعداد از تایپهایی هستند که بیشترین استفاده را از آنها خواهیم داشت. در ادامه راجع به این انواع داده بیشتر صحبت خواهیم کرد.
برخی از نوع دادههای مهم SQL در زیر نشان داده شدهاند:
bool – Boolean True/False
int – Integer
char – Fixed length string
varchar – Variable length string
binary
کاراکترهای خاص SQL
از اینجا به بعد مطالب کم کم جالب و مرتبط با بحث اصلی میگردد. در جدول زیر بعضی از کاراکترهای خاص SQL را مشاهده میکنید. همانطور که میبینید برای برخی از آیتمها مانند کامنت و اپراتورهای جمع رشته، چندین گزینه وجود دارد. این بدان معناست که در RDBMS های مختلف، کاراکترهای خاص متفاوت هستند. گرچه در برخی از RDBMS ها، چندین کاراکتر با معنای یکسان نیز وجود دارد.

مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.