در بیشتر سایت های هک شده، صفحه اول همان است که بود و پیامی از هکر هم دیده نمی شود. مهاجم معمولا ترجیح می دهد پنهان بماند تا مدت طولانی تری از سایت استفاده کند: برای ارسال اسپم، ساختن صفحات تبلیغاتی در گوگل، فرستادن بازدیدکننده به سایت دیگر یا دسترسی به اطلاعات کاربران. خیلی از مدیران سایت تازه وقتی گوگل یا شرکت هاستینگ هشدار می دهد متوجه ماجرا می شوند، و برای همین بهتر است علائم هک شدن سایت را خودتان بشناسید.
مثال ها وردپرسی اند، چون بیشتر سایت های هک شده ای که بررسی می شوند وردپرس دارند. با این حال بیشتر نشانه ها و قدم ها در هر سایت PHP دیگری هم به کار می آید.
علائم هک شدن سایت از دید بازدیدکننده
- ریدایرکت به سایت ناشناس. بعضی کدهای مخرب فقط کاربرانی را منتقل می کنند که از گوگل یا با موبایل وارد می شوند. پس اینکه خودتان با تایپ مستقیم آدرس مشکلی نمی بینید، چیزی را درباره سالم بودن سایت ثابت نمی کند.
- پیام قرمز «Deceptive site ahead» یا «Dangerous site» در کروم و فایرفاکس نشان می دهد سایت وارد فهرست Google Safe Browsing شده است.
- پاپ آپ، تبلیغ یا لینکی که خودتان اضافه نکرده اید.
- دانلود خودکار فایل یا درخواست نصب افزونه مرورگر.
- کندی ناگهانی، در حالی که محتوا و ترافیک واقعی تغییری نکرده است. اسکریپت ماینر یا ارسال انبوه ایمیل منابع سرور را می خورد.
نشانه ها در گوگل و سرچ کنسول
یکی از سریع ترین بررسی ها این است که در گوگل site:example.com را جست و جو کنید. صفحاتی با عنوان ژاپنی یا چینی، تبلیغ دارو، شرط بندی یا فروش کالای تقلبی که خودتان نساخته اید، به احتمال زیاد از هک اسپم سئو آمده اند. مدیر سایت معمولا این آلودگی را نمی بیند، چون این صفحات در منوی سایت نیستند.
در Google Search Console گزارش های Security issues و Manual actions را باز کنید. اگر گوگل بدافزار یا محتوای هک شده پیدا کرده باشد، نمونه آدرس ها همین جا آمده است. بالا رفتن ناگهانی تعداد صفحات ایندکس شده در گزارش Pages را هم جدی بگیرید.
نشانه ها در پیشخوان وردپرس و هاست
- کاربر مدیر (Administrator) ناشناس در بخش کاربران، یا کاربری که نقشش بی دلیل تغییر کرده است.
- افزونه یا قالبی که نصب نکرده اید، یا افزونه ای که در فهرست دیده نمی شود ولی فایلش روی هاست هست.
- تغییر ایمیل مدیر سایت یا آدرس سایت در تنظیمات.
- ایمیل از شرکت هاستینگ درباره ارسال اسپم، مصرف غیرعادی منابع یا مسدود شدن حساب.
- ایمیل های سازمانی که برگشت می خورند، چون IP سرور به لیست سیاه رفته است.
- فایل های PHP در پوشه
wp-content/uploads، که در حالت عادی باید فقط تصویر و فایل رسانه ای داشته باشد. - تغییر در فایل
.htaccessیاwp-config.phpبدون اینکه کسی از تیم شما کاری کرده باشد. - کرون جاب ناشناس در کنترل پنل هاست یا خروجی
crontab -l.
چطور متوجه شویم سایت هک شده است؟ بررسی سریع با دسترسی SSH
با دسترسی SSH به هاست یا سرور، این بررسی ها در چند دقیقه وضعیت را روشن می کند. دستورها را در پوشه اصلی سایت اجرا کنید و خروجی را نگه دارید؛ همه فقط می خوانند و چیزی را تغییر نمی دهند.
1. مقایسه فایل های هسته و افزونه ها با نسخه رسمی
WP-CLI می تواند فایل های هسته وردپرس و افزونه های مخزن رسمی را با checksum منتشرشده مقایسه کند:
wp core verify-checksums
wp plugin verify-checksums --all
هر فایل تغییر یافته یا اضافه در هسته مشکوک است. افزونه های تجاری که از مخزن wordpress.org نیامده اند با این روش بررسی نمی شوند.
2. فایل های PHP در پوشه آپلود و فایل های تازه تغییر یافته
find wp-content/uploads -type f -name "*.php"
find . -type f -name "*.php" -mtime -10 -printf "%TY-%Tm-%Td %p\n" | sort
مهاجم می تواند تاریخ تغییر فایل را جعل کند، پس خروجی خالی ثابت نمی کند سایت سالم است. اگر هم نتیجه ای دیدید، از همین تاریخ ها بازه زمانی نفوذ را تخمین می زنید.
3. جست و جوی الگوهای رایج کد مخرب
grep -rlE --include="*.php" "eval\(base64_decode|gzinflate\(base64_decode|str_rot13\(|assert\(\\\$_(POST|GET|REQUEST)" .
بعضی افزونه های سالم هم از این توابع استفاده می کنند، پس هر نتیجه را باز کنید و ببینید کد به چه منظوری آنجاست.
4. کاربران مدیر و لاگ دسترسی
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
grep "POST" /path/to/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30
اگر درخواست های POST به فایلی با نام عجیب یا فایلی داخل uploads می رود، اغلب همان درِ پشتی (backdoor) مهاجم را پیدا کرده اید.
اولین کارها پس از هک شدن سایت
این کارها را به همین ترتیب انجام دهید. عجله، مثلا پاک کردن همه فایل ها یا برگرداندن فوری بکاپ، ممکن است مشکل را از دید پنهان کند در حالی که راه نفوذ همچنان باز است.
- از وضعیت فعلی نسخه کامل بگیرید. فایل ها، دیتابیس و لاگ های وب سرور را قبل از هر تغییری کپی کنید و جدا نگه دارید؛ بعدا برای پیدا کردن راه نفوذ به همین نسخه نیاز دارید.
- آسیب را محدود کنید. سایت را به حالت تعمیر ببرید یا دسترسی عمومی را موقتا ببندید، به خصوص اگر بازدیدکنندگان به سایت آلوده منتقل می شوند یا فرم پرداخت دارید.
- رمزها را از یک دستگاه سالم عوض کنید. این شامل کنترل پنل هاست، FTP و SSH، کاربر دیتابیس، همه کاربران مدیر وردپرس و ایمیل مدیر است. روی کامپیوتر آلوده، رمز جدید هم لو می رود.
- کلیدهای امنیتی وردپرس را تعویض کنید تا همه نشست های فعال باطل شوند:
wp config shuffle-salts - هسته وردپرس را از منبع رسمی جایگزین کنید و افزونه ها و قالب ها را از منبع اصلی دوباره نصب کنید. قالب و افزونه نال شده (کرک شده) را کنار بگذارید، چون از رایج ترین مسیرهای آلودگی اند.
- دیتابیس را بررسی کنید: جدول کاربران، مقادیر
siteurlوhomeدر جدول options، و اسکریپت های تزریق شده در محتوای نوشته ها. - راه نفوذ را پیدا کنید. ممکن است افزونه آسیب پذیر باشد، رمز ضعیف، حساب FTP قدیمی یا سایت آلوده دیگری روی همان هاست. تا این مرحله انجام نشود، پاکسازی دوام ندارد.
- وقتی مطمئن شدید سایت پاک است، در Search Console درخواست بررسی مجدد (Request review) بدهید.
آیا بازگرداندن بکاپ کافی است؟
بکاپ فقط وقتی به کار می آید که مطمئن باشید مال قبل از نفوذ است، و خیلی از آلودگی ها هفته ها پیش از اولین نشانه رخ داده اند. با بکاپ سالم هم، اگر آسیب پذیری اصلی رفع نشود، سایت دوباره از همان راه هک می شود. پس بعد از بازگرداندن بکاپ، بلافاصله همه چیز را به روز کنید، رمزها را عوض کنید و راه نفوذ را ببندید.
کارهایی که بعد از هک نباید انجام داد
- با پاک کردن یک فایل مشکوک کار تمام نمی شود. مهاجم معمولا چند درِ پشتی در جاهای مختلف می گذارد.
- لاگ ها را پاک نکنید و هاست را قبل از گرفتن نسخه از وضعیت فعلی حذف نکنید.
- نتیجه یک افزونه امنیتی را تنها معیار ندانید؛ کد مخرب می تواند خود آن افزونه را هم دستکاری کند.
- اگر اطلاعات کاربران یا پرداخت در خطر بوده، موضوع را پنهان نکنید و با مشاور حقوقی درباره اطلاع رسانی تصمیم بگیرید.
نصب اصولی وردپرس روی سرور با مجوزهای درست و بدون افزونه اضافه در نصب وردپرس روی سرور آمده و بکاپ منظم که بعد از پاکسازی باید داشته باشید در بکاپ گیری از سرور.
چک لیست پیشگیری بعد از پاکسازی
| اقدام | چطور |
|---|---|
| به روزرسانی منظم | هسته، افزونه ها، قالب و نسخه PHP؛ حذف افزونه های بلااستفاده |
| جلوگیری از ویرایش فایل از پیشخوان | افزودن define('DISALLOW_FILE_EDIT', true); به wp-config.php |
| بستن اجرای PHP در uploads | قاعده وب سرور (نمونه پایین) |
| ورود امن | رمز قوی، ورود دومرحله ای برای مدیران، محدود کردن تلاش ناموفق |
| دسترسی حداقلی | حذف کاربران قدیمی، استفاده از SFTP به جای FTP، کاربر دیتابیس مجزا برای هر سایت |
| بکاپ خارج از هاست | نسخه های منظم در محلی جدا از سرور اصلی با چند نسخه قدیمی تر |
| پایش | بررسی دوره ای Search Console و تغییرات فایل ها |
برای بستن اجرای PHP در پوشه آپلود روی Apache یا LiteSpeed، یک فایل .htaccess داخل wp-content/uploads با این محتوا بسازید:
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
در Nginx همین کار با یک location انجام می شود:
location ~* ^/wp-content/uploads/.*\.(php|phtml|phar)$ {
deny all;
}
وقتی سایت روی سرور اختصاصی یا مجازی خودتان است، امنیت خود سرور را هم باید بررسی کرد. هاردنینگ سرور احتمال اینکه نفوذ از یک سایت به کل سرور برسد را کم می کند.
کمک برای پاکسازی سایت هک شده
برای جلوگیری از حمله به لایه برنامه، WAF چیست را ببینید.
اسکن فایل های سایت روی سرور در آنتی ویروس سرور شرح داده شده است.
منابع و مستندات رسمی
- مستندات رسمی Google Search درباره امنیت و سایت های هک شده
- راهنمای رسمی وردپرس برای سخت سازی امنیتی
- پروژه OWASP Top Ten درباره رایج ترین ریسک های امنیتی وب
اگر این نشانه ها را در سایت خودتان می بینید و می خواهید پاکسازی بدون از دست رفتن شواهد انجام شود، تیم ما در پاکسازی سایت هک شده و ویروس کشی سرور اول جلوی آسیب را می گیرد و از وضعیت فعلی نسخه تهیه می کند، بعد سایت را پاک می کند و راه نفوذ را پیدا می کند. گزارش پایانی فایل های آلوده، مسیر احتمالی نفوذ و کارهای انجام شده را فهرست می کند. مراحل کامل در صفحه خدمات پاکسازی آمده است.



