شش ماه پیش توسعه دهندگان وردپرس اعلام کردند که یک آسیب پذیری در وردپرس بوجود آمده است. این واقعه پس از این بود که تعداد زیادی از سایت هایی که بر روی سیستم مدیریت محتوای وردپرس نصب شده بودند مورد آماج حمله سایبری هکر ها قرار گرفتند. گفته می شود 50000 سایت در چند شبانه روز هک شدند.
آسیب پذیری از سوی یکی از پلاگین های وردپرس بود به نام MailPoet Newsletters. وردپرس یکی از محبوب ترین CMS های موجود است، با بیش از 75 میلیون سایت که آنرا در خود دارند (آمار فوریه 2014).
این پلاگین، سایت هایی که آنرا نصب کرده بودند آسیب پذیر می ساخت و در ورژن 2.6.7 برطرف شد، ولی به شرط اینکه سایت ها آنرا بروز رسانی می کردند.
آسیب پذیری بدین صورت بود که هکر ها می توانستند فایل های دلخواه PHP خود را بر روی سرور آپلود کرده و کنترل سایت را بدست بگیرند. در ابتدا تعدادی سایت تخریب شدند و هکر ها اصلاحاتی در کد های خود دادند و سایت های بعدی که هک می شدند آسیبی نمی دیدند و کسی متوجه حضور آنها نمی شد. کدی که در اکثر سایت ها اینجکت شده بود، یک راه مخفی برای ورود هکر ها باز می کرد (backdoor). آنها یک کاربر ادمین بنام 1001001 ایجاد می کردند بطوریکه فقط خودشان رمز ورودشان را داشتند.
همچنین تعدادی از سایت هایی که این پلاگین را نداشتند و یا حتی وردپرس نداشتند نیز هک شدند که به آن cross-contamination می گویند. یعنی همۀ سایت هایی که تحت نام یک اکانت هاست شده اند بخاطر آسیب پذیری یک سایت هک می شوند. البته در برخی شرکت های هاستینگ یک سایت دسترسی به سایت های مجاور در اکانت های دیگر را ندارد، ولی خوب در سرور هایی که بخوبی تنظیم نشده بودند، این اتفاق افتاد و همۀ سایت های موجود در هاست با اکانت های دیگر نیز هک شدند.
چندی پیش، تعدادی از سایت های دوستان ما نیز هک شد. این در حالی است که پلاگین MailPoet در این سایت ها نصب نشده بود. وقتی ما بررسی کردیم، مشاهده کردیم که یک یوزر ادمین بنام 1001001 در کنار دیگر کاربران در جدول wp-users دیتابیس ایجاد شده است. اولین کاری که کردیم، پاک کردن این کاربر بود.
سپس یک فایل مشکوک پیدا کردیم بنام license.php این فایل تحت هیچ شرایطی متعلق به وردپرس نبوده است، پس آنرا پاک کردیم.
همچنین دیدیم که همۀ پلاگین ها محو شدند با خطای “bad header”. وقتی بررسی کردیم، مشاهده کردیم که یک کد مضر در بالای همۀ صفحات PHP اضافه شده است.
کد شبیه این بود:
<?php if(!isset($GLOBALS["\x61\156\x75\156\x61"])) { $ua=strtolower($_SERVER["\x48\124\x54\120\x5f\125\x53\105\x52\..........$shvfyowley=$ieeriuxlhx; $shvfyowley=(581-460); $ilabsgxcei=$shvfyowley-1; ?>
این کد در همۀ صفحات پی اچ پی در بالای کد اصلی اضافه شده بود (prepend). و پارامتر های آن در هر صفحه تغییر می کرد یعنی یکسان نبود.
خوب، کاری که ما کردیم، این بود که با استفاده از رگولار اکسپرشن و تابع بازگشتی یک برنامه نوشتیم که همۀ حالت ها را تحت پوشش قرار میداد و لیستی از همۀ فایل های PHP در زیر فولدر ها تهیه کرده و همه را پاک سازی می کرد. آنرا اجرا کردیم و چیزی حدود 30 هزار فایل پی اچ پی را در کمتر از 5 دقیقه پاک سازی کرد. این کد را در اختیار شما قرار می دهیم که اگر مشکل مشابهی داشتید آنرا اجرا کنید، ولی مراقب باشید!
توجه: این کد همه منظوره نیست و ممکن است به فایل های شما آسیب بزند. پیش از اینکه از آن استفاده کنید، آنرا در یک فولدر کوچک تست کرده و از عملکرد آن مطمئن شوید، و اگر OK بود، آنرا به روت فایل های خود اعمال کنید. ولی باید از چند و چون عملکرد این اسکریپت آشنا باشید و اگر لازم است در آن تغییراتی بدهید. نئو مارکت مسوولیتی را در قبال این اسکریپت قبول نمی کند. پیش از استفاده، از فایل های تان نسخه پشتیبان تهیه کنید!
کد زیر را در فایلی بنام cleanser.php ذخیره کرده و طبق دستورالعمل فوق ابتدا در یک فولدر کوچک تست کرده و سپس به www هاست خود اعمال کنید تا صفحات PHP شما از این ویروس پاک شود:
<?php $files = array(); $direct = getcwd(); function listFolderFiles($dir){ global $files; $ffs = scandir($dir); foreach($ffs as $ff){ if($ff != '.' && $ff != '..' && $ff != 'cleanser.php'){ if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff); else{ if(strtolower(substr($ff,strlen($ff) - 4)) == '.php') array_push($files, $dir.'/'.$ff); } } } } listFolderFiles($direct); foreach($files as $filename){ if(file_exists($filename)){ $contents = file_get_contents($filename); if(!strpos($contents,'if(!isset($GLOBALS[') === false){ preg_match('/\<\?php\sif\(!isset\(\$GLOBALS(.*)-1;\s\?\>/i',$contents,$matches); $malware = '<?php if(!isset($GLOBALS'.$matches[1].'-1; ?>'; $new_contents = substr($contents , strlen($malware)); file_put_contents($filename, $new_contents); }else{} } //die; }
حتما نسخه پشتیبان تهیه کنید پیش از استفاده از این کد. همچنین بخاطر داشته باشید که این کد برای نمونه ویروس فوق ساخته شده است. امکان دارد مشکل شما متفاوت باشد و این کد عمل نکند.
در زیر راهکار هایی داده می شود که کمک می کند امنیت سایت شما در آینده در برابر چنین حملاتی حفظ شود:
4 دیدگاه ها
با تشکر از شما
اما چرا نباید این کار را کرد و چه مشکلی پیش میاره ؟
تعداد زیادی سایت را بر روی یک اکانت هاست نکنید.
سایت هایی که امکان هاست چند سایت با یک اکانت را میدهند، معمولاً حساب امنیت کار را نمی کنند، و یک هکر می تواند برا حتی با چند تا نقطه و اسلش به فولدر های دیگر نیز دسترسی داشته باشد. این برای ما هم اتفاق افتاد و با هک شدن یک سایت از طریق SQL Injection، همه سایت های مرتبط هم هک شدند.
عالی
عالی بود. ممنون از شما.