Forminator Forms CVE-2026-15748 CVSS 9.8: 600.000 Site WordPress Nguy Hiểm Vì Lỗi Upload File, Hướng Dẫn Kiểm Tra Và Vá Ngay

Mình vừa đọc báo cáo của Wordfence về lỗ hổng trong Forminator Forms và phải nói thẳng: đây là kiểu lỗi mà dân quản trị website hay coi nhẹ nhất, vì “cái form liên hệ thì có gì đâu”. Nhưng chính cái form đó lại là cửa ngõ cho attacker upload file PHP thẳng lên server của bạn. Forminator Forms có hơn 600.000 bản cài đặt active, và lỗ hổng này cho phép kẻ tấn công chưa đăng nhập upload file tùy ý, kể cả file PHP thực thi, dẫn đến RCE và chiếm toàn bộ site.

Forminator Forms dính lỗi gì và nghiêm trọng đến mức nào?

Lỗ hổng nằm ở hàm handle_file_upload của plugin Forminator Forms trong tất cả các phiên bản đến 1.56.1, được gán mã CVE-2026-15748 với điểm CVSS 9.8 Critical. Đây là lỗi Unauthenticated Arbitrary File Upload, nghĩa là kẻ tấn công không cần tài khoản, không cần đăng nhập, chỉ cần gửi request crafted tới endpoint submit form là có thể upload file PHP lên web server. Nếu file đó nằm ở thư mục public, attacker chỉ cần truy cập trực tiếp URL là chạy code tùy ý: cài webshell, spam, lấy database, thậm chí tiến sâu vào hạ tầng hosting. Wordfence cũng xác nhận điều kiện khai thác: form phải có sẵn một File Upload field thật, và attacker sẽ lợi dụng chính field đó.

Cơ chế khai thác hoạt động như thế nào?

Phần này hơi technical nhưng mình cố gắng giải thích thật rõ, vì hiểu cơ chế sẽ giúp bạn phòng tránh tốt hơn về sau. Có ba mắt xích chain lại với nhau:

Thứ nhất, sanitizer tổng quát của Forminator trả nguyên vẹn giá trị lồng nhau của các field dạng select-*, radio-*, checkbox-* mà không làm sạch trước. Thứ hai, hàm set_field_data() trong class Forminator_CForm_Front_Action tin luôn các property attacker gửi kèm và nhét vào field_data_array trước khi validator của field kịp chạy. Kẻ tấn công dùng một Select field bình thường trên form làm “carrier”, nhét vào đó một bản ghi giả mạo khai báo field_typeupload kèm cấu hình file-type do chính hắn kiểm soát.

Thứ ba, khi form có File Upload field thật, hàm process_uploads() trong class Forminator_Upload lặp qua toàn bộ field_data_array, tin giá trị field_type, dùng name do attacker cung cấp để chọn file input, rồi truyền field_array của attacker vào handler như thể đó là cấu hình đáng tin. Cơ chế chặn phần mở rộng nguy hiểm của plugin khớp key một cách chính xác, nên bị bypass bằng các key MIME kiểu pipe-alternative. Kết quả: file .php vượt qua validation và nằm gọn trên server.

Bạn kiểm tra site có đang dính không bằng cách nào?

Bạn cần làm ba việc, theo đúng thứ tự này. Kiểm tra phiên bản plugin trước:

sudo -u www-data wp plugin list --path=/var/www/site/public_html | grep forminator

Nếu version nhỏ hơn hoặc bằng 1.56.1 là bạn đang nằm trong vùng affected. Tiếp theo, bật mắt lên xem trong form nào đang dùng File Upload field, vì đây là điều kiện khai thác:

sudo -u www-data wp db query "SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%forminator%';" --path=/var/www/site/public_html

Cuối cùng, rà dấu vết trong thư mục uploads bằng cách tìm file PHP mới được tạo gần đây, một dấu hiệu kinh điển sau khai thác:

find /var/www/site/public_html/wp-content/uploads -name "*.php" -mtime -30
ls -lat /var/www/site/public_html/wp-content/uploads/forminator/ | head

Mình đã từng dọn site bị webshell và tin mình đi, thấy một file .php nằm trong uploads/forminator/ thì gần như chắc chắn đã bị.

Cách vá lỗi Forminator CVE-2026-15748 đúng chuẩn?

Vendor đã phát hành bản vá hoàn chỉnh ngày 31/7/2026. Việc duy nhất bạn cần làm là cập nhật lên 1.56.2 trở lên:

sudo -u www-data wp plugin update forminator --path=/var/www/site/public_html

Nếu bạn chạy nhiều site, dùng WP-CLI loop qua từng site thay vì ngồi bấm tay từng admin dashboard. Sau khi update, vào lại form có File Upload field, mở cài đặt field đó và rà lại phần Allowed File Types: chỉ chừa đúng các extension thực sự cần như pdf, png, jpg. Đừng bao giờ để kiểu “tất cả file types” vì đó là tự mở cửa. Với ai không update được ngay, tạm thời bật rule Malicious File Upload protection trên WAF hoặc vô hiệu hóa File Upload field trong vài ngày.

Làm sao để vụ này không lặp lại?

Theo quan điểm của mình, gốc rễ không nằm ở Forminator mà ở thói quen: form builder là plugin có quyền ghi file lên server, vậy thì nó phải nằm trong nhóm được cập nhật tự động và được theo dõi sát nhất, ngang với WooCommerce chứ không phải “plugin phụ”. Ba việc mình làm với mọi site khách hàng: bật auto-update cho plugin form, chặn thực thi PHP trong toàn bộ wp-content/uploads bằng một rule Nginx ngắn gọn, và theo dõi file mới trong uploads bằng audit rule. Đoạn Nginx này nên có trên mọi server WordPress:

location ~* ^/wp-content/uploads/.*\.php$ {
    deny all;
}

Chỉ một dòng config này đã vô hiệu hóa toàn bộ giá trị khai thác của arbitrary file upload, dù plugin có dính lỗi đi nữa. Chặn thực thi PHP ở uploads là lớp phòng thủ rẻ nhất, hiệu quả nhất, mà mình thấy quá ít VPS tự cấu hình sẵn. Nếu bạn chưa có, thêm vào ngay hôm nay, đừng đợi tới CVE kế tiếp.

Mình nên làm gì trong 24 giờ tới?

Tóm gọn checklist: kiểm tra phiên bản Forminator trên toàn bộ site bạn quản lý, cập nhật lên 1.56.2 ngay nếu chưa, rà soát file PHP bất thường trong thư mục uploads, siết lại Allowed File Types của mọi upload field, và thêm rule chặn thực thi PHP trong uploads ở tầng web server nếu chưa có. Toàn bộ các bước trên làm xong trong dưới một giờ cho một site, rẻ hơn rất nhiều so với chi phí dọn site bị hack. Nếu bạn phát hiện dấu hiệu lạ, đọc tiếp hướng dẫn kiểm tra webshell WP-SHELLSTORM mình đã chia sẻ trước đây để xử lý triệt để.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *