NỘI DUNG
Hướng Dẫn Xử Lý Mã Độc Website WordPress chi tiết nhất. Giúp bạn loại trừ mã độc nhanh chóng.
WordPress là một nền tảng phổ biến, nhưng cũng chính vì vậy mà nó thường trở thành mục tiêu của các cuộc tấn công mã độc. Nếu website của bạn bị nhiễm mã độc, việc xử lý kịp thời và đúng cách là rất quan trọng để khôi phục hoạt động bình thường và bảo vệ dữ liệu. Bài viết này sẽ hướng dẫn bạn từng bước xử lý mã độc trên website WordPress một cách chi tiết và hiệu quả.
Bước 1: Sao lưu dữ liệu cần thiết
Trước khi thực hiện bất kỳ thay đổi nào, việc sao lưu dữ liệu là bước đầu tiên và quan trọng nhất để đảm bảo bạn không mất thông tin quan trọng trong quá trình xử lý.
1. Sao lưu Database
Database là file lưu trữ toàn bộ dữ liệu, nội dung web của bạn. Bạn có thể sử dụng công cụ như phpMyAdmin để sao lưu. Khi sao lưu xong bạn sẽ có một file định dạng .sql

2. Sao lưu thư mục uploads
Thư mục wp-content/uploads
chứa các tệp media như hình ảnh, video. Sử dụng FTP (FileZilla) hoặc File Manager trong hosting để tải toàn bộ thư mục này về máy.

3. Lưu danh sách plugin đang sử dụng
Việc lưu lại danh sách Plugin đang dùng mục đích để thực hiện cài đặt mới hoàn toàn khi xây dựng lại WordPress ở các bước tiếp theo.
Vào mục Plugins trong dashboard WordPress, ghi lại danh sách tất cả plugin đang kích hoạt và phiên bản của chúng. Bạn có thể chụp ảnh màn hình danh sách Plugin

4. Lưu thông tin theme và tùy chỉnh
Bạn hãy truy cập vào wp-content/themes
để xem website đang sử dụng Theme gì. Sau đó chuẩn bị Theme gốc để thực hiện cài đặt mới. Lưu ý nếu bạn sử dụng theme có sẵn các option bạn cũng hãy lưu lại options data của theme để phục vụ cho việc import lại.
Lưu ý: Nếu website có sử dụng theme chilld bạn hãy lưu lại nó.

4. Sao lưu thư mục languages (nếu có):
Nếu website sử dụng bản dịch thủ công (thư mục wp-content/languages
), hãy sao lưu toàn bộ thư mục này.
Bước 2: Cài đặt lại WordPress và khôi phục dữ liệu
Sau khi sao lưu, bạn cần làm sạch website bằng cách cài đặt lại WordPress từ đầu, sau đó khôi phục dữ liệu sạch.
1. Tải phiên bản gốc WordPress lên:
Bạn hãy tải phiên bản mới nhất của WordPress từ wordpress.org về. Sau đó upload lên hosting và giải nén nén ra. Lúc này bạn sẽ có một Core WordPress sạch sẽ.
2. Khôi phục database và uploads:
- Tạo mới database. Import database đã sao lưu vào hosting qua phpMyAdmin hoặc công cụ tương tự.
- Xoá thư mục
uploads
hiện tại của WordPress mặc định đi. Và Upload lại thư mụcwp-content/uploads
vào đúng vị trí mới.
3. Cài đặt lại plugin và theme:
Nếu bạn đang sử dụng các Plugin miễn phí. Bạn có thể tải lại các plugin từ nguồn chính thức (wordpress.org hoặc nhà phát triển uy tín) dựa trên danh sách đã lưu. Không sử dụng bản cũ vì chúng có thể chứa mã độc.

Cài đặt lại theme mới từ file gốc, sau đó import tùy chỉnh (options) nếu có. Lưu ý không sử dụng lại theme gốc vì khả năng rất cao file gốc đã bị nhiễm mã độc.
4. Kiểm tra cấu hình database:
Tạo mới và mở tệp wp-config.php
, kiểm tra và chỉnh sửa tiền tố (prefix) của database (ví dụ: wp_
) để khớp với database cũ, đồng thời thiết lập lại secret key mới.

Sau bước này, bạn sẽ có một website hoạt động bình thường với core WordPress mới, plugin và theme sạch. Tuy nhiên, mã độc có thể vẫn còn ẩn trong database hoặc các tệp khác. Hãy chuyển sang bước tiếp theo để kiểm tra và làm sạch triệt để.
Bước 3: Kiểm tra và loại nỏ Mã Độc
Mã độc rất đa dạng và có thể ẩn ở nhiều nơi. Dưới đây là các bước cơ bản để tìm kiếm và loại bỏ chúng.
1. Kiểm Tra Thư Mục Uploads
Thư mục wp-content/uploads
thường chỉ chứa các tệp media (hình ảnh, video). Sự hiện diện của các tệp PHP hoặc các tệp không liên quan là dấu hiệu của mã độc.
- Tìm các tệp PHP trong thư mục uploads
Sử dụng lệnh sau trong terminal (truy cập qua SSH):
find wp-content/uploads -name "*.php"
Lệnh này liệt kê tất cả tệp .php
. Nếu phát hiện, hãy kiểm tra nội dung. Thông thường, các tệp này không thuộc về thư mục uploads và có thể là mã độc.

Khi tôi mở 1 file lên xem thì chứa một đoạn <script>
độc hại. Và bạn cần xoá chúng ngay lập tức bằng lệnh sau
find wp-content/uploads -name "*.php" -delete

- Tìm các tệp có quyền 644 nhưng không phải ảnh:
Quyền 644 thường áp dụng cho tệp, nhưng trong uploads, chỉ nên có ảnh. Dùng lệnh sau để loại trừ các định dạng ảnh phổ biến:
find wp-content/uploads -type f -perm 644 ! \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.gif" -o -name "*.webp" -o -name "*.bmp" -o -name "*.svg" \)
Nếu phát hiện tệp không phải ảnh, kiểm tra nội dung và xóa nếu nghi ngờ.
- Tìm và xóa tệp .htaccess trong uploads:
Thư mục uploads không cần tệp .htaccess
. Hãy dùng lệnh sau để xoá
find wp-content/uploads -name ".htaccess" -delete
2. Kiểm Tra Mã Độc Trong Database
Mã độc thường lợi dụng và chèn các đoạn mã nguy hiểm vào database, đặc biệt qua các plugin như Insert Headers and Footers hoặc WPCode Lite. Việc kiểm tra database đòi hỏi sự cẩn thận vì không phải mọi đoạn mã đều là mã độc.
- Sử dụng WP-CLI để tìm kiếm:
Dưới đây là các lệnh phổ biến để tìm các đoạn mã nghi ngờ (chạy trong terminal và yêu cầu phải có wp-cli)
wp db search 'eval' --regex --allow-root
wp db search 'base64_decode' --regex --allow-root
wp db search 'sold.js' --regex --allow-root
wp db search 'obj.js' --regex --allow-root
wp db search 'base64' --regex --allow-root
wp db search 'decode' --regex --allow-root
wp db search '<script' --regex --allow-root
wp db search 'invoke.js' --regex --allow-root
wp db search '<iframe' --regex --allow-root
wp db search 'gzuncompress' --regex --allow-root
wp db search 'gzinflate' --regex --allow-root
wp db search 'system' --regex --allow-root
wp db search 'shell_exec' --regex --allow-root
wp db search 'exec' --regex --allow-root
wp db search 'passthru' --regex --allow-root
wp db search 'style="position: absolute' --regex --allow-root
wp db search 'webform' --regex --allow-root
wp db search '\.js' --regex --allow-root | grep -v 'domain.com'
Giải thích: Các đoạn mã như eval
, base64_decode
, exec
thường được mã độc sử dụng để thực thi lệnh nguy hiểm. Các tệp .js
hoặc thẻ bất thường cũng là dấu hiệu khả nghi.
Ngoài ra bạn có thể thêm các từ khóa sau để tìm kiếm:
wp db search 'preg_replace' --regex --allow-root
wp db search 'curl_exec' --regex --allow-root
wp db search 'ob_start' --regex --allow-root
- preg_replace (thường dùng để chèn mã độc).
- curl_exec (gọi mã từ server bên ngoài).
- ob_start (ẩn đầu ra mã độc).
Khi chạy lệnh wp db search
và phát hiện nội dung nghi ngờ, ghi lại ID của bài viết hoặc mục trong database.
Như bên dưới khi chạy lệnh kiểm tra từ base64_decode
. Trong table wp_postmeta
dòng hàng 100600
có chứa nội dung độc hại.


Truy cập phpMyAdmin, vào bảng tương ứng (thường là wp_postmeta
), tìm theo ID và xóa hoặc làm rỗng trường chứa mã độc. Với các bảng khác bạn cũng làm tương tự.

Ngoài ra bạn có thể sử dụng thêm lệnh sau giúp xóa các thẻ <script>
độc hại trong bảng posts
:
- Lệnh này tìm tất cả thẻ
<script>
và nội dung bên trong, sau đó thay bằng chuỗi rỗng, chỉ áp dụng cho cộtpost_content
trong bảngwp_posts
.
wp search-replace '<script>(.+)((\s)+(.+))+</script>' '' --precise --regex $(wp db prefix --allow-root)posts --include-columns=post_content --allow-root 2>/dev/null
3. Quét Lại Website
Sau khi làm sạch thủ công, sử dụng các công cụ để kiểm tra toàn diện:
Công cụ hosting:
Sử dụng trình quét mã độc mặc định như Imunify360 (nếu hosting hỗ trợ). Hầu hết các nhà cung cấp hosting hiện tại đều có sẵn công cụ quét cho khách. Với hosting không có bất kỳ công cụ nào để quét thì đây là một điểm trừ lớn.

Plugin quét mã độc
Hiện trên kho thư viện Plugin miễn phí có rất nhiều Plugin làm việc này. Tuy nhiên sau nhiều lần sử dụng cá nhân tôi đánh giá cao 3 Plugin sau, bạn có thể sử dụng để trải nghiệm
- Anti-Malware Security: Quét và sửa lỗi bảo mật.
- Quttera Web Malware Scanner: Phát hiện mã độc sâu trong tệp. Và hơn hết Plugin này có sẵn trang web online để bạn quét
- Wordfence: Quét toàn diện và bảo vệ thời gian thực.
Công cụ trực tuyến
Tôi sẽ gửi một số ảnh minh hoạ bên dưới để bạn dễ dàng hình dung hơn về web được quét online


Nếu công cụ báo cáo mã độc, xem chi tiết (tệp, đường dẫn) và tiếp tục xóa. Lặp lại cho đến khi không còn thông báo.
Bước 4: Bảo mật cơ bản cho website WordPress
Sau khi loại bỏ mã độc, bạn cần tăng cường bảo mật để tránh tái nhiễm. Tôi đã có viết một bài hướng dẫn bảo mật website WordPress. Bạn có thể tham khảo thêm tại link bên dưới.
1. Reset hosting
Tôi khuyên bạn nên thực hiện reset lại toàn bộ hosting về trạng thái như mới rồi hãy di chuyển website lên. Và khi reset hosting bạn cũng nên yêu cầu nhà cung cấp thay đổi user cho bạn.

2. Thay đổi tiền tố database:
Sửa tiền tố trong wp-config.php
và cập nhật database qua phpMyAdmin hoặc plugin như Change DB Prefix để thay đổi. Việc thay đổi giúp website bạn tăng cường bảo mật hơn khi web đang nằm trong mục tiêu bị tấn công.

3. Thay đổi thông tin đăng nhập:
Thay đổi lại thông tin đăng nhập website WordPress bao gồm Username và Password. Không sử dụng user dạng admin
vì user mặc định rất dễ bị khai thác. Nên sử dụng mật khẩu mạnh (kết hợp chữ, số, ký tự đặc biệt).

4. Cấu hình .htaccess:
.htaccess là một tập tin cấu hình của Apache, dùng để kiểm soát nhiều khía cạnh của website như:
- Bảo mật (hạn chế truy cập, ngăn chặn bot, chặn quét thư mục).
- Chuyển hướng
- Tối ưu hiệu suất
- Quy tắc rewrite (thường dùng với WordPress và các CMS khác).
Dưới đây là một mẫu cấu hình .htaccess
mà tôi sử dụng.
<IfModule mod_headers.c>
Header always set Content-Security-Policy "upgrade-insecure-requests; block-all-mixed-content"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header set X-Frame-Options "sameorigin"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "same-origin"
Header set Permissions-Policy "camera=self; microphone=self"
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# HTTPS redirect
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
# WordPress rules
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# SOFTACULOUS Block author scans
RewriteCond %{QUERY_STRING} (author=\d+) [NC,OR]
RewriteCond %{REQUEST_URI} ^.*wp-json/wp/v2/(users) [NC]
RewriteRule .* - [F]
# Block PHP files in uploads, plugins, themes
RewriteRule ^wp\-content/uploads/.*\.(?:php[1-7]?|pht|phtml?|phps|js)$ - [NC,F]
RewriteRule ^wp\-content/plugins/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F]
RewriteRule ^wp\-content/themes/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F]
# Block wp-includes folder and files
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
# Block XSS attacks
RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F,L]
# Block access to sensitive files
<FilesMatch "^.*(((?:wp-config)\.(?:php|bak|swp))|php.ini|\.[hH][tT][aApP].*|((?:error_log|readme|license|changelog|-config|-sample)\.(?:php|md|log|txt|htm|html)))$">
Require all denied
</FilesMatch>
# Block access to xmlrpc.php
<files xmlrpc.php>
Require all denied
</files>
# Block access to .htaccess and .htpasswd
<FilesMatch ^(?i:\.ht.*)$>
Require all denied
</FilesMatch>
# Disable directory browsing
Options -Indexes
# Block bot access
RewriteCond %{HTTP_USER_AGENT} (?:virusbot|spambot|evilbot|acunetix|BLEXBot|domaincrawler\.com|LinkpadBot|MJ12bot/v|majestic12\.co\.uk|AhrefsBot|TwengaBot|SemrushBot|nikto|winhttp|Xenu\s+Link\s+Sleuth|Baiduspider|HTTrack|clshttp|harvest|extract|grab|miner|python-requests) [NC]
RewriteRule ^(.*)$ http://no.access/
</IfModule>
5. Cài plugin bảo mật:
Bạn có thể sử dụng thêm All-in-One WP Security & Firewall để thiết lập tường lửa, chống brute force và các tính năng bảo mật khác. Xem hướng dẫn chi tiết tại link bên dưới
Kết luận
Trên đây là quy trình hoàn chỉnh để xử lý mã độc trên website WordPress, từ sao lưu, làm sạch, quét mã độc đến bảo mật. Việc thực hiện cẩn thận từng bước sẽ giúp website của bạn hoạt động ổn định và an toàn hơn. Hãy luôn cập nhật plugin, theme và lõi WordPress để giảm thiểu rủi ro trong tương lai.
Nếu bạn gặp khó khăn trong quá trình xử lý mã độc hoặc cần hỗ trợ chuyên sâu, hãy liên hệ với tôi. Tôi sẵn sàng kiểm tra và xử lý triệt để cho website của bạn.