Cập nhật: Lê Phúc 26 phút đọc

Quy trình 6 bước xử lý mã độc website WordPress mọi cấp độ

Website WordPress của bạn đột nhiên tải trang chậm bất thường, xuất hiện liên kết lạ trong nội dung, Google Search Console báo lỗi “This site may be hacked”, thứ hạng SEO tụt giảm mạnh, hoặc khách hàng của bạn bị spam email lừa đảo từ domain của bạn? Ồ, thật không may đây là những dấu hiệu cho thấy rằng rõ ràng của website của bạn đã bị hack, dính virus website hoặc malware WordPress, hay một cuộc tấn công mạng tinh vi.

Website WordPress bị hack hiển thị cảnh báo malware từ Google
Dấu hiệu điển hình khi website WordPress bị nhiễm mã độc

Đừng lo, bài viết này sẽ chia sẻ về quy trình 6 bước xử lý mã độc website WordPress cho mọi cấp độ giúp nhanh chóng phát hiện virus website, loại bỏ malware, vá lỗ hổng bảo mật, chống hack WordPress tái nhiễm mà Lê Phúc đã áp dụng để xử lý cho hàng chục website dính virus.

Việc xử lý mã độc WordPress không phải cứ cài plugin quét rồi “Clean” là xong. Cách làm cảm tính đó thường chỉ khiến tình trạng nặng hơn và hacker dễ dàng quay lại. Chính vì thế chúng ta cần một quy trình bài bản, có hệ thống từ kiểm tra, làm sạch, vá lỗ hổng đến tăng cường bảo mật lâu dài. Hãy cùng mình đi tìm hiểu nhé!

Bước 1 – Kiểm tra sơ bộ & Backup toàn diện

Đối với người mới bắt đầu xử lý malware WordPress, bước này giống như “khảo sát địa hình” trước khi chiến đấu. Nếu bỏ qua, bạn có thể xóa nhầm file quan trọng, dẫn đến website “chết” hoàn toàn. Backup giúp bạn có “bản sao an toàn” để khôi phục nếu sai sót – đặc biệt khi website bị hack thường kèm theo rủi ro mất dữ liệu.

Công cụ quét nhanh online

Bắt đầu bằng các công cụ miễn phí không cần kỹ thuật cao:

  • Sucuri SiteCheck: Nhập URL website, quét trong 1-2 phút để phát hiện virus website hoặc liên kết độc hại.
  • VirusTotal: Upload file nghi ngờ (như index.php) để kiểm tra.
  • Google Transparency Report: Kiểm tra xem Google có gắn cờ đen cho site của bạn chưa.

Kết quả sẽ cho bạn biết mức độ nghiêm trọng, giúp quyết định có cần chuyên gia hay tự làm.

Hướng dẫn backup chi tiết

Trường hợp 1: Vẫn vào được wp-admin

Cách đơn giản và nhanh nhất là dùng plugin với mình thường dùng plugin All-in-One WP Migration đối với site nhỏ hoặc plugin UpdraftPlus đối với site vừa để backup website WordPress.

UpdraftPlus là plugin miễn phí, và được nhiều người sử dụng dụng nhất:

  • Vào wp-admin → Plugins → Thêm mới → Tìm “UpdraftPlus” → Cài & kích hoạt.
  • Vào Settings → UpdraftPlus Backups.
  • Nhấn Backup Now → Chọn Include your database + Include your files (toàn bộ).
  • Sau khi backup xong, tải về máy tính hoặc lưu trực tiếp lên Google Drive/Dropbox (khuyến khích).
  • Làm ít nhất 2 bản: 1 local + 1 cloud.
Backup file và database WordPress bằng plugin trước khi xử lý virus
Backup toàn diện là bước đầu tiên an toàn nhất

All-in-One WP Migration là plugin có giao diện dễ dùng, nhưng bản miễn phí có giới hạn 512MB:

  • Cài plugin → Export → Chọn File → Tải file .wpress về máy.
  • Ưu tiên dùng khi site nhỏ, cần restore nhanh.

Lưu ý: Backup trước khi dọn mã độc. Luôn kiểm tra file tải về có mở hoặc backup ngược lại được không.

Trường hợp 2: Không vào được wp-admin 

Vào server/hosting qua cPanel

Bước 1: Backup toàn bộ code (file website)

  • Đăng nhập cPanel → File Manager.
  • Vào thư mục public_html (hoặc thư mục chứa site).
  • Chọn toàn bộ file/thư mục → Nhấn Compress (nén).
  • Chọn định dạng Zip → Compress Files.
  • Sau khi nén xong, click chuột phải file zip → Download.
  • Tải về máy tính cá nhân (nên làm 2 bản: 1 local + 1 cloud).

Bước 2: Backup database (SQL)

  • Vào cPanel → phpMyAdmin.
  • Chọn database của site WordPress (thường tên giống wp_xxxxxx).
  • Bên trái chọn toàn bộ bảng → Nhấn tab Export.
  • Chọn Quick → Định dạng SQL → Go.
  • Tải file .sql về máy.
  • Nén file .sql bằng gzip hoặc zip để nhẹ hơn (dễ lưu trữ).

Bước 2 – Quét file hệ thống

Quét nhanh chỉ phát hiện bề mặt, nhưng malware WordPress thường ẩn sâu trong file hệ thống hoặc database. Bước này giúp bạn lập “bản đồ” nhiễm độc, tránh bỏ sót – đặc biệt với người mới, giúp hiểu rõ vấn đề trước khi xóa.

Quét bằng plugin Wordfence

  • Vào wp-admin → Plugins → Thêm mới → Tìm “Wordfence Security” → Cài & kích hoạt.
  • Vào Wordfence → Scan → Start New Scan (miễn phí, mất 5–30 phút tùy site).
  • Kết quả: Liệt kê file bị sửa, file lạ, signature malware (eval, base64, webshell…).
  • Ưu điểm: Dễ dùng, tự động so sánh với bản WordPress gốc, có nút Repair/Delete.
  • Nhược điểm: Có thể bỏ sót mã độc tùy chỉnh hoặc nặng.
  • Lưu ý: Nên sử plugin trên môi trường local
Kết quả quét sâu malware WordPress bằng Wordfence dashboard
Wordfence phát hiện file nhiễm eval/base64

Quét bằng SSH trên server

Nếu bạn có quyền SSH (hầu hết VPS/Cloud hosting có), đây là cách quét chuyên sâu nhất nhưng bạn cũng hãy chú ý khi làm việc trực tiếp trên server tránh dùng các lệnh mà mình chưa rõ hoặc biết để tránh sai sót không quay lại được.

Cài ClamAV miễn phí, phổ biến nhất:

Bash
# Trên Ubuntu/Debian
sudo apt update && sudo apt install clamav clamav-daemon -y
# Update database virus mới nhất
sudo freshclam
# Quét toàn bộ site, loại trừ cache để tránh false positive
clamscan -r --bell -i --exclude-dir=^/home/user/public_html/wp-content/cache/home/user/public_html/ > scan_result.txt

Phân tích kết quả ClamAV:

  • Mở file scan_result.txt: Tìm dòng chứa “Infected files” hoặc “FOUND”.
  • Ví dụ: /public_html/wp-content/uploads/evil.php: Trojan.Script.123 FOUND
  • Hành động: Xóa file đó hoặc cách ly (mv evil.php /home/user/quarantine/).

Cài Maldet cho Linux Malware Detect:

Bash
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar xzf maldetect-current.tar.gz
cd maldetect-*
sudo ./install.sh
maldet -u          # Update signature
maldet -a /home/user/public_html/  # Quét toàn bộ

Phân tích Maldet:

  • Kết quả lưu tại /usr/local/maldetect/logs/event_log.
  • Tìm “MALWARE HIT” → Ghi chú đường dẫn file → Xóa thủ công hoặc dùng maldet -q ID để quarantine.

Quét trên local cách an toàn nhất

Backup toàn bộ site về máy tính cá nhân → Quét bằng công cụ mạnh trên Windows/Mac/Linux.

Bước thực hiện:

  1. Backup toàn bộ file + database (như hướng dẫn trước: zip public_html và export SQL).
  2. Giải nén file zip ra thư mục trên máy tính (ví dụ: C:\backup_site).
  3. Cài công cụ quét miễn phí:
    • Windows: Malwarebytes (miễn phí) hoặc ESET Online Scanner.
    • Mac/Linux: ClamAV (cài bằng brew install clamav trên Mac, hoặc apt trên Linux).
    • Tốt nhất cho WordPress: Wordfence CLI (miễn phí, chạy trên local).

Cài Wordfence CLI trên local

Bash
# Cài PHP nếu chưa có (Windows: dùng XAMPP, Mac: brew install php)
wget https://github.com/wordfence/wordfence-cli/releases/latest/download/wordfence-cli.phar
php wordfence-cli.phar scan /path/to/your/backup_site/public_html

Phân tích chuyên sâu trên local:

  • Wordfence CLI báo chi tiết: file nào bị sửa, loại malware (Heuristics.Malicious, Known.Signature…).
  • ClamAV trên local:
Bash
clamscan -r --bell -i /path/to/backup_site/public_html > local_scan.txt
  • Dùng công cụ bổ sung: Notepad++ (Windows) hoặc VS Code với extension “Malware Scanner” để tìm chuỗi nguy hiểm (eval, base64_decode, gzinflate, shell_exec).
  • Tìm nhanh bằng lệnh (Linux/Mac) hoặc PowerShell (Windows):
Bash
# Tìm chuỗi nguy hiểm
grep -r -i "eval\|base64_decode\|gzinflate\|shell_exec" /path/to/public_html

Ưu điểm quét local:

  • Không ảnh hưởng server (an toàn 100% nếu server đang bị backdoor).
  • Có thể quét chậm, phân tích kỹ, lưu kết quả dễ dàng.
  • Dễ decode base64 bằng tool online hoặc Python script local.

Bước 3 – Phân tích & Remove mã độc

Các dạng mã độc phổ biến

Mã độc ẩn

Hacker dùng chuỗi mã hóa để giấu code xấu:

eval(base64_decode(‘aHR0cDovL…’));

@eval(@gzinflate(@str_rot13(@base64_decode(‘eJyV…’))));

Mục đích: chèn backdoor, spam, redirect, ads.

Backdoor / Webshell

File cho phép điều khiển server:

c99.php, wso.php, b374k.php, indoxploit.php

Code thường có:

shell_exec($_POST[‘cmd’]);

system($_GET[‘cmd’]);

Hay giấu trong: uploads/, file .jpg.php, .ico, tên random.

Mã Độc SEO / Redirect / Quảng Cáo

Chèn iframe, script, hoặc .htaccess:

<iframe src=”bad.com” style=”display:none”></iframe>

RewriteRule ^(.*)$ http://bad.com [R=301,L]

Dùng để đẩy link cá cược, 18+, hoặc redirect người dùng.

Mã Độc Trong Database (DB Injection)

Không chỉ nằm trong file, mà còn xâm nhập vào DB:

Hay gặp trong:

  • wp_options (autoload = yes)
  • wp_posts.post_content

Ví dụ:

<script>window.location=”http://bad.com”</script>

Hoặc serialized:

a:1:{s:4:”code”;s:100:”<script src=’bad.js’></script>”;}

Tác hại: tự động chèn JS, iframe mỗi lần load site.

Tìm và phân tích mã độc bằng công cụ

Dùng Plugin Wordfence

Wordfence là công cụ tốt nhất cho beginner: quét sâu, xóa mã độc an toàn mà không cần code. Nếu site còn vào được wp-admin, bắt đầu ngay.

  1. Cài và quét bằng Wordfence:
    • Vào wp-admin → Plugins → Thêm mới → Tìm “Wordfence Security” → Cài & kích hoạt (miễn phí).
    • Vào Wordfence → Scan → Start New Scan (quét mất 5-30 phút tùy site). Lý do: Phát hiện mã độc ẩn (eval, base64, backdoor) mà mắt thường không thấy. Kết quả: Wordfence liệt kê file nhiễm (ví dụ: index.php chứa eval(base64_decode(…))).
  2. Xóa mã độc bằng Wordfence:
    • Trong kết quả scan, chọn file nhiễm → Nhấn “Repair” (sửa tự động) hoặc “Delete” (xóa nếu không sửa được).
    • Nếu mã độc trong database (wp_posts, wp_options), Wordfence sẽ highlight → Chọn “Clean” hoặc xóa thủ công qua wp-admin (vào Posts/Pages chỉnh sửa xóa code lạ). Lý do: An toàn hơn tự xóa, vì Wordfence so sánh với bản sạch gốc. Lưu ý: Nếu file core (wp-includes), chọn “Repair from Original” để thay bằng bản chuẩn từ WordPress.
  3. Kiểm tra và lặp lại:
    • Sau xóa, chạy scan lại → Xác nhận “No issues detected”.
    • Vào wp-admin kiểm tra: Không redirect lạ, link spam, site load bình thường. Lý do: Đảm bảo sạch 100%, tránh bỏ sót. Sai lầm phổ biến: Chỉ quét 1 lần – lặp 2-3 lần để chắc.
  4. Tắt/xóa plugin nghi ngờ:
    • Vào Plugins → Deactivate tất cả → Test site (nếu ổn, xóa plugin nulled/tên lạ).

Dùng FileZilla FTP

Kết nối FTP → Vào wp-content/uploads → Xóa hết file .php, .ico, .jpg.php (bình thường không có).

Kiểm tra wp-includes, wp-admin → Tìm file lạ (tên random, ngày sửa mới nhất).

Kiểm tra quyền file: file nào 777 → đổi về 644 ngay.

Dùng lệnh Terminal/SSH/SQL Server 

Cách cần kĩ thuật hơn là dùng SSH + grep qua PuTTY hoặc terminal để tìm nhanh, chính xác bạn tham khảo một vài lệnh dưới đây hay được sử dụng:

Bash
# Tìm eval + base64 toàn site, include cả .js (mã độc JS ngày càng phổ biến)
grep -rP --include=\*.{php,js,html} "(eval|base64_decode|gzinflate|str_rot13|exec|shell_exec|system|passthru)" /home/user/public_html/ > infected_files.txt

# Tìm chuỗi base64 dài bất thường (dấu hiệu obfuscated code)
grep -rP --include=\*.php "base64_decode\('[^']{300,}'" /home/user/public_html/

# Tìm iframe/script ẩn
grep -rP --include=\*.{php,html} "(<iframe.*display:none|<script.*unescape|document\.write)" /home/user/public_html/

# Tìm webshell signature (ví dụ c99 shell có chuỗi đặc trưng)
grep -r "c99shell" /home/user/public_html/ || grep -r "WSO_VERSION" /home/user/public_html/
Tìm mã độc WordPress bằng lệnh grep SSH trong terminal
SSH grep phát hiện eval base64 trong file PHP

Sau khi tìm thấy để giải mã base64 có thể dùng tool online base64decode.org hoặc viết một đoạn Python script local đơn giản như:

Bash
# Chạy local để decode an toàn
import base64
encoded = 'ZXZhbCgkX1BPU1RbJ2EnXSk7'  # Thay bằng chuỗi tìm được
print(base64.b64decode(encoded).decode('utf-8'))  # Output: eval($_POST['a']);

Nếu code chứa $_POST hoặc $_GET, đó là backdoor remote hãy xoá ngay.

Đưa site về maintenance mode (tránh rủi ro):

  • Tạo file .maintenance trong thư mục gốc (public_html) với nội dung: <?php $upgrading = time(); ?>.
  • Hoặc dùng plugin “WP Maintenance Mode” nếu vào được admin. Lý do: Ngăn user truy cập, tránh lây nhiễm thêm trong lúc dọn. Sau xong, xóa file để site lên lại.

Tạo user admin mới an toàn (tránh user cũ bị hack):

  • Vào phpMyAdmin (qua cPanel) → Chọn database WordPress.
  • Chạy SQL để tạo user:
SQL
INSERT INTO wp_users (user_login, user_pass, user_nicename, user_email, user_status)  
VALUES ('newadmin', MD5('MatKhauManh@2025!'), 'newadmin', 'your@email.com', 0);
  • Lấy ID user mới (last_insert_id). Thêm role admin:
SQL
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)  
VALUES (ID_moi, 'wp_capabilities', 'a:1:{s:13:"administrator";b:1;}');  
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)  
VALUES (ID_moi, 'wp_user_level', '10');

Lý do: User cũ có thể bị chiếm, backdoor ẩn trong usermeta. Đăng nhập bằng user mới để dọn. Lưu ý: Thay MD5 bằng hash mạnh hơn nếu dùng WordPress mới (wp_generate_password).

Xóa mã độc file thủ công (kết hợp Wordfence):

  • Từ Wordfence scan, ghi chú file nhiễm.
  • Tải WordPress zip cùng version từ wordpress.org → Unzip → Copy thay thế file core bị sửa (wp-includes, wp-admin, index.php).
  • Qua FTP/SSH, xóa file lạ trong uploads: find wp-content/uploads -name “*.php” -delete. Lý do: Wordfence sửa bề mặt, thủ công đảm bảo sạch sâu (ví dụ file obfuscated). Ví dụ: Nếu file chứa eval(base64_decode(‘…’)), decode để kiểm tra (như hướng dẫn trước), rồi xóa toàn bộ.

Làm sạch database chi tiết (xóa entry độc):

  • Backup database trước (qua phpMyAdmin: Export).
  • Chạy SQL xóa:
SQL
-- Xóa option chứa mã độc (kiểm tra trước bằng SELECT để tránh xóa nhầm)  
DELETE FROM wp_options WHERE option_value LIKE '%eval(%' OR option_value LIKE '%base64_decode(%' OR option_value LIKE '%gzinflate(%';  
-- Xóa injection trong posts (thay 'bad.com' bằng domain độc hại thực)  
UPDATE wp_posts SET post_content = REPLACE(post_content, '<iframe src="bad.com" style="display:none"></iframe>', '')  
WHERE post_content LIKE '%<iframe%';  
-- Xóa trong postmeta/usermeta  
DELETE FROM wp_postmeta WHERE meta_value REGEXP '(eval|base64|shell_exec)';

Lý do: Mã độc ẩn 60% trong database, Wordfence không luôn clean hết – thủ công chính xác hơn. Lưu ý: Chạy SELECT trước DELETE để preview, tránh xóa dữ liệu quan trọng. Nếu database lớn, dùng WP-CLI: wp db query “SQL đây”.

Reset password tất cả user và kiểm tra log:

Bash
wp user list --field=ID | xargs -n1 wp user reset-password --user_pass='NewStrongPass@2025!'
  • Kiểm tra log: tail -f /path/to/error_log | grep ‘eval|base64’ (tìm dấu vết còn sót). Lý do: Đảm bảo không backdoor qua user, log giúp trace nguồn hack.

Kết thúc: Quét lại toàn diện với Wordfence + công cụ khác.

  • Chạy Wordfence scan lần cuối → Clean.
  • Kiểm tra Sucuri/VirusTotal online để xác nhận. Lý do: Xác thực đa nguồn, tránh false negative.

Ưu tiên làm trên local

Bước 1: Backup toàn bộ site về máy tính

File: zip toàn bộ public_html

Database: export .sql qua phpMyAdmin

Bước 2: Giải nén ra thư mục local (ví dụ: D:\site-bi-hack)

Bước 3: Quét + tìm mã độc cực mạnh trên local

Mở Terminal/PowerShell trong thư mục đó, chạy lệnh:

Bash
# 1. Tìm toàn bộ hàm nguy hiểm (eval, base64, shell_exec...)
grep -rP --include=*.{php,js,html,txt} "(eval|base64_decode|gzinflate|str_rot13|rot13|exec|shell_exec|system|passthru|popen|proc_open|create_function)" . > DANGER.txt

# 2. Tìm chuỗi base64 dài bất thường (>300 ký tự)
grep -rP --include=*.php "base64_decode\('[^']{300,}'" . > LONG_BASE64.txt

# 3. Tìm iframe/script ẩn + webshell
grep -rP --include=*.{php,html} "(<iframe.*display:none|<script.*unescape|document\.write|c99shell|WSO_VERSION|b374k)" . > HIDDEN_IFRAME.txt

# 4. Tìm file .php trong uploads (chắc chắn là shell)
find . -path "*/wp-content/uploads/*" -name "*.php" -o -name "*.phtml" -o -name "*.ico" -o -name "*.jpg" | grep -v ".jpg.jpg"

Bước 4: Giải mã base64 ngay trên local (Python)

Tạo file ví dụ tên là decode.py sau đó chèn đoạn code sau vào:

Python
import base64, sys
if len(sys.argv) < 2:
    print("Usage: python decode.py 'chuoi_base64_here'")
else:
    try:
        print(base64.b64decode(sys.argv[1]).decode('utf-8'))
    except:
        print("Not valid base64")

Bước 4: Tìm thủ công bằng VS Code / Notepad++: Tìm kiếm chuỗi mã độc phổ biến như eval, base64_decode, gzinflate, shell_exec,… trong toàn bộ thư mục.

Bước 5: Phân tích và xóa file nhiễm trên local trước, sau đó upload lại bản sạch lên server.

Quy trình xóa mã độc an toàn

Đầu tiên tắt tất cả plugin thông qua wp-admin hoặc đổi tên thư mục đổi tên thư mục wp-content/plugins thành plugins_old, xóa file lạ qua FTP để xem tình trạng có hết hay cải thiện hơn không. Nếu thấy chưa khả thi thì chuyển qua bước nâng cao sau:

  1. Backup toàn bộ (file + database) trước khi làm bất cứ gì.
  2. Đưa site về maintenance mode: Tạo file .maintenance trong public_html với nội dung: <?php $upgrading = time(); ?>.
  3. Tắt tất cả plugin (đổi tên thư mục wp-content/plugins thành plugins_old).
  4. Tạo user admin mới qua phpMyAdmin (như hướng dẫn trước).
  5. Xóa file lạ qua FTP hoặc SSH.
  6. Thay file core bị sửa bằng bản sạch từ wordpress.org (cùng phiên bản).
  7. Làm sạch database (backup trước):
SQL
-- Kiểm tra trước
SELECT * FROM wp_options WHERE option_value LIKE '%eval%' OR option_value LIKE '%base64%';
-- Xóa
DELETE FROM wp_options WHERE option_value LIKE '%eval(%' OR option_value LIKE '%base64_decode(%';
  1. Reset password tất cả user.
  2. Quét lại bằng Wordfence + Sucuri/VirusTotal.

Ưu tiên làm trên local khi có thể → an toàn, không ảnh hưởng server đang hoạt động.

Bước 4 – Update & vá lỗ hổng

  • Đưa site về chế độ maintenance (dùng plugin WP Maintenance Mode hoặc .htaccess)
  • Update WordPress core lên phiên bản mới nhất (hiện tại 6.7.x hoặc 6.8)
  • Update toàn bộ plugin & theme chính hãng hoặc nhà cung cấp uy tín
  • Xóa sạch plugin/theme nulled (thường có tên: revslider null, avada crack, flatsome nulled…)
  • Lệnh WP-CLI hàng loạt:
Bash
wp core update --force
wp plugin update --all --exclude=akismet,hello
wp theme update --all
wp plugin delete plugin-name-nulled
Update WordPress core plugin theme thành công trên dashboard
Update triệt để để vá lỗ hổng bảo mật

Bước 5 – Tăng cường bảo mật

Các biện pháp cơ bản

Đổi tất cả (WordPress, FTP, database) bằng công cụ như LastPass. Bật 2FA với plugin Two Factor (miễn phí, hỗ trợ Google Authenticator).

Tăng cường bảo mật WordPress với 2FA firewall và quyền file
Các biện pháp harden bảo mật WordPress

Cấu hình lại WordPress và quyền cho file

Thêm vào wp-config.php:

PHP
define('DISALLOW_FILE_EDIT', true);  // Tắt editor theme/plugin
define('FORCE_SSL_ADMIN', true);  // Bắt buộc SSL wp-admin
define('WP_AUTO_UPDATE_CORE', true);  // Auto update core
define('WP_HTTP_BLOCK_EXTERNAL', true);  // Chặn request ngoài
define('WP_ACCESSIBLE_HOSTS', 'api.wordpress.org,downloads.wordpress.org');  // Cho phép chỉ WP repo

Set permission: chmod -R 755 /public_html/ && chmod 644 *.php – dùng SSH.

Firewall & bảo vệ wp-admin

Cài Wordfence Premium hoặc Cloudflare WAF (miễn phí tier). Bảo vệ wp-admin bằng .htaccess hoặc :

Apache
# END WordPress
# BEGIN Custom Security Rules (Thêm các quy tắc bảo mật của bạn ở đây)

# wp-admin/.htaccess
<Files wp-login.php>
    Order Deny,Allow
    Deny from all
    Allow from 113.172.123.45  # IP static của bạn
</Files>

# Hoặc dùng Basic Auth
AuthType Basic
AuthName "Admin Area"
AuthUserFile /home/user/.htpasswd
Require valid-user

# 1. Bảo vệ file wp-config.php
<Files wp-config.php>
   Order allow,deny
   Deny from all
</Files>
# 2. Vô hiệu hóa duyệt thư mục
Options -Indexes
# 3. Bảo vệ file .htaccess chính nó
<Files .htaccess>
   Order allow,deny
   Deny from all
</Files>
# 4. Chặn truy cập vào XML-RPC (Chỉ khi bạn không sử dụng)
<Files xmlrpc.php>
   Order allow,deny
   Deny from all
</Files>
# 5. Chặn tác giả có tên người dùng đáng ngờ (Author Scan)
RewriteEngine On
RewriteCond %{QUERY_STRING} author=(\d*)
RewriteRule .* - [F]
# END Custom Security Rules

Tạo file .htpasswd: dùng để tạo file .htpasswd trong Apache để bật HTTP Basic Authentication

Bash
htpasswd -c .htpasswd username. 

Thêm vào trong file functions.php hoặc tạo 1 custome plugin chèn code php sau:

PHP
/**
* Clean WordPress head tags (unused)
*/
add_action('init', function () {
   // REST API discovery link
   remove_action('wp_head', 'rest_output_link_wp_head', 10);
   // oEmbed discovery
   remove_action('wp_head', 'wp_oembed_add_discovery_links', 10);
   remove_action('wp_head', 'wp_oembed_add_host_js');
   // RSD (Really Simple Discovery - xmlrpc)
   remove_action('wp_head', 'rsd_link');
   // Windows Live Writer
   remove_action('wp_head', 'wlwmanifest_link');
   // WordPress version
   remove_action('wp_head', 'wp_generator');
   // Shortlink
   remove_action('wp_head', 'wp_shortlink_wp_head', 10);
   // Feed links (nếu không dùng RSS)
   remove_action('wp_head', 'feed_links', 2);
   remove_action('wp_head', 'feed_links_extra', 3);
});
// Disable REST API for non-logged-in users
add_filter('rest_authentication_errors', function ($result) {
   if (!is_user_logged_in()) {
       return new WP_Error(
           'rest_disabled',
           __('REST API is disabled.'),
           ['status' => 403]
       );
   }
   return $result;
});
add_filter('xmlrpc_enabled', '__return_false');

Bước 6 – Kiểm tra & theo dõi

Kiểm tra nhanh

Load site từ trình duyệt ẩn danh:

  • Kiểm tra có redirect lạ, pop-up quảng cáo, link spam không?
  • Xem trang chủ, bài viết, trang sản phẩm (nếu có WooCommerce).
  • Kiểm tra tốc độ load (nên nhanh hơn trước nếu đã xóa mã độc nặng).

Quét lại bằng 3 công cụ online/miễn phí:

  • Wordfence (trong wp-admin): Chạy Scan → Xác nhận “No issues detected”.
  • Sucuri SiteCheck: Nhập URL → Kết quả “Site clean”.
  • VirusTotal: Upload file nghi ngờ hoặc kiểm tra URL → Không có engine nào báo nhiễm.

Kiểm tra nhanh qua trình duyệt:

  • Không có cảnh báo “This site may be hacked” từ Google.
  • Không có liên kết lạ trong footer/header/sidebar.

Kiểm tra chuyên sâu

Kiểm tra log server (SSH hoặc cPanel → File Manager → logs): tail -f /var/log/apache2/access.log | grep -i “eval\|base64\|shell\|wp-login\|xmlrpc”

  • Nếu thấy request lạ từ IP nước ngoài → Chặn ngay bằng firewall (Wordfence hoặc Cloudflare).
  • Kiểm tra error_log: tail -n 100 /var/log/apache2/error_log | grep -i “php\|warning\|error”.

Quét sâu bằng Wordfence CLI (nếu đã backup về local): php wordfence-cli.phar scan /path/to/public_html

Kiểm tra toàn diện:

  • Dùng browser dev tools (F12 → Network): Xem có request đến domain lạ (malicious.com, ads.ru…) không?
  • Kiểm tra source code trang (Ctrl+U): Tìm chuỗi “eval”, “base64_decode”, “iframe hidden”.
  • Test chức năng: Đăng nhập, đăng bài, comment những tính năng quan trọng liên quan tới bảo mật hoặc gửi yêu cầu đến backend không có lỗi bất thường nào.

Gỡ blacklist Google

Điều kiện trước khi request review:

  • Site đã sạch 100% (quét lại Wordfence + Sucuri + VirusTotal đều clean).
  • Đã xóa hết mã độc, vá lỗ hổng, harden bảo mật (2FA, firewall, update core/plugin).
Gỡ cảnh báo website bị hack trên Google Search Console
Google Search Console sau khi gỡ blacklist thành công

Các bước thực hiện (làm theo thứ tự):

  1. Đăng nhập Google Search Console: Chọn property site của bạn (nếu chưa có → Add Property).
  2. Kiểm tra tình trạng hiện tại:
    • Vào Security & Manual Actions → Security Issues.
    • Nếu thấy cảnh báo “Hacked” hoặc “Malware” → Ghi chú số lượng issue và loại (ví dụ: Injected content, Malicious redirects).
  3. Submit lại sitemap mới (để Google crawl lại):
    • Vào Sitemaps → Thêm sitemap mới (thường là: sitemap.xml hoặc sitemap_index.xml).
    • Submit → Chờ 5–10 phút để Google chấp nhận.
  4. Request Indexing các trang quan trọng:
    • Vào URL Inspection → Nhập URL trang chủ → Request Indexing.
    • Lặp lại với 5–10 trang chính (trang sản phẩm, bài viết quan trọng).
    • Lý do: Giúp Google ưu tiên crawl lại nội dung sạch.
  5. Request Review để gỡ cảnh báo:
    • Quay lại Security Issues → Nhấn Request Review.
    • Điền mô tả chi tiết (bằng tiếng Anh, ngắn gọn): 
    • Ví dụ: The site has been fully cleaned from malware. All injected code, malicious redirects, and backdoors have been removed. WordPress core, plugins, and themes are updated to the latest versions. Security has been hardened with 2FA, firewall (Wordfence), and file permissions fixed. Multiple scans with Wordfence, Sucuri SiteCheck, and VirusTotal show the site is clean.
    • Submit → Google sẽ review thủ công (thường 1–3 ngày, đôi khi 7 ngày nếu nặng).
  6. Theo dõi tiến trình:
    • Vào Security Issues → Kiểm tra status: “Under review” → “Fixed” (nếu thành công).
    • Nếu bị từ chối → Xem lý do → Fix thêm → Request lại (có thể lặp 2–3 lần).

Lưu ý:

  • Không request review nếu chưa chắc chắn sạch 100% → Google có thể từ chối vĩnh viễn.
  • Nếu site bị blacklist lâu → Traffic có thể giảm 50–90%, cần làm SEO lại sau khi gỡ.
  • Kết hợp Cloudflare (nếu dùng): Bật WAF → Giúp ngăn tấn công mới trong lúc chờ Google approve.

Bảng checklist

Bảng checklist quy trình xử lý virut mình thường thực hiện sau khi diệt mã độc WP bạn có thể tham khảo tại: https://docs.google.com/spreadsheets/d/17Wps4g1Zl8N3x8EPe_sgJk75rbC9cqhonSRuv3dCfKE/edit?usp=sharing

Kết luận

Trên đây là quy trình xử lý mã độc WordPress từ cơ bản đến nâng cao, giúp diệt sạch virus website, vá lỗ hổng và tăng bảo mật WordPress chống tái nhiễm nhanh chóng và hiệu quả. Chúng ta có thể thấy rằng không có một cú click hay một plugin thần thánh tự xử lý tự động hết cả. Từ backup cẩn thận, scan sâu, làm sạch thủ công, update triệt để, harden bảo mật đến kiểm tra lại kỹ lưỡng – mỗi bước đều quan trọng như nhau.

Website WordPress sạch mã độc sau quy trình 6 bước xử lý
Website sạch và an toàn sau 6 bước

Nhưng điều quan trọng nhất vẫn là: phòng ngừa luôn tốt hơn chữa trị, update và backup định kỳ, dùng phần mềm chính hãng và theo dõi log đó mới là cách tiết kiệm thời gian, tiền bạc và giữ website an toàn bền vững. 

Hy vọng bài viết này giúp bạn tự tin bảo vệ website của mình, hoặc áp dụng cho các dự án, giúp Google không còn gắn cờ đen và đánh giá cao nội dung chất lượng.

Chúc bạn thành công để có được một website sạch sẽ, an toàn và phát triển bền vững!

Lê Văn Phúc

LÊ PHÚC

Xin chào các bạn! mình là Lê Văn Phúc (Phuc Lee), chuyên tư vấn & triển khai giải pháp website tối ưu cho các cá nhân và doanh nghiệp. Nếu bạn đang gặp khó khăn hay có bất kì thắc mắc, đừng ngần ngại hãy kết nối với Phúc. Rất vui được đồng hành cùng bạn!