Với các website bị hack nặng nhẹ như thế nào mà từ đó đưa ra các phương án xử lý, thường thì mình sẽ dựa theo qui trình bên dưới:
1. Tiến hành cho website về trạng thái ngừng hoạt động (Suspend)
Khi website bị suspend dịch vụ thì không còn ở trên môi trường internet nữa, thì bên ngoài không thể truy cập vào để tiến hành đăng bài viết hay tác động đến website. Trừ trường hợp nếu như web hosting hay VPS bị tấn công.
2. Tiến hành backup website
Tiến hành backup mã nguồn website và database, có thể sử dụng công cụ backup của VPS, Websever, hay backup thủ công bằng ftp. Việc này đảm bảo rằng trong quá trình thao tác của bạn nếu như làm sai vẫn có thể dùng bản backup thử lại. Một số các backup phổ biến:
- Backup bằng rsync trong vps.
- Backup bằng tool backup trong websevices
- Backup bằng duplicator plugins trong wordpress
3. Dùng tool để quét mã nguồn
Sau khi backup xong mà nguồn thì mình sẽ dùng một tool nào đó để quét shell, kiểm tra file bất thường, kiểm tra virus có trong source. Thông thường thì mình sử dụng Imunify AV để quét mã nguồn, thường thì loại AV này đi theo các panel ngoài ra bạn có thể cài với dạng standard alone để sử dụng. Với Imunify AV sẽ quét ra hầu hết các file nào chứa shell, file nào bất thường như ảnh chứa có, file .htaccess bị thay đổi.
Một cách nữa là mình sẽ download source về dùng một chương trình Antivirus để quét source xem có file nào bị đổi đuôi hay chèn file thực thi vào không, nhưng Imunify AV đã đáp ứng đủ rồi.
Làm sao nhận biết file đã nhiễm shell, cách rõ ràng nhất là sẽ xuất hiện theo các đoạn code lạ có mã hóa được chèn vào đầu các file, các bạn không đọc được. Các hàm hay được sử dụng là:
- base64
- str_rot13
- gzuncompress
- eval
- exec
- system
- assert
- stripslashes
- preg_replace (with /e/)
- move_uploaded_file
Các hàm trên thường được sử dụng để mã giải mã và thực thi các đoạn code.
Khi quét mã nguồn xong các bạn sẽ biết được các file nào đã dính mã độc, có bao nhiêu file, và ở những vùng nào, từ đó mà quyết định xử lý ra sao.
4. Kiểm tra cơ sở dữ liệu
Trường hợp với website khi bị hack thay đổi mã nguồn thì có thể tìm các file cũ chép đè, việc database bị hack chèn dữ liệu nếu không có backup thì sẽ khiến bạn đau đầu hơn. Thường thì bạn export cơ sở dữ liệu về local, dùng tool tìm các chuỗi:
- base64_decode
- eval
- <iframe
- <script
để kiểm tra xem có những link, đoạn code nào bất ngờ không để xóa đi. Việc này thường tùy thuộc vào kinh nghiệm người thực hiện hơn. Sau khi xử lý ổn thoải thì import trở lại.
5. Chép đè code phần core, theme, plugins
Để đỡ thời gian để kiểm tra từng file nào đã nhiễm shell thì thường chúng ta sẽ kết hợp chép đè các file gốc, từ đó loại bỏ dần các file chúng ta có mã nguồn ra khỏi list file cần xử lý. Thường thì mình sẽ:
Chép đè phần core wordpress
Tiến hành lên wordpress.org để tải mã nguồn mới nhất về, tiến hành giải nén và chép đè các phần sau đây:
- Thư mục wp-admin
- Thư mục wp-includes
- Các file bên ngoài thư mục root trừ wp-config.php
- Không chép đè thư mục wp-content và phần này chứa file media của website, theme và plugins ở bước tiếp.
Chép đè phần themes, plugins
Đối với các theme hay plugins bạn có mã nguồn thì bạn tiếp hành vào: wp-content/themes, wp-content/plugins để chép đè phiên bản tương ứng là được. Thường thì theme, plugins nằm ở trang bán cho bạn, plugins hay theme free của wordpress sẽ nằm ở trang chủ, bạn tìm tên plugins là ra.
Đối với các theme hay plugins mọi người không có bản sạch thì có thể sử dụng phương án tìm shell rồi xóa đi các đoạn code được thêm vào.
6. Xử lý phần wp-content/uploads
Với thư mục wp-content/uploads thường thì chứa file người dùng upload lên cho media hay file. Ở đây ngoài ra còn có 1 số folder cho plugins, các folder này đôi khi chứa các file php. Với các file php thì kiểm tra thủ công xem đoạn code nào được chèn vào thì xóa bỏ, các file media mà chứa code thì xóa đi. Trong một số folder dùng để upload media thì xóa file php đi.
Ngoài ra ở đây còn có 1 số file .htaccess do virus tạo ra thì xóa hết đi. Sau đó dùng tool quét lại xem đã tiêu diệt hết chưa.
7. Bảo mật lại website
Sau khi đã loại bỏ tất cả các file nghi ngờ, và xóa các đoạn shell trong code. Các bạn thực hiện thêm các hành động sau giúp mình:
Đổi chuỗi salt trong wp-config.php
Salt là chuỗi mà wordpress sử dụng để mã hóa khi người dùng đăng nhập, một khi chuỗi bị đổi bạn sẽ bị đăng xuất ra. Việc đổi salt đảm bảo chuỗi mã hóa cũ bị tấn công không còn sử dụng được nữa. Xem thêm về Salt: https://kinsta.com/knowledgebase/wordpress-salts/
Có thể dùng plugins hay truy cập vào, link bên dưới để lấy chuỗi mới sử dụng thay thế trong file wp-config.php
Thay đổi thông tin database trong wp-config.php
Một khi hacker đã truy cập được vào file config của bạn, họ đã có tên database, user và tài khoản đăng nhập. Từ đó có thể truy cập vào lấy dữ liệu hay chèn thêm các đoạn code hay thêm user mới để chiếm quyền.
Thay đổi lại username và password và table_prefix để tránh bị dựa vào các thông tin cũ để tấn công vào cơ sở dữ liệu.
Chặn edit file trên wordpress
Thêm chuỗi vào wp-config.php
define('DISALLOW_FILE_EDIT',true);
Chặn cài theme, plugins mới
Thêm chuỗi vào wp-config.php
define('DISALLOW_FILE_MODS',true);
Cấu hình file .htaccess
Cấu hình .htaccess thông thường sẽ có nội dung như sau:
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
Đối với trường hợp cài thêm một số plugins như litespeed cache thì .htaccess sẽ thay đổi, bạn cần phải xem nội dung để quyết định. Mình có 1 một file .htaccess đã cấu hình tốt, các bạn có thể tham khảo:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# Blocks all wp-includes folders and files
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
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]
</IfModule>
# Blocks some XSS attacks
<IfModule mod_rewrite.c>
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]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
# Disable PHP in Uploads - Security > Settings > System Tweaks > PHP in Uploads
RewriteRule ^wp\-content/uploads/.*\.(?:php[1-7]?|pht|phtml?|phps|js)$ - [NC,F]
# Disable PHP in Plugins - Security > Settings > System Tweaks > PHP in Plugins
RewriteRule ^wp\-content/plugins/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F]
# Disable PHP in Themes - Security > Settings > System Tweaks > PHP in Themes
RewriteRule ^wp\-content/themes/.*\.(?:php[1-7]?|pht|phtml?|phps)$ - [NC,F]
</IfModule>
# Bock access xmlrpc.php
<Files xmlrpc.php>
Order deny,allow
Deny from all
</Files>
# Bock access wp-config.php
<Files wp-config.php>
Order deny,allow
Deny from all
</Files>
# Bock access license.txt
<Files license.txt>
Order deny,allow
Deny from all
</Files>
# Bock access readme.html
<Files readme.html>
Order deny,allow
Deny from all
</Files>
# Bock access .htaccess
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>
Options -Indexes
8. Trong phần quản trị
Tiến hành thực hiện một số hành động sau:
Cập nhật danh sách user, mật khẩu
Trong phần quản trị tiến hành:
- Xóa thành viên nghi ngờ, không sử dụng nữa
- Phân quyền lại thành viên sao cho chỉ những người quan trọng mới nắm quyền cao nhất.
- Đăng xuất tất cả các thành viên
- Đổi mật khẩu tài khoản quản trị và các thành viên để an toàn.
Cập nhật file sitemap.xml, robot.txt
Kiểm tra sitemap và cập nhật lại, đồng thời kiểm tra robot.txt để tránh trường hợp ảnh hưởng đến seo.
Cập nhật core, themes, plugins
Cập nhật phần core, theme, plugins lên bản mới nhất để fix các lỗi bảo mật nếu có.
9. Kiểm tra lại vps
Thường thì kiểm tra trong code, database, trang quản trị là chưa đủ. Đôi khi một số hacker có thể tấn công vào sâu hơn trong vps ví dụ như:
Cho chạy 1 tiến trình ẩn nào đó thực hiện nhiệm vụ như cày coin, tấn công hay thêm dữ liệu, hay chạy các task theo thời gian. Làm sao để kiểm tra:
- Kiểm tra trong linux dùng lệnh: top để xem tiến trình, xem tiến trình nào ăn cpu, lạ, nghi ngờ.
- Xem detail process bằng proc.
- Kiểm tra cron job đang chạy trên sever.
Kết luận
Đây là những điều mình đúc kết được trong quá trình xử lý một vài website bị hack. Ở bài viết kế tiếp mình sẽ chia sẻ những cách để tránh bị hack trở lại.