تزریق SQL (SQLi) یکی از قدیمیترین و خطرناکترین آسیبپذیریهای وب است که حتی امروزه در بسیاری از اپلیکیشنهای مدرن کشف میشود. با وجود Awareness بیشتر و استفاده از ORMها، توسعهدهندگان همچنان مرتکب اشتباهات خطرناکی میشوند. در این مقاله، صفر تا صد این حمله را از مفاهیم پایه تا تکنیکهای پیشرفته بایپس WAF (Web Application Firewall) بررسی میکنیم. هدف این آموزش آشنایی عملی با مکانیزم حمله برای طراحی دفاع بهتر است.
بسیاری از توسعهدهندگان تصور میکنند با استفاده از ابزارهای Object-Relational Mapping (ORM) مانند Hibernate یا Entity Framework، مصون از SQLi هستند. اما در عمل، کوئریهای سفارشی (Native Queries) یا ترکیب نادرست رشتهها در ORM میتواند منجر به تزریق شود. همچنین تکنیکهای پیشرفتهای مانند Second-Order Injection وجود دارند که در آن payload مخرب در دیتابیس ذخیره شده و زمانی که در کوئری دیگری استفاده میشود، اجرا میگردد، که تشخیص آن برای ابزارهای اسکن خودکار بسیار دشوار است.
۱. انواع تزریق SQL
تزریق SQL به سه دسته اصلی تقسیم میشود: In-band (خروجی مستقیم در صفحه)، Blind (بدون خروجی مستقیم) و Out-of-band (استفاده از کانال ثانویه). در In-band که شامل Union-based و Error-based است، مهاجم نتایج را مستقیماً در پاسخ HTTP دریافت میکند. در Blind SQLi، مهاجم از تفاوت در پاسخهای سرور (Boolean-based) یا تاخیرهای زمانی (Time-based) برای استخراج دادهها استفاده میکند.
در Out-of-Band (OOB) SQLi، مهاجم از قابلیتهای شبکهای دیتابیس (مانند xp_dirtree در SQL Server یا LOAD_FILE در MySQL) برای ارسال دادهها به یک سرور خارجی تحت کنترل خود استفاده میکند. این تکنیک زمانی کاربرد دارد که نتایج کوئری مستقیماً در صفحه نمایش داده نمیشوند و مهاجم به کانال دیگری نیاز دارد.
۲. تکنیکهای پیشرفته بایپس WAF
وباپلیکیشن فایروالها (WAF) از الگوهای Regex برای شناسایی Payloadهای شناخته شده استفاده میکنند. با این حال، مهاجمان با استفاده از تکنیکهایی مانند تغییر حروف (Case Variation)، تزریق توضیحات (Comment Injection) و Encodingهای مختلف میتوانند این فیلترها را دور بزنند. به عنوان مثال، استفاده از کاراکترهای غیراستاندارد مانند `/*!50000UNION*/` در MySQL میتواند WAF را فریب دهد.
' UNION SELECT 1,2,3--
'/**/UNION/**/SELECT/**/1,2,3--
' UniOn SeLeCt 1,2,3--
%2527%2520UNION%2520SELECT%25201,2,3--
' /*!50000UNION*/ /*!50000SELECT*/ 1,2,3--۳. روشهای دفاعی و Precaution
استفاده از Prepared Statements و Parameterized Queries بهترین روش دفاعی در برابر SQLi است. در این روش، موتور دیتابیس کد و داده را از هم تفکیک میکند و امکان تزریق را از بین میبرد. علاوه بر این، Input Validation، Output Encoding، و استفاده از اصل کمترین دسترسی (Least Privilege) برای حسابهای کاربری دیتابیس از لایههای دفاعی مهم محسوب میشوند. دیتابیس باید فقط به حداقل دسترسی لازم برای عملکرد اپلیکیشن محدود شود.
📝 جمعبندی
تسلط بر SQL Injection پیشرفته نیازمند درک عمیق از ساختار دیتابیس و رفتار WAFها است. با یادگیری این تکنیکها، تیمهای امنیت میتوانند از برنامههای خود در برابر یکی از خطرناکترین حملات وب محافظت کنند. نظارت مستمر، استفاده از ابزارهای DAST (مانند Acunetix و OWASP ZAP) و آموزش توسعهدهندگان کلید موفقیت در امنیت دیتابیس است.