موضوع مقاله: تزریق اس‌کیوال | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # تزریق اس‌کیوال | مقدمه: تزریق SQL ، نوعی حملهٔ تزریق کد که از آسیب‌پذیری‌های موجود در نرم‌افزارهای وب بهره‌برداری می‌کند در این حمله، مهاجم با وارد کردن یا دستکاری عبارت‌های SQL در ورودی‌های یک برنامهٔ تحت وب، پرس‌وجوهای ناخواسته‌ای را علیه پایگاه داده هدف اجرا می‌کند؛ در نتیجه عملکرد مورد انتظار طراح سامانه تغییر می‌یابد و امکان دسترسی یا تغییر غیرمجاز داده‌ها فراهم می‌شود. | ## بخش 1: تزریق اس‌کیوال | طبق نسخهٔ ۲۰۲۳ فهرست OWASP Top Ten، آسیب‌پذیری‌های «تزریق» در رتبهٔ سوم قرار دارند و همچنان یکی از آسیب‌پذیری‌های رایج نرم‌افزارهای وب محسوب می‌شوند. علت‌های متداول بروز تزریق SQL مربوط به مدیریت نادرست ورودی‌ها و اعتبارسنجی ناکافی در لایهٔ کاربرد است. حملهٔ تزریق SQL زمانی رخ می‌دهد که داده‌های ورودی کاربر بدون پاک‌سازی یا پارامترایز شدن مستقیماً در رشتهٔ پرس‌وجوی SQL درج شوند و مهاجم بتواند با تغییر این عبارت‌ها، منطق پرس‌وجو را بازنویسی یا دستورات جدیدی اضافه کند؛ پیامدهای این وضعیت می‌تواند شامل افشای اطلاعات حساس، تغییر یا حذف داده‌ها و دورزدن کنترل‌های دسترسی باشد. پرس‌وجوی معمول دارای چند بخش مختلف به شرح ذیل می‌باشد: دستور Select: با استفاده از این دستور ستون‌هایی که مورد نظرمان است را انتخاب می‌نمائیم. پیاده‌سازی فنی فیلتر اشتباه کاراکترهای "" یا این آسیب‌پذیری از راه‌های گوناگونی پدید می‌آید. اما نفوذگر می‌تواند با دادن مقدارهایی هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بوده‌است بشود. مدیریت نادرست نوع ورودی این شکل از تزریق زمانی اتفاق می‌افتد که یک فیلد کاربر از نظر محدودیت‌های نوع ورودی بررسی نشده باشد. این اتفاق زمانی می‌تواند رخ دهد که یک فیلد عددی در یک دستور SQL استفاده شده باشد، اما برنامه‌نویس هیچ‌گونه بررسی برای تعیین نوع ورودی کاربر و تأیید ورودی عددی، فراهم نساخته باشد. با این حال، اگر ورودی از نوع رشته تعیین شده باشد، کاربر نهایی می‌تواند دستور را به صورت دلخواه دستکاری کرده و به این وسیله نیاز به ورود کراکترهای Escape شده را دور بزند. صفحه دارای آسیب‌پذیری ممکن است آن صفحه‌ای نباشد که داده‌ها را نمایش می‌دهد، اما تفاوت‌های حاصل از نتایج یک دستور تزریق منطقی به درون یک دستور SQL مشروع را، که برای صفحه مورد نظر فراخوانی شده‌است، نمایش خواهد داد. | ## بخش 2: تزریق اس‌کیوال | این نوع حمله با افزایش زمان، ممکن است شدیدتر شود، زیرا برای هر بیت بازیابی شده، ساخت یک دستور نیاز است. ابزارهایی وجود دارد که پس از به‌دست آوردن اطلاعات مربوط به هدف و مکان آسیب‌پذیری، امکان خودکار کردن این حمله را فراهم می‌کنند. پاسخ‌های شرطی نوعی از تزریق SQL کور است که پایگاه داده را مجبور به ارزیابی یک دستور منطقی بر روی صفحه یک برنامه معمولی می‌کند. Query به‌طور کامل در سرور اتفاق می‌افتد؛ کاربر نام‌های مربوط به پایگاه داده، جدول یا فیلدها را نمی‌داند و از رشته Query نیز اطلاع ندارد. هکر با استفاده از کد درون رشته‌های Query می‌تواند به اطلاعات بیشتری از سرور دست یابد تا مسیر اصلی حمله را کشف کرده و به اهداف خود دست یابد. تزریق SQL سطح دوم این تزریق زمانی اتفاق می‌افتد که مقادیر ارائه شده شامل حملات تزریق SQL باشد که به جای برخی دستورها اجرایی ذخیره شده‌اند. برنامه کاربردی ممکن است یک دستور SQL را به درستی رمزنگاری کرده و آن را به صورت یک دستور SQL معتبر ذخیره کند. سپس بخش دیگری از برنامه که بدون هیچ‌گونه کنترلی برای محافظت در برابر تزریق SQL طراحی شده‌است، ممکن است دستور SQL ذخیره شده را اجرا کند. این حمله نیازمند آگاهی بیشتر در مورد این است که مقادیر ارائه شده، بعداً چگونه استفاده خواهند شد. اسکن کننده‌های امنیت برنامه‌های کاربردی تحت‌وب خودکار به آسانی نمی‌توانند این گونه حمله را تشخیص دهند و ممکن است نیاز باشد که به صورت دستی، برای بررسی علائم این حمله، دستورنویسی شود. | ## بخش 3: تزریق اس‌کیوال | کاهش خطر دستورها پارامتریک با توسعه بیشتر platformها، دستورها پارامتریک که با پارامترها کار می‌کنند می‌توانند به جای تعبیه ورودی کاربر در دستورها استفاده شوند (گاهی متغیر یا متغیرهای bind نامیده می‌شوند). از این رو تزریق SQL به راحتی به صورت یک مقدار پارامتری ناآشنا (و احتمالاً نامعتبر) عمل می-کند. اجرا در سطح برنامه‌نویسی استفاده از کتابخانه‌های نگاشت مبتنی بر ارتباط اشیاء، نیاز به نوشتن کدهای SQL را برطرف می‌کند. راهنمای پایگاه داده SQL توضیح می‌دهد که کدام کراکترها معنی خاص دارند، بنابراین این امکان را فراهم می‌کند که یک فهرست سیاه جامع از کاراکترهایی که نیاز به ترجمه دارند تهیه شود. برای مثال، هر رخداد از نقل قول تکی (') در یک پارامتر، باید توسط دو نقل قول ('') جایگزین شود تا به شکل یک رشته SQL معتبر تبدیل شود. یک رشته برمی‌گرداند که شامل backslashهایی است که پیش از کراکترهای مورد نیاز در گزارش‌گیری از پایگاه داده، قرار می‌دهد. ساخت یک لایه شفاف برای امن کردن ورودی می‌تواند این استعداد خطا را کاهش دهد، هر چند که به‌طور کامل آن را از بین نمی‌برد. بررسی الگو پارامترهای بولی، شناور یا صحیح می‌توانند از نظر نوع بررسی شوند که مقادیر مطابق با نوع آن‌ها وارد شده باشد. رشته‌هایی که باید برخی الگوها را رعایت کنند (تاریخ، UUID، … و غیره) می‌توانند بررسی شوند که با این الگوها مطابقت داشته باشند. مجوزهای پایگاه داده محدود کردن مجوزهای ورود به پایگاه داده که توسط برنامه‌های تحت‌وب تنها برای موارد مورد نیاز استفاده می‌شود، می‌تواند در جهت کاهش اثرات مربوط به هرگونه حمله تزریق SQL به کار رود. | ## جمع‌بندی | برای مثال، در سرور SQL مایکروسافت، هنگام ورود به پایگاه داده می‌توان گزینش را به برخی جداول سیستمی محدود کرد که این عمل باعث کاهش سوء استفاده‌هایی می‌شود که سعی در درج جاوا اسکریپت به تمام ستون‌های پایگاه داده دارند.