دفاع از سایت با ZIP Bomb

اگر تابه‌حال وظیفه میزبانی وب‌سایت را بر عهده داشته‌اید یا حداقل یک‌بار سرور را مدیریت کرده‌اید، حتماً به‌خوبی می‌دانید که همیشه افراد و کاربرانی وجود دارند که می‌خواهند به وب‌سایت شما نفوذ کنند و خرابکاری به بار بیاورند. حتی ادمین‌هایی که تابه‌حال وب‌سایت‌های معمولی و کم‌اهمیت را میزبانی کرده‌اند هم با IP و لاگین‌های مهاجم متعددی مواجه شده‌اند.

در واقع اگر شما یک سرور لینوکس با دسترسی SSH دارید، ممکن است از سراسر جهان موردحمله قرار گیرد. البته شما هم می‌توانید فهرست کامل درخواست‌های ورود به سرورتان را روزانه کنترل کنید. برای این منظور باید دستور زیر را وارد کنید:

 grep 'authentication failures' /var/log/auth.log

وردپرس محبوب گاهی عامل اصلی بروز این مشکل است

اسکنرهای آسیب‌پذیری وب‌سایت‌ها پیش از معرفی وردپرس هم وجود داشتند؛ اما همان‌طور که می‌دانید، امروزه وردپرس در سرتاسر دنیا گسترش‌یافته است. به همین خاطر اغلب اسکنرهای نقاط ضعف حالا شامل امکان اسکن‌هایی برای پوشه‌های wp-admin که به‌درستی پیکربندی نشده‌اند یا پلاگین‌های patch نشده هم هستند. بنابراین اگر یک گروه هکر تازه‌کار و کوچک بخواهد نام و اعتباری ایجاد کند، یکی از همین اسکنرها را دانلود می‌کند و به امید دستیابی به یک وب‌سایت و خدشه‌دار کردن آن، وب‌سایت‌های متعددی را تحت تست قرار می‌دهد.

به همین خاطر ادمین‌های وب‌سایت‌ها و سرورها همیشه با لاگ‌های حجیمی در حد چندین گیگابایت پر از لاگین‌های ناموفق مواجه می‌شوند. حالا این سؤال پیش می‌آید که:

آیا روش کارسازی برای مقابله با این لاگین‌ها وجود دارد؟

پس از امتحان برخی روش‌های مرسوم ازجمله IDS یا Fail٢ban، ما به شما راهکار قدیمی ZIP Bomb را پیشنهاد می‌کنیم.

ZIP Bomb چیست؟

فشرده‌سازی در قالب فایل ZIP برای ذخیره داده‌های تکراری بسیار مناسب است. به همین خاطر اگر یک فایل متنی حجیم دارید که شامل داده‌های تکراری مانند صفر است، ZIP می‌تواند آن را به بهترین شکل فشرده کند.

در فایل نمونه ۴۲zip. می‌توانید مشاهده کنید که ZIP قادر است ۴۵ پتابایت معادل ۴۵۰۰۰۰۰ گیگابایت را تا ۴۲ بایت فشرده کند. اگر بخواهید محتوای اصلی چنین فایلی را مشاهده یا آن را از حالت فشرده خارج کنید، احتمالاً با خطای نبود حافظه کافی مواجه می‌شوید.

چگونه می‌توان از ZIP در اسکنرهای ناقص استفاده کرد؟

متأسفانه مرورگرهای وب قادر به درک ZIP نیستند اما می‌تواند GZIP را بفهمد. ابتدا باید فایل ۱۰ گیگابایتی GZIP را که پر از صفر است، بسازیم. البته می‌توانیم فشرده‌سازی را به روش چندلایه هم انجام دهیم اما فعلاً به ساده‌ترین روش آن می‌پردازیم.

 dd if=/dev/zero bs=۱M count=۱۰۲۴۰ | gzip > ۱۰G.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('۱۰G.gzip'));
//Turn off output buffering
if (ob_get_level()) ob_end_clean();
//send the gzipped file to the client
readfile('۱۰G.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('۱۰G.gzip'));
//Turn off output buffering
if (ob_get_level()) ob_end_clean();
//send the gzipped file to the client
readfile('۱۰G.gzip');
}

function startsWith($haystack,$needle){
return (substr($haystack,۰,strlen($needle)) === $needle);
}

این اسکریپت قطعاً قادر نیست راه‌حل نهایی دفاعی برای مشکلات شما باشد، اما می‌تواند از شما در مقابل هکرهای تازه‌کاری که پیش‌تر به آن‌ها اشاره کردیم، دفاع کند. آن‌ها اصلاً اطلاعی ندارند که همه این ابزارها دارای پارامترهای مختلفی برای تغییر user agent هستند.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *