حمله SQL Injection چیست؟
SQL injection، که بهعنوان حمله SQLI نیز شناخته میشود، یک بردار حمله رایج است که از کد SQL مخرب برای دستکاری پایگاه داده و دسترسی به اطلاعاتی استفاده میکند که نباید نمایش داده شوند. این اطلاعات ممکن است شامل هر تعداد دادههای حساس شرکت، لیست کاربران یا جزئیات مشتری خصوصی باشد. درواقع یک آسیبپذیری امنیتی وب است که به مهاجم اجازه میدهد در پرسوجوهایی که یک برنامه کاربردی در پایگاه داده خود میکند دخالت کند. بهطورکلی به مهاجم اجازه میدهد تا دادههایی را مشاهده کند که معمولاً قادر به بازیابی آنها نیستند. در بسیاری از موارد، یک مهاجم میتواند این دادهها را تغییر داده یا حذف کند و باعث تغییرات مداوم در محتوا یا رفتار برنامه شود.
تأثیری که SQL injection میتواند بر یک کسبوکار داشته باشد بسیار گسترده است. یک حمله موفقیتآمیز ممکن است منجر به مشاهده غیرمجاز لیستهای کاربران، حذف کل جداول و در موارد خاص، دستیابی مهاجم به حقوق مدیریتی در پایگاه داده شود که همه این موارد برای یک تجارت بسیار مضر است.
در برخی موقعیتها، مهاجم میتواند یک حمله SQL injection را تشدید کند تا سرور زیربنایی یا دیگر زیرساختهای بکاند را به خطر بیندازد یا یک حمله سرویس را انجام دهد. درحالیکه این بردار را میتوان برای حمله به هر پایگاه داده SQL استفاده کرد، وب سایتها متداولترین اهداف هستند.
هنگام محاسبه هزینه بالقوه SQLI، مهم است که در صورت سرقت اطلاعات شخصی مانند شماره تلفن، آدرس و جزئیات کارت اعتباری، از دست دادن اعتماد مشتری در نظر گرفته شود.

چرا SQL Injection یک خطر امنیتی برای پایگاه است؟
مهاجمان دائماً در حال بررسی وبسایتهای اینترنتی و محوطه پایگاهها برای آسیبپذیریهای SQL injection هستند. آنها از ابزارهایی استفاده میکنند که کشف نقصهای SQL injection را بهطور خودکار انجام میدهند، و تلاش میکنند تا از SQL injection عمدتاً برای منافع مالی (مانند سرقت اطلاعات، شناسایی شخصی که سپس برای سرقت هویت استفاده میشود) بهرهبرداری کنند.
ازآنجاییکه بسیاری از برنامههای مدرن مبتنی بر داده، از طریق وب در دسترس هستند، از نظر آسیبپذیری های SQL Injection گسترده شده اند و بهراحتی مورد سوءاستفاده قرار میگیرند. علاوه بر این، به دلیل رواج زیرساخت داده مشترک پایگاه، نقص SQL Injection در یک برنامه میتواند منجر به خطر افتادن سایر برنامههایی شود که نمونه پایگاه داده مشابهی را به اشتراک میگذارند.
پس از سوءاستفاده، حملات SQL Injection میتواند منجر به موارد زیر شود:

- سرقت، تغییر یا حتی از بین بردن دادههای حساس مانند اطلاعات قابلشناسایی شخصی و نامهای کاربری و رمز عبور
- افزایش امتیازات در سطح برنامه، پایگاه داده یا حتی سیستمعامل
- مهاجمان با استفاده از یک سرور پایگاه داده به خطر افتاده برای حمله به سیستمهای دیگر در همان شبکه “استفاده” میکنند.
تأثیر موفقیتآمیز حمله SQL Injection چیست؟
یک حمله موفقیتآمیز SQL Injection میتواند منجر به دسترسی غیرمجاز به دادههای حساس مانند رمز عبور، جزئیات کارت اعتباری یا اطلاعات شخصی کاربر شود. بسیاری از نقضهای دادههای پرمخاطب در سالهای اخیر نتیجه حملات SQL Injection بودهاند که منجر به آسیب به شهرت و جریمههای قانونی شده است. در برخی موارد، مهاجم میتواند یک درب پشتی دائمی در سیستمهای یک سازمان بهدست آورد که منجر به مصالحه طولانیمدت میشود که میتواند برای مدت طولانی موردتوجه قرار نگیرد.
مدلسازی تهدید
- حملات SQL Injection به مهاجمان اجازه میدهد هویت را جعل کنند، دادههای موجود را دستکاری کنند، مشکلاتی مانند ابطال تراکنشها یا تغییر موجودی ایجاد کنند، اجازه افشای کامل همه دادههای روی سیستم را بدهند، دادهها را از بین ببرند یا در غیر این صورت آنها را غیرقابلدسترس کنند، و تبدیل به مدیران سیستم شوند.
- SQL Injection در برنامههای PHP و ASP به دلیل رواج رابطهای کاربردی قدیمی بسیار رایج است. با توجه به ماهیت رابطهای برنامهنویسی موجود، برنامههای J2EE و ASP.NET کمتر احتمال دارد که بهراحتی از SQL Injection سوءاستفاده کنند.
- شدت حملات SQL Injection به مهارت و تخیل مهاجم و تا حدی کمتر، دفاع در اقدامات متقابل عمیق، مانند اتصالات با امتیاز پایین به سرور پایگاه داده و غیره محدود میشود. بهطورکلی، SQL Injection را یک شدت تأثیر بالا در نظر بگیرید.
انواع SQL Injection
SQL Injection معمولاً در سه دسته قرار میگیرند: SQLI درون باند (کلاسیک)، SQLI استنتاجی (کور) و SQLI خارج از باند. شما میتوانید انواع SQL Injection را بر اساس روشهایی که برای دسترسی به دادهها استفاده میکنند و پتانسیل آسیب آنها طبقهبندی کنید.
SQLI درون باند
مهاجم از یک کانال ارتباطی برای راهاندازی حملات خود و جمعآوری نتایج خود استفاده میکند. سادگی و کارایی SQLI درون باند، آن را به یکی از رایجترین انواع حملات SQLI تبدیل کرده است. دو نوع فرعی از این روش وجود دارد:
- SQLI مبتنی بر خطا: مهاجم اقداماتی را انجام میدهد که باعث میشود پایگاه دادهپیام خطا تولید کند. مهاجم میتواند بهطور بالقوه از دادههای ارائهشده توسط این پیامهای خطا برای جمعآوری اطلاعات در مورد ساختار پایگاه داده استفاده کند.
- SQLI مبتنی بر اتحادیه: این تکنیک از اپراتور UNION SQL بهره میبرد که چندین دستور انتخابی تولیدشده توسط پایگاه داده را برای دریافت یک پاسخ HTTP ترکیب میکند. این پاسخ ممکن است حاوی دادههایی باشد که مهاجم میتواند از آنها استفاده کند.

SQLI استنباطی (کور)
مهاجم بارهای داده را به سرور ارسال میکند و پاسخ و رفتار سرور را مشاهده میکند تا در مورد ساختار آن اطلاعات بیشتری کسب کند. این روش SQLI کور نامیده میشود زیرا دادهها از پایگاه داده وبسایت به مهاجم منتقل نمیشود، بنابراین مهاجم نمیتواند اطلاعات مربوط به حمله درون باند را ببیند.
SQL Injection کور بر پاسخ و الگوهای رفتاری سرور متکی است، بنابراین معمولاً اجرای آنها کندتر است اما ممکن است به همان اندازه مضر باشند. SQL Injection کور را میتوان بهصورت زیر طبقهبندی کرد:

- Boolean: این مهاجم یک پرس و جوی SQL را به پایگاه داده میفرستد و از برنامه میخواهد نتیجه را برگرداند. بسته به درست یا نادرست بودن پرسوجو، نتیجه متفاوت خواهد بود. بر اساس نتیجه، اطلاعات درون پاسخ HTTP تغییر میکند یا بدون تغییر باقی میماند. سپس مهاجم میتواند بررسی کند که آیا پیام یک نتیجه درست یا نادرست ایجاد کرده است.
- مهاجم مبتنی بر زمان یک پرس و جوی SQL را به پایگاه داده ارسال میکند، که باعث میشود پایگاه داده (برای مدتی در چند ثانیه) قبل از اینکه بتواند واکنش نشان دهد منتظر بماند. مهاجم میتواند از زمانی که پایگاه داده پاسخ میدهد، درست یا نادرست بودن یک پرسوجو را ببیند. بر اساس نتیجه، یک پاسخ HTTP بلافاصله یا پس از یک دوره انتظار ایجاد میشود. بنابراین مهاجم میتواند بدون اتکا به دادههای پایگاه داده متوجه شود که آیا پیامی که استفاده کرده است درست یا نادرست است.
SQLI خارج از باند
مهاجم تنها زمانی میتواند این شکل از حمله را انجام دهد که ویژگیهای خاصی در سرور پایگاه داده مورداستفاده برنامه وب فعال باشد. این شکل از حمله در درجه اول بهعنوان جایگزینی برای تکنیکهای SQLI درون باند و استنتاجی استفاده میشود.
SQLI خارج از باند زمانی انجام میشود که مهاجم نتواند از همان کانال برای راهاندازی حمله و جمعآوری اطلاعات استفاده کند، یا زمانی که یک سرور برای انجام این اقدامات بسیار کند یا ناپایدار است. این تکنیکها روی ظرفیت سرور برای ایجاد درخواستهای DNS یا HTTP برای انتقال دادهها به مهاجم حساب میکنند.
عوامل خطر
پلتفرمهای زیر میتوانند تحت تأثیر قرار بگیرند:
- زبان: SQL
- پلت فرم: هر پلتفرم (نیاز به تعامل با پایگاه داده SQL)
SQL Injection به یک مشکل رایج در وبسایتهای مبتنی بر پایگاه داده تبدیلشده است. این نقص بهراحتی شناسایی میشود و بهراحتی مورد سوءاستفاده قرار میگیرد، و به همین دلیل، هر سایت یا بسته نرمافزاری با حداقل پایگاه کاربر احتمالاً در معرض حملهای از این نوع قرار میگیرد.
اساساً، این حمله با قرار دادن یک متا کاراکتر در ورودی داده انجام میشود تا سپس دستورات SQL را در صفحه کنترل قرار دهد، که قبلاً وجود نداشت. این نقص به این واقعیت بستگی دارد که SQL هیچ تمایزی واقعی بین صفحات کنترل و داده ایجاد نمیکند.
نمونههای SQL Injection
طیف گستردهای از آسیبپذیریها، حملات و تکنیکهای SQL Injection وجود دارد که در موقعیتهای مختلف ایجاد میشوند. برخی از نمونههای رایج SQL Injection عبارتاند از:
- بازیابی دادههای پنهان، که در آن میتوانید یک پرس و جوی SQL را برای بازگرداندن نتایج اضافی تغییر دهید.
- براندازی منطق برنامه، که در آن میتوانید یک پرسوجو را تغییر دهید تا با منطق برنامه تداخل داشته باشد.
- حملات UNION، که در آن میتوانید دادهها را از جداول پایگاه داده مختلف بازیابی کنید.
- بررسی پایگاه داده، که در آن میتوانید اطلاعات مربوط به نسخه و ساختار پایگاه داده را استخراجکنید.
- SQL Injection، که در آن نتایج جستجویی که شما کنترل میکنید در پاسخهای برنامه برگردانده نمیشود.

چگونه آسیبپذیریهای SQL Injection را شناسایی کنیم؟
اکثر آسیبپذیریهای SQL Injection را میتوان بهسرعت و با اطمینان با استفاده از اسکنر آسیبپذیری وب Burp Suite پیدا کرد. SQL Injection را میتوان با استفاده از مجموعهای سیستماتیک از تستها در برابر هر نقطه ورودی در برنامه بهصورت دستی تشخیص داد. این معمولاً شامل موارد زیر است:
- ارائه کاراکتر نقلقول تکی ‘ و به دنبال خطاها یا ناهنجاریهای دیگر.
- ارائه برخی از نحو خاص SQL که به ارزش پایه (اصلی) نقطه ورودی و به یک مقدار متفاوت ارزیابی میشود و به دنبال تفاوتهای سیستماتیک در پاسخهای برنامه منتج شده است.
- ارائه شرایط بولی مانند OR 1=1 و OR 1=2 و جستجوی تفاوت در پاسخهای برنامه.
- ارسال بارهای طراحیشده برای ایجاد تأخیر زمانی هنگام اجرا در پرس و جوی SQL، و جستجوی تفاوت در زمان صرف شده برای پاسخ.
- ارسال بارهای OAST طراحیشده برای راهاندازی یک تعامل شبکه خارج از باند هنگام اجرا در یک پرس و جوی SQL، و نظارت بر هرگونه تعامل حاصل.

چگونه از یک وبسایت یا برنامه در برابر حملات SQL Injection محافظت کنیم؟
توسعهدهندگان میتوانند از آسیبپذیریهای SQL Injection در برنامههای کاربردی وب با استفاده از پرسوجوهای پایگاه داده پارامتری شده با پارامترهای محدود، تایپشده و استفاده دقیق از رویههای ذخیرهشده پارامتری در پایگاه داده جلوگیری کنند. این را میتوان در انواع زبانهای برنامهنویسی ازجمله جاوا، دات نت، پی اچ پی و غیره انجام داد.
علاوه بر این، توسعهدهندگان، مدیران سیستم و مدیران پایگاه داده میتوانند اقدامات بیشتری را برای به حداقل رساندن حملات یا تأثیر موفقیتآمیز انجام دهند:
- تمام اجزای نرمافزار کاربردی وب ازجمله کتابخانهها، افزونهها، چارچوبها، نرمافزار وب سرور و نرمافزار سرور پایگاه داده را با آخرین وصلههای امنیتی موجود از فروشندگان بهروز نگهدارید.
- هنگام تهیه حسابهای مورداستفاده برای اتصال به پایگاه داده SQL از اصل حداقل امتیاز (پیوند خارجی است) استفاده کنید. برای مثال، اگر یک وبسایت فقط نیاز به بازیابی محتوای وب از پایگاه داده با استفاده از دستورات SELECT دارد، به اعتبارات اتصال پایگاه داده وبسایت امتیازات دیگری مانند امتیازات INSERT، UPDATE یا DELETE ندهید. در بسیاری از موارد، این امتیازات را میتوان با استفاده از نقشهای پایگاه داده مناسب برای حسابها مدیریت کرد. هرگز اجازه ندهید برنامه وب شما با امتیازات Administrator به پایگاه داده متصل شود (مثلاً حساب “sa” در Microsoft SQL Server).
- از حسابهای پایگاه داده مشترک بین وبسایتها یا برنامههای مختلف استفاده نکنید.
- ورودی ارائهشده توسط کاربر را برای انواع دادههای مورد انتظار، ازجمله فیلدهای ورودی مانند منوهای کشویی یا دکمههای رادیویی، اعتبارسنجی کنید، نه فقط فیلدهایی که به کاربران اجازه میدهند ورودی را تایپ کنند.
- گزارش و مدیریت صحیح خطا را روی سرور وب و در کد پیکربندی کنید تا هرگز پیامهای خطای پایگاه داده به مرورگر وب مشتری ارسال نشود. مهاجمان میتوانند از جزئیات فنی در پیامهای خطای پرمخاطب استفاده کنند تا پرسوجوهای خود را برای بهرهبرداری موفقیتآمیز تنظیم کنند.
آیا فیلتر ورودی برای توقف SQL Injection کافی است؟
یک تصور غلط رایج این است که فیلتر کردن ورودی و خروج از آن میتواند از SQL Injection جلوگیری کند. درحالیکه فیلتر کردن ورودی میتواند به توقف بیاهمیتترین حملات کمک کند و آسیبپذیری اساسی را برطرف نمیکند.
در بسیاری از موارد، مهاجمانی که برنامه وب شمارا آسیبپذیر میکنند، میتوانند از فیلتر ورودی اجتناب کنند، بهعنوانمثال، تلاشها برای رد فهرست کردن کاراکترهای خاص در یک فرم وب.
پیشگیری و کاهش وقوع حملات SQLI
چندین راه مؤثر برای جلوگیری از وقوع حملات SQLI و همچنین محافظت در برابر آنها در صورت وقوع وجود دارد.
مرحله اول اعتبار سنجی ورودی (بانام مستعار پاکسازی) است، که تمرین نوشتن کدی است که میتواند ورودیهای نامشروع کاربر را شناسایی کند.
درحالیکه اعتبار سنجی ورودی همیشه باید بهترین روش در نظر گرفته شود، بهندرت راهحلی بیخطر است. واقعیت این است که در بیشتر موارد، ترسیم تمام ورودیهای قانونی و غیرقانونی بهسادگی امکانپذیر نیست. حداقل بدون ایجاد تعداد زیادی از مثبتهای کاذب، که باتجربه کاربر و عملکرد یک برنامه تداخل میکنند.
به همین دلیل، یک فایروال برنامه کاربردی وب (WAF) معمولاً برای فیلتر کردن SQLI و همچنین سایر تهدیدات آنلاین استفاده میشود. برای انجام این کار، یک WAF معمولاً به لیستی بزرگ و دائماً بهروز شده از امضاهایی که با دقت ساختهشده است، متکی است که به آن اجازه میدهد تا درخواستهای SQL مخرب را با جراحی حذف کند. معمولاً، چنین فهرستی دارای امضاهایی برای رسیدگی به بردارهای حمله خاص است و بهطور منظم برای معرفی قوانین مسدودسازی برای آسیبپذیریهای تازه کشفشده وصله میشود.
به همین دلیل، یک فایروال برنامه کاربردی وب (WAF) معمولاً برای فیلتر کردن SQLI و همچنین سایر تهدیدات آنلاین استفاده میشود. برای انجام این کار، یک WAF معمولاً به لیستی بزرگ و دائماً بهروز شده از امضاهایی که با دقت ساختهشده است، متکی است که به آن اجازه میدهد تا درخواستهای SQL مخرب را با جراحی حذف کند. معمولاً، چنین فهرستی دارای امضاهایی برای رسیدگی به بردارهای حمله خاص است و بهطور منظم برای معرفی قوانین مسدودسازی برای آسیبپذیریهای تازه کشفشده وصله میشود.
WAF مبتنی بر ابر Imperva از تشخیص امضا، شهرت IP و سایر روشهای امنیتی برای شناسایی و مسدود کردن SQL Injection با حداقل مقدار مثبت کاذب استفاده میکند. قابلیتهای WAF توسط IncapRules افزایش مییابد. یک موتور قوانین امنیتی سفارشی که سفارشیسازی دقیق تنظیمات امنیتی پیشفرض و ایجاد سیاستهای امنیتی اضافی برای موارد خاص را امکانپذیر میسازد.
WAF همچنین از تکنیکهای جمعسپاری استفاده میکند که تضمین میکند تهدیدات جدیدی که هر کاربر را هدف قرار میدهد بلافاصله در کل پایگاه کاربر منتشر میشود. این امکان پاسخ سریع به آسیبپذیری جدید و تهدیدات روز صفر را فراهم میکند.