دیواره آتش برنامه کاربردی تحت وب (بهاختصار WAF) سرویسی است که تمامی درخواستهای HTTP که به یک برنامه تحت وب فرستاده میشود را تجزیهوتحلیل و فیلتر میکند و هر درخواستی را که مخرب تشخیص دهد، شناسایی کرده و به بقیه درخواستها اجازه عبور میدهد. بسته به نحوه پیکربندی یک WAF، میتوان IP منبعی را که از آن درخواستهای مخرب از طریق آن ایجاد و ارسال میشوند را مسدود کرد، تا از حملات بعدی آن منبع جلوگیری شود.
بهمنظور جدا کردن درخواستهای مخرب از درخواستهای مجاز، WAF قسمتهای مختلف درخواست ارسالی به یک منبع وب را تجزیهوتحلیل میکند. برخی از این قسمتها عبارتاند از سرآیندها، پارامترها و بخشهای پرسوجو و … . در طی عملیات تجزیهوتحلیل، WAF به دنبال الگوهایی است که با یک حمله مطابقت دارند. اشاره به مسیرهایی که حاوی تنظیمات سیستم هستند، یا تزریق کدهایی که امکان تغییر دادن درخواستهای فرستادهشده به یک پایگاه داده برای استخراج اطلاعات حساس را دارند از جمله این موارد است.
یکی از اصلیترین مشکلات WAF، مسدود کردن برخی درخواستهای مجاز ارسالی به برنامه کاربردی است. این کار باعث بروز مشکلاتی در کارکرد برنامه کاربردی میشود. علاوه بر این، WAF احساس کاذب امنیت را در میان توسعهدهندگان، مدیران سیستم و کارکنان مسئول امنیت شرکتها و سازمانها ایجاد میکند. درنتیجه پروتکلهای امنیتی نادیده گرفتهشده و اقدامات پیشگیرانه مانند آزمودن کدها و زیرساختها به دلیل استفاده از WAF صورت نمیگیرد. WAFها نیز مانند سایر برنامهها دارای آسیبپذیریهایی هستند و اگر درست کار نکنند، برنامه کاربردی را دچار مشکل میکنند.
Nginx یک وب سرور است که وظیفه پردازش درخواستهای وب را بر عهده دارد. همچنین یک ابزار قابلاتکا و همهکاره است که به برنامهنویسان اجازه پیادهسازی WAF بهوسیله اسکریپتهای مختلف نوشتهشده در زبان LUA را میدهد. اگر نگاهی به WAFهای منبع باز قابلدسترس در اینترنت بیندازیم، متوجه میشویم که Nginx یکی از پراستفادهترین راهحلها برای پیادهسازی WAF است.
اغلب WAFهای متنباز مشکل مشترکی دارند. یکی از این مشکلات در ماژول lua در Nginx است. ماژول مسئول ادغام LUA در Nginx (lua-nginx-module ) اجازه دسترسی به تمام اطلاعات درخواست ارسالشده به اپلیکیشن را نمیدهد. این بدان معنی است که هرچقدر هم WAF در شناسایی حملات مؤثر باشد، همواره اطلاعات خاصی وجود دارند که میتواند از WAF عبور کنند. اگر پارامترهایی که حاوی اطلاعات مخرب هستند خارج از محدودهای باشند که WAF به آن دسترسی دارد، کاملاً غیرقابل استفاده خواهند بود.
برای مثال فایروال lua-resty-waf درخواست زیر که حاوی کد تزریق SQL است را مسدود کند:
http://example.com/?param=’ OR 1=1 – –
اما هنگامیکه همان درخواست شامل پارامترهای بسیاری است، Injection توسط WAF مسدود نمیشود و میتواند از آن عبور کند:
http://example.com/?param=¶m=¶m=…¶m=’ OR 1=1 – –
ازاینرو اینگونه فایروالها هیچگونه تضمینی نسبت به صحت عملکرد خود ارائه نمیدهند.
CloudFlare و Cloudbric دو تأمینکننده امنیت شناختهشده هستند که محصولات WAF را به عنوان سرویس ارائه میدهند. طی آزمایشهای انجامشده، مواردی مانند آسیبپذیری فوق در محصولاتی که هر دو شرکت به فروش میرسانند پیداشده است. لازم به ذکر است که برای سوءاستفاده از خدمات Cloudbric، کافی است که مقدار چند پارامتر را در هر درخواست تغییر دهیم.
در ویدیوی زیر میتوانید مشاهده کنید که فایروال CloudFlare قادر به شناسایی و مسدود کردن درخواست مخرب، هنگامیکه پارامترهای بیشتری به درخواست اضافه میشود، نیست:
همانطور که مشاهده کردید، این آسیبپذیری هنگام تجزیهوتحلیل دادههای ورودی رخ میدهد، چه با درخواست GET، چه با پارامترهای درخواست POST و چه با سرآیندهای درخواست.
برای حل این آسیبپذیری در Wolf-Ray ماژول lua-nginx با اعمال محدودیت جدید، دوباره کامپایل شد. در این روش محدودیتی بر روی تعداد متغیرهایی که قرار است تجزیهوتحلیل شوند اعمال میشود بهطوریکه بر روی عملکرد نرمال برنامه تأثیری نداشته باشد.
منبع: Open Data Security
