Trống Đồng Đông Sơn

Lỗ hổng wp2shell WordPress (mã hiệu CVE-2026-63030) vừa bùng nổ đang là mối đe dọa hàng đầu đối với hàng triệu website WordPress trên toàn cầu. Đây là lỗ hổng RCE (Remote Code Execution) cho phép kẻ tấn công chiếm quyền điều khiển server mà không cần đăng nhập. Tuy WordPress đã phát hành bản vá 7.0.2 / 6.9.5 / 6.8.6, nhưng việc chỉ bấm nút nâng cấp Core là chưa đủ để dọn dẹp các tài khoản ngầm và webshell đã bị chèn từ trước.

Bài viết này chia sẻ quy trình thực chiến giúp bạn rà soát, dọn dẹp sạch sẽ mã độc và nâng cấp an toàn cho hàng loạt máy chủ Linux (CyberPanel, cPanel, DirectAdmin) mà không gây gián đoạn dịch vụ.

Lỗ hổng wp2shell WordPress là gì và tại sao nâng cấp thôi là chưa đủ?

Lỗ hổng Lỗ hổng wp2shell WordPress xảy ra ở lớp REST API cho phép hacker thực thi mã từ xa. Ngay sau khi PoC xuất hiện, các đợt quét tự động trên toàn thế giới đã chèn tài khoản Admin ẩn và webshell vào các trang chưa kịp vá.

Nhiều quản trị viên lầm tưởng rằng chỉ cần bấm nút “Update WordPress” là xong. Thực tế, bản nâng cấp của WordPress chỉ vá lỗ hổng đầu vào, chứ không xóa các file webshell hay tài khoản rác đã bị tạo trong Database. Nếu không dọn sạch các dấu vết này, hacker vẫn có thể truy cập trở lại bất kỳ lúc nào.

Lỗ hổng wp2shell WordPress

Dấu vết nhận diện mã độc wp2shell trên Server

Khi kiểm tra máy chủ, mã độc wp2shell thường để lại 3 nhóm dấu vết đặc trưng sau đây:

  • Tài khoản Admin ẩn trong Database: Các username có tiền tố wpsvc_, wp2_, w2s_, wp_admin_ hoặc email có đuôi @wp2shell.*, @wordpress-svc.internal, @wordpress-noreply.net.
  • Webshell ngụy trang Plugin: Các thư mục nằm trong wp-content/plugins/ có tên kèm chuỗi hex ngẫu nhiên như media-optimization-core-8ed2ad, security-headers-manager-2a70a3 chứa file PHP nhỏ khai thác qua tham số ?c=.
  • File ẩn trong mu-plugins: Các file PHP nằm tại wp-content/mu-plugins/ (như wp-fixplugin.php) chạy ngầm để tự động tạo lại tài khoản Admin rác mỗi khi bị xóa.

Quy trình 4 bước rà soát & dọn dẹp wp2shell hàng loạt

Bước 1: Quét nhanh tài khoản ngầm bằng MySQL Root

Thay vì chạy WP-CLI nạp môi trường PHP tốn tài nguyên, việc truy vấn trực tiếp vào MySQL Root giúp bạn quét hàng trăm trang web chỉ trong 2-3 giây mà không lo lỗi phân quyền:

for dir in /home/*/public_html; do
  if [ -f "$dir/wp-config.php" ]; then
    domain=$(basename $(dirname "$dir"))
    dbname=$(grep -E "DB_NAME" "$dir/wp-config.php" | cut -d'"' -f4)
    prefix=$(grep -E "table_prefix" "$dir/wp-config.php" | cut -d'"' -f2)
    [ -z "$prefix" ] && prefix="wp_"
    
    if [ ! -z "$dbname" ]; then
      result=$(mysql --batch --skip-column-names -e "USE \`$dbname\`; SELECT CONCAT('ID: ', u.ID, ' | User: ', u.user_login, ' | Email: ', u.user_email) FROM \`${prefix}users\` u JOIN \`${prefix}usermeta\` m ON u.ID = m.user_id WHERE m.meta_key = '${prefix}capabilities' AND m.meta_value LIKE '%administrator%' AND (u.user_login REGEXP '^w2s_|^wp_admin_|^wp2_|^wpsvc_|^wp2shell' OR u.user_email REGEXP '\\.invalid|\\.local$|internal|wp2shell|shellcode');" 2>/dev/null)
      if [ ! -z "$result" ]; then
        echo "=== ⚠️  Phát hiện Admin mã độc trên $domain (DB: $dbname) ==="
        echo "$result"
      fi
    fi
  fi
done

Bước 2: Sử dụng công cụ chính thức wp2shell-scan để cách ly Webshell

Công cụ wp2shell-scan chính thức từ InstaWP giúp bạn đưa các file webshell bị phát hiện vào thư mục cách ly (Quarantine) và đổi lại mã muối SALT bảo mật:

curl -fsSLO https://raw.githubusercontent.com/InstaWP/wp2shell-scan/main/wp2shell-scan.sh
chmod +x wp2shell-scan.sh
./wp2shell-scan.sh --path /home/domain-bi-dinh.com/public_html --clean --yes

Bước 3: Khắc phục phân quyền & Nâng cấp WordPress Core chuẩn SysAdmin

Trên các máy chủ CyberPanel hoặc LiteSpeed, lệnh sudo -u thường bị lỗi thiếu mysqli do /usr/bin/php bị giới hạn. Chúng ta cần chỉ định trực tiếp phiên bản LiteSpeed PHP (như lsphp81) để nâng cấp an toàn dưới quyền user:

for dir in /home/*/public_html; do
  if [ -f "$dir/wp-config.php" ]; then
    domain=$(basename $(dirname "$dir"))
    owner=$(stat -c '%U' "$dir")
    echo "=========================================="
    echo "🔄 Updating: $domain (User: $owner)"
    echo "=========================================="
    
    mkdir -p "$dir/wp-content/upgrade"
    chown -R "$owner:$owner" "$dir/wp-content/upgrade"
    chmod 755 "$dir/wp-content/upgrade"
    
    sudo -u "$owner" /usr/local/lsws/lsphp81/bin/php /usr/bin/wp core update --path="$dir" --skip-plugins --skip-themes 2>&1 | grep -viE "<|translation|bản dịch"
  fi
done

Bước 4: Kiểm tra lại phiên bản sau khi nâng cấp

Cuối cùng, chạy đoạn script kiểm tra nhanh phiên bản toàn bộ website để đảm bảo 100% trang web đã lên bản WordPress 7.0.2 an toàn:

for dir in /home/*/public_html; do
  if [ -f "$dir/wp-config.php" ]; then
    domain=$(basename $(dirname "$dir"))
    version=$(grep '$wp_version =' "$dir/wp-includes/version.php" 2>/dev/null | cut -d'"' -f2)
    printf "%-35s : %s\n" "$domain" "${version:-N/A}"
  fi
done

Những lưu ý quan trọng tránh tái nhiễm mã độc

Dọn dẹp hệ thống đang chạy mới chỉ là một nửa chặng đường. Bạn cần thực hiện thêm các lưu ý sau để bảo vệ website toàn diện:

  • Làm sạch cả file Backup/Snapshot: Nếu bạn restore từ bản backup được tạo trong thời gian website bị nhiễm, hệ thống sẽ bị dính mã độc trở lại ngay lập tức. Hãy dùng cờ --sql backup.sql để kiểm tra file backup trước khi restore.
  • Tránh quét nhầm tài khoản thật: Không nên dùng từ khóa shell chung chung khi quét SQL vì sẽ bị quét nhầm các tài khoản người dùng hợp lệ có tên tiếng Anh như Shelley, Shelly, Shellie.
  • Liên hệ dịch vụ chuyên nghiệp: Nếu hệ thống lớn có nhiều server phức tạp, hãy sử dụng giải pháp dịch vụ Digital Marketing của DPS.MEDIA và tối ưu hạ tầng để được hỗ trợ bảo mật hệ thống toàn diện nhất.

Ý kiến bạn đọc (9)

DPS SECURITY

Đăng nhập để bình luận

Đăng nhập nhanh 1-chạm bằng Google để chia sẻ ý kiến của bạn về bài viết.