مقدمه
فایروال گذاشتهاید و خیالتان راحت است؟ شاید بهتر باشد یک بار دیگر فکر کنید. واقعیت این است که مهاجمان حرفهای راههای بسیار زیادی برای دور زدن فیلترهای امنیتی بلدند. آنها سالهاست که روشهای خلاقانهای برای مخفی کردن حملات خود پیدا کردهاند. در این مقاله، ۵ مورد از رایجترین و در عین حال خطرناکترین این ترفندها را بررسی میکنیم و مهمتر از آن، یاد میگیریم که چگونه از پس آنها بربیاییم.
ترفند اول: کدگذاری حمله (Encoding)
مهاجمان چه میکنند؟
بسیاری از فایروالهای ساده تنها به دنبال عبارات متنی واضح مانند ' OR '1'='1 یا UNION SELECT میگردند. اما مهاجمان باهوش به جای استفاده از این عبارات مستقیم، نسخه کدگذاریشده آن را ارسال میکنند.
فرض کنید مهاجم قصد تزریق کد اسکیوال داشته باشد. به جای ارسال:' UNION SELECT password FROM users--
آن را به صورت درصدگذاری شده (URL Encoded) ارسال میکند:%27%20UNION%20SELECT%20password%20FROM%20users%2D%2D
یا بدتر از آن، با کدگذاری بیس۶۴:J1VOSU9OIFNFTEVDVCBwYXNzd29yZCBGUk9NIHVzZXJzLS0=
فایروالی که فقط متن خام را تحلیل کند، این تهدید را نمیبیند و حمله به راحتی عبور میکند.
چگونه مقابله کنیم؟
۱. بازگشایی قبل از بررسی: پیش از هرگونه تحلیل امنیتی، ورودی باید از هرگونه کدگذاری (URL، بیس۶۴، هگزادسیمال) خارج شود.
۲. بررسی چندلایه: تنها به بازگشایی آدرس اینترنتی بسنده نکنید. ترکیب چند روش کدگذاری روی یکدیگر را نیز بررسی کنید.
۳. تشخیص الگوی غیرعادی: اگر طول رشته یا تعداد کاراکترهای خاص آن (مانند % و +) به طور غیرعادی زیاد است، حتی اگر حاوی کلمه خطرناکی نباشد، باید به آن مشکوک شد.
ترفند دوم: تغییر حروف بزرگ و کوچک (Case Manipulation)
مهاجمان چه میکنند؟
برخی از فایروالها طوری تنظیم شدهاند که تنها به دنبال کلماتی با حروف بزرگ بگردند (مثلاً SELECT). مهاجم با تغییر شکل کلمه آن را دور میزند:SeLeCt * FrOm users
فایروال میگوید: «من دنبال SELECT بودم، نه SeLeCt» و آن را نادیده میگیرد. اما پایگاه داده (مانند مایاسکیوال) در تحلیل دستورات خود به بزرگی و کوچکی حروف حساس نیست و حمله اجرا میشود.
چگونه مقابله کنیم؟
۱. یکسانسازی حروف: پیش از بررسی، تمام ورودی را به حروف کوچک یا بزرگ تبدیل کنید.
۲. عبارات باقاعده هوشمند: از پرچم Case-Insensitive در regex (مثلاً (?i)) استفاده کنید.
۳. تحلیل آنتروپی حروف: اگر در یک کلمه، حروف بزرگ و کوچک به صورت غیرطبیعی و پشت سر هم ترکیب شدهاند (مانند SeLeCt)، این خود یک هشدار جدی محسوب میشود.
ترفند سوم: استفاده از کامنتهای پایگاه داده
مهاجمان چه میکنند؟
فایروالها اغلب به دنبال فاصله خالی میان کلمات کلیدی هستند (مثلاً فاصله بین UNION و SELECT). مهاجم برای پر کردن این فاصله از کامنتهای پایگاه داده استفاده میکند:UNION/**/SELECT
یا حتی بدتر از کامنتهای ویژه مایاسکیوال بهره میبرد:/*!50000UNION*//*!50000SELECT*/
فایروال تصور میکند این بخشها تنها توضیحاتی بیخطر هستند و آنها را نادیده میگیرد، در حالی که مایاسکیوال محتوای درون /*!...*/ را به عنوان کد اجرا میکند!
چگونه مقابله کنیم؟
۱. حذف تمام کامنتها: پیش از تحلیل، تمام نشانههای کامنت (مانند --، # و /* */) را از ورودی پاک کنید.
۲. تشخیص الگوهای خاص: به طور ویژه به دنبال عبارت /*! بگردید که تقریباً همیشه نشانه حمله است.
۳. بررسی طول رشته: اگر طول رشته پس از حذف کامنتها به طور قابل توجهی کاهش یافت، یعنی مهاجم تلاش داشته چیزی را پنهان کند
ترفند چهارم: حملات کور مبتنی بر زمان (Time-Based Blind SQL Injection)
مهاجمان چه میکنند؟
این روش زمانی به کار میرود که مهاجم خروجی مستقیم پایگاه داده را نمیبیند و با سنجش مدت زمان پاسخگویی سرور اطلاعات را استخراج میکند.
مثال:
مهاجم میخواهد ببیند آیا کاربری به نام admin وجود دارد یا خیر. این ورودی را ارسال میکند:' OR IF(EXISTS(SELECT * FROM users WHERE username='admin'), SLEEP(5), 0)--
اگر پاسخ سرور ۵ ثانیه طول بکشد، مهاجم متوجه میشود که کاربر admin وجود دارد.
چگونه مقابله کنیم؟
۱. محدود کردن زمان اجرای دستورات: در تنظیمات پایگاه داده، حداکثر زمان اجرای یک دستور را محدود کنید (مثلاً ۲ ثانیه).
۲. تشخیص توابع ایجاد تأخیر: ورودیها را برای وجود توابعی مانند SLEEP، pg_sleep، WAITFOR DELAY یا BENCHMARK بررسی کنید.
۳. پایش الگوی درخواستها: اگر نشانی اینترنتی خاصی مدام درخواستهایی با پاسخ ۵ تا ۱۰ ثانیهای دارد، به احتمال زیاد در حال اسکن شدن هستید و باید محدود شود.
ترفند پنجم: پنهانسازی حمله در هدرها و کوکیها
مهاجمان چه میکنند؟
فایروالهای زیادی تنها رشته پرسوجوی آدرس (بخش بعد از علامت سؤال ?) را بررسی میکنند. مهاجم به جای آن، کد مخرب خود را در بخشهای کماهمیتتر قرار میدهد:
هدرها: درون User-Agent یا Referer.
کوکیها: درون Cookie.
بدنه درخواست: مخصوصاً در قالب جیسان (JSON).
GET /profile HTTP/1.1
Host:
User-Agent: Mozilla/5.0' OR '1'='1
Cookie: session=abc123; tracking=' UNION SELECT NULL--
در اینجا فایروال فقط /profile را میبیند، اما حمله در هدر و کوکی پنهان شده است.
چگونه مقابله کنیم؟
۱. بررسی جامع درخواست: یک دیوار آتش قدرتمند باید تمام بخشهای درخواست شامل آدرس، هدرها، کوکیها و بدنه را اسکن کند.
۲. ثبت رفتارهای مشکوک: حتی اگر درخواست مخربی بنا به دلایلی رد نشد، باید ثبت شود تا مدیر سیستم متوجه فعالیت غیرعادی شود.
جمعبندی نهایی: دیوار دفاعی چگونه باید باشد؟
برای مقابله با این ترفندهای پیچیده، یک دیوار آتش کارآمد نیازمند ویژگیهای زیر است:
رمزگشایی هوشمند: قبل از هر چیز دادهها را از حالت کدگذاری خارج کند.
یکسانسازی و پالایش: حروف را یکدست کرده و دادههای زائد (مانند کامنتها) را حذف کند.
تحلیل رفتاری: الگوهای زمانی و حجم درخواستها را بررسی کند.
دید جامع: تمام بخشهای بسته درخواست را بازرسی کند.
یک نمونه پیادهسازی شده:
بر اساس همین نیازها و چالشها بود که پروژهای به نام «سروش» را توسعه دادم. سروش یک دیوار آتش تحت وب (WAF) متنباز است که سعی دارد راهحلهای ذکر شده در این مقاله را به صورت عملی پیادهسازی کند. اگر علاقهمند به دیدن کدها و ساختار فنی این پیادهسازی هستید، لینک مقاله مربوط به آن در پروفایل من موجود است.