در یکی از پروژه‌های پشتیبانی، مشتری تماس گرفت که «سایتش سالم است ولی ترافیک گوگلش نصف شده». هیچ نشانه ظاهری از هک ندیدیم: صفحه سفید نبود، ریدایرکت نبود، محتوای اسپم اضافه نشده بود. وقتی با WP-CLI لیست کاربران را گرفتم، سه کاربر ادمین ناشناس پیدا شد. یکی از آن‌ها با ایمیل هش‌مانند ثبت شده بود. آن روز یاد گرفتم که هک موفق، دقیقاً به این دلیل موفق است که خودش را پنهان می‌کند. در این مقاله، روش تشخیص سیگنال‌های آشکار و پنهان را باز می‌کنم.

اگر با ساختار کلی وردپرس آشنا نیستید، ابتدا وردپرس چیست و ساختار هسته وردپرس را بخوانید. اگر شک دارید که سایتتان هک شده، این مقاله نقطه شروع درستی است.

سه سطح تشخیص حمله

در تجربه من، هک‌ها در سه سطح ظاهر می‌شوند. هر سطح، نشانه‌ها و روش تشخیص خودش را دارد:

سطحوضوحنشانه
سطح آشکارفوری قابل‌مشاهدهصفحه سفید، ریدایرکت، محتوای اسپم
سطح پنهاننیازمند جستجوکاربران ادمین ناشناس، فایل‌های مشکوک
سطح ریزنیازمند تحلیل فنیکوئری اضافه، اسکریپت‌های کوچک در head

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

هک موفق، هکی است که صاحب سایت هرگز متوجه نشود. تمام تلاش مهاجم مدرن، پنهان ماندن است.

سیگنال‌های ظاهری: آنچه کاربر می‌بیند

پیش از رفتن به بررسی فنی، این نشانه‌های ظاهری را چک کنید:

نشانه اول: ریدایرکت به سایت دیگر

رایج‌ترین نشانه. اما نکته مهم: در بسیاری از موارد، ریدایرکت فقط برای ربات‌های گوگل و بازدیدکنندگان با Referrer مشخص فعال می‌شود. برای دیدن آن، باید با User-Agent گوگل‌بات درخواست بفرستید:

curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
    -I https://example.com/

اگر پاسخ 301 یا 302 به دامنه ناشناس بود، سایت شما ریدایرکت مخفی دارد. مسیر کامل بررسی در رفع خطای حلقۀ ریدایرکت.

نشانه دوم: محتوای اسپم در نتایج گوگل

در گوگل، جستجو کنید: site:yourdomain.com [کلمه اسپم]. اگر صفحاتی با کلمات کلیدی خارجی، دارو، شرط‌بندی، یا محتوای بزرگسال دیدید، سایت شما آلوده شده. این صفحات معمولاً در سایت شما وجود ندارند ولی در ایندکس گوگل هستند؛ این یعنی مهاجم آن‌ها را ساخته و بعد پنهان کرده.

نشانه سوم: پاپ‌آپ یا اسکریپت ناشناس

وقتی سایت را در مرورگر باز می‌کنید، کنسول (F12) را ببینید. هر اسکریپت ناشناس که نمی‌شناسید، مشکوک است. به‌خصوص اسکریپت‌هایی که به دامنه‌های ناشناس وصل می‌شوند. راهنمای تفصیلی در پیدا کردن خطاهای JS در کنسول.

نشانه چهارم: ورود اجباری به صفحات ناشناس

در لاگ سرور یا Search Console، صفحاتی را ببینید که بازدیدکنندگان به آن‌ها ورود می‌کنند ولی شما نمی‌شناسید. این صفحات، معمولاً توسط مهاجم ساخته شده‌اند و از دید شما پنهانند.

نشانه پنجم: کندی ناگهانی سایت

اگر سایت ناگهان کند شده و علت آن مشخص نیست، ممکن است مهاجم در حال ماینینگ ارز دیجیتال یا ارسال اسپم از سرور شما باشد. مسیر عیب‌یابی در عیب‌یابی سرعت سایت.

Google Search Console، ابزار اول من در تشخیص هک است. سه بخش را روزانه چک کنید:

بخش اول: Security Issues

در منوی سمت چپ، بخش Security & Manual Actions را باز کنید. اگر گوگل حمله‌ای تشخیص داده باشد، اینجا اعلام می‌شود. انواع هشدارها:

  • Hacked Content: محتوای تزریق‌شده توسط مهاجم.
  • Malware: بدافزار روی سایت.
  • Deceptive Pages: صفحات فریبنده که کاربر را به سایت دیگر می‌برند.
  • Unnatural Links: لینک‌های اسپم.

بخش دوم: Index Coverage

افزایش ناگهانی صفحات ایندکس‌شده، نشانه هک است. مثلاً سایت شما که ۱۰۰ صفحه داشت، ناگهان ۵۰۰۰ صفحه ایندکس‌شده نشان می‌دهد. این صفحات اضافی، معمولاً توسط مهاجم ساخته شده‌اند. مسیر تحلیل در سئو تکنیکال از خزش تا ایندکس.

بخش سوم: Search Queries

در بخش Performance، کوئری‌هایی که سایت شما برای آن‌ها نمایش داده می‌شود را ببینید. کلمات کلیدی ناشناس (دارو، شرط‌بندی، بزرگسال) که با موضوع سایت شما همخوان نیستند، نشانه جدی هک هستند.

Search Console، رایگان‌ترین و مؤثرترین ابزار تشخیص هک است. سایتی که Search Console ندارد، عملاً بدون رادار پرواز می‌کند.

سیگنال‌های لایه فایل

در لایه فایل، سه سیگنال اصلی را بررسی می‌کنم:

سیگنال اول: فایل‌های PHP در مسیرهای غیراستاندارد

# جستجوی فایل PHP در پوشه uploads
find /home/user/public_html/wp-content/uploads -name "*.php"

# جستجوی فایل PHP در ریشه سایت (بیرون از wp-admin و wp-includes)
find /home/user/public_html -maxdepth 1 -name "*.php"

هر فایل PHP در پوشه uploads، تقریباً همیشه بدافزار است. این پوشه فقط باید فایل تصویر، ویدیو و اسناد داشته باشد.

سیگنال دوم: فایل‌های تازه تغییر یافته

# فایل‌های تغییر یافته در ۳۰ روز اخیر (به‌جز کش)
find /home/user/public_html -mtime -30 -type f \
    -not -path "*/cache/*" \
    -not -path "*/wp-content/uploads/*" \
    -not -path "*/node_modules/*"

اگر فایلی در ۳۰ روز اخیر تغییر یافته ولی شما تغییری نداده‌اید، مشکوک است.

سیگنال سوم: مقایسه با نسخه اصلی

از WP-CLI برای مقایسه امضای فایل‌ها با نسخه اصلی استفاده کنید:

wp core verify-checksums
wp plugin verify-checksums --all
wp theme verify-checksums --all

خروجی این دستورات، هر فایل دست‌کاری‌شده را نشان می‌دهد. مسیر تفصیلی در پیدا کردن بدافزار مخفی در وردپرس.

سیگنال چهارم: توابع خطرناک در فایل‌ها

grep -rE "(eval|base64_decode|gzinflate|str_rot13|create_function|shell_exec|passthru|proc_open)\(" \
    /home/user/public_html/wp-content/ --include="*.php" | \
    grep -v "wp-includes"

توابع بالا در بعضی افزونه‌های قانونی هم استفاده می‌شوند، ولی اگر در فایل‌های قالب یا افزونه‌های ساده باشند، قویاً مشکوک‌اند.

سیگنال‌های لایه دیتابیس

لایه دیتابیس، محل پنهان شدن پیشرفته‌ترین بدافزارهاست. سه سیگنال اصلی:

سیگنال اول: کد مخرب در wp_posts

SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_content LIKE '%

خروجی این کوئری، پست‌هایی که حاوی کد مخرب هستند را نشان می‌دهد. توضیح کامل در پاکسازی دیتابیس وردپرس.

سیگنال دوم: گزینه‌های حجیم autoload در wp_options

SELECT option_id, option_name, LENGTH(option_value) as size
FROM wp_options
WHERE autoload = 'yes'
  AND LENGTH(option_value) > 5000
ORDER BY size DESC
LIMIT 20;

گزینه‌های autoload، در هر بار بازدید سایت بارگذاری می‌شوند. اگر یک گزینه ناشناس با حجم بالای ۵۰۰۰ کاراکتر دارید، ممکن است بدافزار باشد. راهنمای تفصیلی در Options API در وردپرس.

سیگنال سوم: کاربران ادمین ناشناس

SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key = 'wp_capabilities'
  AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;

هر کاربر ادمینی که نمی‌شناسید، ممکن است حساب مهاجم باشد. مسیر پاکسازی در امن‌سازی دیتابیس وردپرس.

سیگنال‌های لایه کاربران و تنظیمات

سیگنال اول: کاربران ادمین تازه

در پیشخوان، لیست کاربران را بر اساس تاریخ ثبت‌نام مرتب کنید. اگر کاربری با نقش ادمین در تاریخی که شما یادتان نیست، مشکوک است.

سیگنال دوم: تغییرات در wp-config.php

# مقایسه با نسخه استاندارد
grep -E "define|require|include|eval" /home/user/public_html/wp-config.php

فایل wp-config باید فقط شامل ثابت‌های استاندارد باشد. هر کد اضافی، نشانه هک است. راهنمای سخت‌سازی در امن‌سازی wp-config.

سیگنال سوم: کرون‌های ناشناس

wp cron event list

هر کرون با نام هش‌مانند یا ناشناس، مشکوک است. مهاجم‌ها از cron برای اجرای دوره‌ای بدافزار استفاده می‌کنند. راهنمای تفصیلی در عیب‌یابی cron وردپرس.

سیگنال چهارم: تغییر در .htaccess

grep -E "RewriteRule|Header set|php_value" /home/user/public_html/.htaccess

هر ریدایرکتی که به دامنه خارجی می‌رود، مشکوک است. در بعضی هک‌ها، ریدایرکت فقط برای کاربران موبایل فعال می‌شود.

سیگنال‌های لایه سرور

سیگنال اول: اتصالات خروجی مشکوک

netstat -anp | grep ESTABLISHED | grep -v "127.0.0.1"

اتصالات خروجی به IP ناشناس، نشانه ارسال داده به سرور مهاجم یا ماینینگ است.

سیگنال دوم: مصرف CPU بالا

اگر مصرف CPU سرور ناگهان بالا رفت، بدون افزایش ترافیک، احتمالاً بدافزار در حال اجراست. مسیر بررسی در رفع مصرف بالای CPU در وردپرس.

سیگنال سوم: لاگ‌های دسترسی

# درخواست‌های POST مشکوک
grep -E "POST.*(eval|base64|shell|cmd)" /var/log/apache2/access.log

# درخواست‌های حاوی مسیرهای حساس
grep -E "(wp-config|\.env|\.git)" /var/log/apache2/access.log

این درخواست‌ها نشان می‌دهند مهاجم در حال جستجو برای حفره‌های امنیتی است.

ابزارهای تشخیص سریع

در پروژه‌های خودم، از این ابزارها برای تشخیص استفاده می‌کنم:

ابزار اول: Wordfence

افزونه امنیتی با اسکنر بدافزار قوی. نسخه رایگان برای اسکن اولیه کافی است. مقایسه تفصیلی در بهترین افزونه‌های امنیتی وردپرس.

ابزار دوم: Sucuri SiteCheck

ابزار آنلاین رایگان که از بیرون، سایت شما را بررسی می‌کند. مناسب برای بررسی اولیه.

ابزار سوم: VirusTotal

سرویس بررسی فایل. فایل‌های مشکوک سایت را در VirusTotal آپلود کنید تا بدافزار تشخیص داده شود.

ابزار چهارم: Google Safe Browsing

سرویس گوگل که وضعیت امنیتی سایت شما را نشان می‌دهد. بخش Transparency Report را در سایت گوگل ببینید.

مقایسه تفصیلی ابزارها در بهترین ابزارهای اسکن بدافزار.

هیچ ابزار تشخیصی، جایگزین بررسی انسانی نیست. ابزار کمک می‌کند، ولی قضاوت نهایی با شماست.

ساعت اول بعد از تشخیص

وقتی تایید شد که سایت هک شده، پنج حرکت سریع را انجام دهید:

  1. سایت را کامل قطع نکنید: ولی ورود به پیشخوان را محدود کنید. مسیر دستی امن‌سازی در امن‌سازی لاگین ادمین.
  2. رمز همه ادمین‌ها را عوض کنید: حتی اگر مطمئن نیستید که لو رفته. حرکت سریع، مهار مهاجم است.
  3. بکاپ صحنه جرم بگیرید: قبل از هر پاکسازی، از وضعیت آلوده بکاپ بگیرید.
  4. به هاست گزارش دهید: تیم پشتیبانی می‌تواند الگوهای حمله را از لاگ سرور تشخیص دهد.
  5. IP ادمین را محدود کنید: اگر می‌توانید، دسترسی به wp-login.php را فقط برای IP خودتان باز کنید.

مسیر کامل ساعت صفر و پروتکل پاکسازی در راهنمای پاک‌سازی سایت وردپرسی هک‌شده آمده است.

اشتباهات رایج در تشخیص

  1. اعتماد به ظاهر: سایت سالم به نظر می‌رسد، پس هک نشده. اشتباه بزرگ. هک‌های مدرن، پنهان‌اند.
  2. فقط بررسی از مرورگر خودتان: بعضی هک‌ها فقط برای ربات گوگل فعال می‌شوند، نه برای شما.
  3. عدم استفاده از Search Console: بدون Search Console، هک‌های سئویی برای ماه‌ها پنهان می‌مانند.
  4. تکیه بر یک ابزار: Wordfence همیشه همه چیز را نمی‌بیند. ترکیب چند ابزار، پوشش بهتری می‌دهد.
  5. نادیده گرفتن کاربران ادمین: در ۷۰٪ هک‌هایی که بررسی کرده‌ام، یک کاربر ادمین مخفی وجود داشته.
  6. بی‌توجهی به wp_options: یکی از محل‌های محبوب بدافزار. اکثر مبتدیان از آن غافل‌اند.
  7. نادیده گرفتن لاگ سرور: لاگ سرور، حقیقت خام حمله است.
  8. پاک‌سازی بدون تشخیص ریشه: حذف فایل آلوده بدون فهم نحوه ورود، به بازگشت منجر می‌شود. مسیر تفصیلی در پاک‌سازی سایت هک‌شده.

خط پایان

تشخیص هک شدن وردپرس، سه سطح دارد: آشکار، پنهان و ریز. هک‌های آماتور را در سطح آشکار می‌بینید، ولی هک‌های حرفه‌ای فقط با بررسی فنی دقیق کشف می‌شوند. توصیه عملی من: سه چیز را هر هفته چک کنید — Search Console، لیست کاربران و فایل‌های تازه تغییر یافته. این سه، ۸۰٪ هک‌ها را در هفته اول آشکار می‌کنند.

تجربه شخصی من از ده‌ها پرونده: هرچه سریع‌تر هک را تشخیص دهید، پاکسازی ارزان‌تر است. هکی که در هفته اول کشف شود، معمولاً یک فایل و یک کاربر مخفی دارد. هکی که در ماه ششم کشف شود، صدها فایل آلوده و ده‌ها مسیر بازگشت دارد.

اگر در تشخیص هک سایت خود به نشانه‌ای برخوردید که در این چارچوب نمی‌گنجد، در دیدگاه‌ها بنویسید. تجربه‌های واقعی هر پروژه، این راهنما را دقیق‌تر می‌کند. 🛡️