
حمله تزریق SQL یک آسیبپذیری امنیتی وب است که به مهاجم اجازه میدهد تا در کوئریهایی که یک برنامه به سمت دیتابیس خود ایجاد میکند، مداخله کند و دادههایی را که قادر به مشاهده آنها نیست، بازیابی[1] کند. این بازیابی ممکن است شامل دادههای متعلق به دیگر کاربران یا دادههای خود برنامه باشد.
در بسیاری موارد، یک مهاجم میتواند این دادهها را تغییر داده، حذف کند و یا باعث ایجاد تغییرات در محتوا یا رفتار برنامه شود. در برخی شرایط، مهاجم میتواند یک حمله تزریق SQL را گسترش دهد و سرور اصلی یا زیرساختهای دیگر را به خطر بیاندازد، کنترل آنها را در دست گیرد یا یک حمله منع سرویس را پایهریزی کند.

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

بیشتر آسیبپذیریهای تزریق SQL در عبارت WHERE یک کوئری SELECT بوجود میآید اما باید توجه داشت که آسیبپذیریهای تزریق SQL در اصل میتوانند در هر مکانی از کوئری و در انواع مختلف آن ظاهر شوند برای مثال، در کوئریهای UPDATE برای به روزرسانی یک مقدار، در کوئریهای INSERT برای وارد کردن یک مقدار، کوئریهای SELECT همراه با نام یک جدول یا ستون یا همراه عبارت ORDER BY در کوئری.

برخی از ویژگیهای اصلی زبان SQL در همه پلتفرمهای پایگاه داده محبوب به یک شیوه اجرا میشود، بنابراین بسیاری از روشهای تشخیص و اکسپلویت آسیبپذیریهای تزریق SQL در انواع مختلف پایگاههای داده به طور یکسان کار میکنند. با این وجود تفاوتهایی نیز بین پایگاههای داده وجود دارد و این بدان معنی است که برخی از تکنیکهای کشف و اکسپلویت تزریق SQL بر روی پلتفرمهای مختلف، متفاوت کار میکنند. نحوه ترکیب رشتهها[2]، نحوه کامنتگذاری، استک کوئریها[3]، APIهای مخصوص هر پلتفرم و پیغامهای خطا نمونهای از تفاوتهای موجود در بین پایگاههای داده رایج و محبوب میباشد.
- راهحل و پیشگیری
- از پارامتریسازی[4] در کوئریها استفاده کنید و مستقیماً داده ورودی کاربر را در دستورات و کوئریها قرار ندهید.
- در صورت استفاده از APIها، از API ایمن که امکان پارامتریسازی کوئریها را فراهم میکند، استفاده کنید.
- از لیستسفید در سمتسرور برای اعتبارسنجی ورودیها استفاده کنید.
- از ساختار escape برای کاراکترهای خاص SQL در ورودی کاربر استفاده کنید.
- از limit و دیگر کنترلهای SQL در کوئریها برای جلوگیری از افشای همزمان انبوه رکوردها استفاده کنید.
- در صورت امکان از فایروالهای برنامههای تحت وب[5] استفاده کنید و آنها را برای کنترل ترافیک خروجی نیز تنظیم کنید.
- در صورت رخداد یک خطای SQL از یک صفحه پیغام عمومی استفاده کنید.
منابع
https://portswigger.net/web-security/sql-injection
https://www.acunetix.com/blog/articles/exploiting-sql-injection-example/
https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A1-Injection
[1] retrieve
[2] string concatenation
[3] Batched (or stacked) queries
[4] parameterization
[5] Web Application Firewall (WAF)