چگونه با استفاده از ZIP Bomb از وبسایتمان دفاع کنیم؟
اگر تابهحال وظیفه میزبانی وبسایت را بر عهده داشتهاید یا حداقل یکبار سرور را مدیریت کردهاید، حتماً بهخوبی میدانید که همیشه افراد و کاربرانی وجود دارند که میخواهند به وبسایت شما نفوذ کنند و خرابکاری به بار بیاورند.
حتی ادمینهایی که تابهحال وبسایتهای معمولی و کماهمیت را میزبانی کردهاند هم با IP و لاگینهای مهاجم متعددی مواجه شدهاند.
درواقع اگر شما یک سرور لینوکس با دسترسی SSH دارید، ممکن است از سراسر جهان موردحمله قرار گیرد. البته شما هم میتوانید فهرست کامل درخواستهای ورود به سرورتان را روزانه کنترل کنید. برای این منظور باید دستور زیر را وارد کنید:
grep 'authentication failures' /var/log/auth.log
وردپرس محبوب گاهی عامل اصلی بروز این مشکل است
اسکنرهای آسیبپذیری وبسایتها پیش از معرفی وردپرس هم وجود داشتند؛ اما همانطور که میدانید، امروزه وردپرس در سرتاسر دنیا گسترشیافته است. به همین خاطر اغلب اسکنرهای نقاط ضعف حالا شامل امکان اسکنهایی برای پوشههای wp-admin که بهدرستی پیکربندی نشدهاند یا پلاگینهای patch نشده هم هستند.
بنابراین اگر یک گروه هکر تازهکار و کوچک بخواهد نام و اعتباری ایجاد کند، یکی از همین اسکنرها را دانلود میکند و به امید دستیابی به یک وبسایت و خدشهدار کردن آن، وبسایتهای متعددی را تحت تست قرار میدهد.
به همین خاطر ادمینهای وبسایتها و سرورها همیشه با لاگهای حجیمی در حد چندین گیگابایت پر از لاگینهای ناموفق مواجه میشوند. حالا این سؤال پیش میآید که:
آیا روش کارسازی برای مقابله با این لاگینها وجود دارد؟
پس از امتحان برخی روشهای مرسوم ازجمله IDS یا Fail2ban، ما به شما راهکار قدیمی ZIP Bomb را پیشنهاد میکنیم.
ZIP Bomb چیست؟
فشردهسازی در قالب فایل ZIP برای ذخیره دادههای تکراری بسیار مناسب است. به همین خاطر اگر یک فایل متنی حجیم دارید که شامل دادههای تکراری مانند صفر است، ZIP میتواند آن را به بهترین شکل فشرده کند.
در فایل نمونه ۴۲zip. میتوانید مشاهده کنید که ZIP قادر است ۴۵ پتابایت معادل ۴۵۰۰۰۰۰ گیگابایت را تا ۴۲ بایت فشرده کند. اگر بخواهید محتوای اصلی چنین فایلی را مشاهده یا آن را از حالت فشرده خارج کنید، احتمالاً با خطای نبود حافظه کافی مواجه میشوید.
چگونه میتوان از ZIP در اسکنرهای ناقص استفاده کرد؟
متأسفانه مرورگرهای وب قادر به درک ZIP نیستند اما میتواند GZIP را بفهمد. ابتدا باید فایل ۱۰ گیگابایتی GZIP را که پر از صفر است، بسازیم. البته میتوانیم فشردهسازی را به روش چندلایه هم انجام دهیم اما فعلاً به سادهترین روش آن میپردازیم.
dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip
همانطور که مشاهده میکنید، حجم این فایل حالا ۱۰ مگابایت است. البته این فایل میتواند فشردهتر هم شود اما همین حجم برای قدم اول کافی است.
پس از ایجاد این فایل، باید یک اسکریپت PHP هم برای تحویل آن به سمت کلاینت بسازیم.
<?php //prepare the client to recieve GZIP data. This will not be suspicious //since most web servers use GZIP by default header('Content-Encoding: gzip'); header('Content-Length: '.filesize('10G.gzip')); //Turn off output buffering if (ob_get_level()) ob_end_clean(); //send the gzipped file to the client readfile('10G.gzip');
میتوانیم از این اسکریپت بهعنوان یک روش دفاعی کاملاً ساده بهره ببریم:
<?php $agent = lower($_SERVER['HTTP_USER_AGENT']); //check for nikto, sql map or "bad" subfolders which only exist on wordpress if (strpos($agent, 'nikto') !== false || strpos($agent, 'sqlmap') !== false || startswith($url,'wp-') || startswith($url,'wordpress') || startswith($url,'wp/')) { sendBomb(); exit(); } function sendBomb(){ //prepare the client to recieve GZIP data. This will not be suspicious //since most web servers use GZIP by default header("Content-Encoding: gzip"); header("Content-Length: ".filesize('10G.gzip')); //Turn off output buffering if (ob_get_level()) ob_end_clean(); //send the gzipped file to the client readfile('10G.gzip'); } function startsWith($haystack,$needle){ return (substr($haystack,0,strlen($needle)) === $needle); }
این اسکریپت قطعاً قادر نیست راهحل نهایی دفاعی برای مشکلات شما باشد، اما میتواند از شما در مقابل هکرهای تازهکاری که پیشتر به آنها اشاره کردیم، دفاع کند. آنها اصلاً اطلاعی ندارند که همه این ابزارها دارای پارامترهای مختلفی برای تغییر user agent هستند.