منظور از SQL Injection چیست؟

چطور آسیب‌پذیری SQL Injection را شناسایی کنیم؟

معرفی SQL Injection به عنوان یک حمله سایبری

SQL مخففِ Structured Query Language است و به زبان استانداردی اشاره دارد که برای ارسال درخواست در پایگاه داده ها و دریافت اطلاعات مورد استفاده قرار می گیرد. لازم به ذکر است با ارسال درخواستی که به موتورهای جستجو مانند Google یا Bing ارسال می شود، تفاوت دارد.

SQL Injection نوعی حمله سایبری است که طیِ آن، مجرمان سعی می کنند از آسیب پذیری های موجود در کد اپلیکیشن ها، اکسپلویت کنند. آن ها این کار را با قرار دادنِ یک SQL query در فیلدهای یک فرم معمولی، مانند نام کاربری و پسورد انجام می دهند. وقتی اپلیکیشن مورد نظر، این ورودی ها را پردازش می کند، به طور ناخواسته اجرا نموده و اجازه ی دسترسی غیر مجاز به داده ها یا سایر اقدامات مخرب در پایگاه داده ها صادر می شود. این یک خطر امنیتی جدی است که توسعه دهندگان و سازمان ها برای محافظت از سیستم ها و داده های خود باید در مقابل آن ایمن شوند.

حملات SQL injection زمانی با موفقیت پیش می روند که فرم ورودیِ تحت وب به دستوراتِ SQL ایجاد شده توسط کاربر، اجازه می دهد به دیتابیس دست پیدا کرده و درخواست خود را مستقیما ارسال کنند. این دسته از تهدیدات به ویژه زمانی مشکل ساز می شوند که یک پایگاه مشترک برای تعداد فراوانی از کدها وجود داشته باشد، مانند پلاگین های ورودپرس. در این صورت می تواند  بر صدها هزار وب سایت که از آن کد اشتراکی استفاده می کنند، تاثیر بگذارد. به همین دلیل است که بهترین روش های امنیتی مانند input validation و parameterized queries برای جلوگیری از حملات SQL injection و محافظت از اپلیکیشن های تحت وب، بسیار مهم و حیاتی می باشد.

آسیب پذیری های ناشی از  SQL injection، بسیار جدی هستند. مهاجمی که مهارت بالایی در زمینه ی SQL داشته باشد، می‌تواند از اپلیکیشن های آسیب‌پذیر مبتنی بر وب، بدون اعتبارسنجی در بخش input ، به داده های مورد نظر خود دسترسی پیدا نموده و یا دیتابیس را کنترل نماید.

 

SQL Query چیست؟

به طور کلی queryها برای یافتنِ داده های خاص بر اساس معیارهای تعیین شده توسط کاربر، مورد استفاده قرار می گیرند. SQL یکی از چندین زبانی است که برای مدیریت پایگاه داده ها در اپلیکیشن های مختلف مورد استفاده قرار می گیرد. اعم از اپلیکیشن هایی که به صورت داخلی در یک سازمان به کار گرفته می شوند و همین طور اپلیکیشن هایی که برای عموم طراحی شده و در فضای اینترنت، منتشر می گردند. بنابراین SQL queryها علاوه بر یافتنِ داده ها، در انجام محاسبات و پردازش، خلاصه کردنِ اطلاعات و همین طور خودکارسازیِ وظایف کاری کاربرد دارند.

 

انواع SQL injection

  • In-band SQLi

In-band SQLi یک نوع حمله سایبری رایج است که به سادگی و کارایی بالای آن شناخته شده است. این روش به دو نوع تقسیم می شود: error-based و  union-based

 

  • Error-based SQLi

مهاجمان سایبری، اقدام به وارد کردنِ SQL queryها می کنند تا پیام های خطا توسط دیتابیس برگردانده شود. به این ترتیب پیام های خطا، به طور ناخواسته اطلاعاتی را در مورد ساختار پایگاه داده نشان می دهند.

 

  • UNION-based SQLi

در این نوع حمله، با استفاده از اپراتور UNION SQL، query مخرب با query معتبر، ادغام شده تا یک پاسخ تحت Hypertext Transfer Protocol (HTTP) دریافت شود. سپس مهاجمان به سرنخ های ارزشمندی در مورد محتوای پایگاه داده ها دست پیدا می کنند

 

  • Inferential (Blind) SQLi

مهاجمان در حملات inferential SQLi یا blind SQLi، پس از ارسال درخواست یا query کردنِ پایگاه داده ها، رفتار سرور را مورد بررسی قرار می دهند تا به اطلاعات لازم در مورد ساختار دیتابیس دست یابند. این حملات با سرعت آهسته تری، پیش می روند اما به اندازه ی سایر تهدیدات SQLi، آسیب می زنند. این دسته از تهدیدات به دو نوع تقسیم می شوند: Boolean و time-based.

 

  • Booléen

در این روش، مهاجم، پس از query کردنِ دیتابیس، به مطالعه ی پاسخ HTTP می پردازد. تغییر کردن و یا ثابت ماندن پاسخ، می تواند درست یا نادرست بودن نتیجه را تعیین کند.

 

  • Time-based

همان طور که از نامش مشخص است، آنچه که مورد بررسی و مطالعه قرار می گیرد، زمانِ پاسخِ یک نتیجه ی query بر حسب ثانیه است. درست مانند boolean، مهاجم، پاسخِ HTTP را به دقت بررسی می کند تا درست یا نادرست بودنِ یک query را تعیین کند.

 

  • Out-of-band SQLi

یک مورد خاصِ SQLi است که به روش های سنتی بررسی پیام های خطا یا پاسخ های HTTP متکی نیست. تنها در صورتی می تواند کار کند که ویژگی های خاصی از سرور دیتابیس توسط اپلیکیشن ها، فعال گردد. در واقع جایگزینی برای تکنیک های in-band و inferential است. در حمله  Out-of-band SQLi مهاجم انتظار دارد که سرور، در نتیجه ی SQL statementهای inject شده، درخواست های DNS یا HTTP ایجاد کند. سپس مهاجم می تواند با نظارت بر این درخواست های خارجی، بدون query کردنِ مستقیم دیتابیس، داده هایی مانند نام کاربری و پسورد را استخراج کند. این یک رویکرد مخفیانه تری است و دفاع در برابر این حملات مستلزم اقدامات امنیتی جامع می باشد.

 

نمونه هایی از SQL Injection (SQLi)

یک SQL injection قادر است با هدف اکسپلویت از طریق آسیب پذیری هایی که در دیتابیس اپلیکیشن ها وجود دارد، SQL query  را دستکاری کند. در اینجا با هم به چند نمونه کد نگاهی می اندازیم تا با نحوه عملکردشان آشنا شویم:

یک SQL database query معمولی برای یک اپلیکیشنِ e-commerce می تواند به شکل زیر باشد:

SELECT ProductName, ProductDescription
FROM Products
WHERE ProductNumber = ProductNumber

به عبارتی این SQL query مانند این است که از پایگاه داده خواسته شود نام و توضیحات محصولی را از جدول مربوطه ارائه بدهد که در آن شماره محصول با مقدار خاصی مطابقت داشته باشد. حالا اگر SQL injection اتفاق بیفتد، می تواند دسترسی غیر مجاز به داده ها یا دستکاری دیتابیس رخ دهد.

به عبارتی چنانچه مهاجم قصد داشته باشد از طریق SQL injection attack به نام و توضیحاتِ محصولات در پایگاه داده ها دسترسی داشته باشد، URL مربوط به فرم وب را با افزودن کدِ دستکاری شده خود، تغییر می دهد تا به داده ها دست پیدا کند. در این صورت مهاجم برای ورودی در بخش product ID، ۹۹۹ or 1=1 را وارد می کند. در این صورت database query، اطلاعات و توضیحاتِ همه محصولات و همین طور روش های دور زدن محدودیت ها را ارائه می دهد. در واقع SQL query به قرار زیر خواهد بود:

 

SELECT ProductName, ProductDescription
FROM Products
WHERE ProductNumber = 999 OR 1=1

 

اگر مهاجم در نظر داشته باشد که کل دیتابیس را delete کند، می تواند از کاراکترهایی که به غلط فیلتر شده اند، استفاده کند. به عبارتی دستورِ DROP TABLE را بعد از شناسه محصول (به عنوان مثال ۹۹۹) قرار داده و مهاجم SQL query را دستکاری می کند:

SELECT ProductName, ProductDescription
FROM Products
WHERE ProductNumber = 999; DROP TABLE USERS

 

در نتیجه، کل پایگاه داده ی کاربر حذف خواهد شد.

 

چطور می توان از آسیب پذیری SQL Injection (SQLi) جلوگیری نمود؟

 

  • Sanitization

چنانچه اپلیکیشن مورد نظر ما، این قابلیت را داشته باشد که تغییراتِ ایجاد شده توسط مهاجمان را  بپذیرد، پس بهتر است سریعا گزینه های ورودی برای محافظت از داده ها، محدود شوند. توسعه دهندگان اپلیکیشن ها، از input validation یا sanitization استفاده می کنند تا مطمئن شوند که تنها ورودی های ایمن، مجاز هستند و ورودی هایی که مطابقت نداشته باشند، رد می شوند. کاربرانِ وب با این روش، آشنایی کامل دارند. به عنوان مثال زمانی که از آن ها خواسته می شود رمز عبوری را ایجاد کنند، باید تعداد کارکتر مشخصی داشته باشد و حداقل شامل یک کارکتر خاص باشد.

 

  • Filtering and Validation

سازمان ها می توانند برای جلوگیری از حملات SQLi  و  مسدود کردن تهدیدات احتمالی، web application firewall (WAF) را به کار گیرند. این فایروال قادر است ورودی‌های یک اپلیکیشن را در برابر لیستی از الگوهای مخربِ شناخته شده بررسی کند و SQL query های مخرب را متوقف نماید. ضمن اینکه برای همگام شدن با تهدیدات جدید، لیست مربوطه به طور مرتب به روز رسانی شده و در برابر خطرات امنیتی در حال تحول محافظت می کند.

 

  • Limiting the Scope of SQL Commands

با اینکه فیلتر کردن برای SQLi، ضروری است، اما مسدود کردنِ کاملِ SQL queryها، امکانپذیر نیست. برخی افراد مانند کارشناسان امنیتی، برای آزمایش اپلیکیشن ها، دلایل قانونی دارند. این در حالی است که فایروال وب اپلیکیشن (WAF) می تواند قبل از مسدود کردن درخواست ها، ورودی را با داده های Internet Protocol (IP) مطابقت دهد.

 

چطور می توان از پارامترهای نا ایمنِ URL دوری کرد؟

در صورتی که یک وب سایت، استفاده از پروتکل Hypertext Transfer Protocol Secure (HTTPS را در دستور کار خود قرار ندهد، مهاجمان می توانند با دستکاریِ کوکی ها با SQLi، به پایگاه داده ها دسترسی پیدا کنند. بنابراین سازمان ها می بایست، وب سایت ها و وب اپلیکیشن های خود را به طور کامل ایمن سازند.

 

نقش فورتی نت در جلوگیری از تهدیدات SQL injection

فورتی نت، راهکار WAF خود را در قالب FortiWeb ارائه داده و به این ترتیب از سازمان ها و وب اپلیکیشن های آن ها در برابر تهدیدات شناخته شده و همین طور تهدیدات zero-day محافظت می کند. با به روز شدنِ اپلیکیشن ها به قابلیت های جدید و همین طور، اضافه شدن دسترسیِ کاربران جدید، سطح حملات افزایش می یابند. FortiWeb راهکاری است که سازمان ها را در این مسیرِ تغییر و تکامل، همراهی می کند.

قابلیت هایی مانند Machine-Learning (ML) در فورتی وب، تعبیه شده تا سازمان ها بتوانند محافظت از هر اپلیکیشن را به صورت جداگانه، سفارشی سازی کنند. علاوه بر این، قابلیت ML می تواند بین موارد مشکوک و نرمال، تمایز قائل شود تا مثبت های کاذب را به حداقل برساند.