Hôm nay mình lại phải gõ bài khẩn cấp cho anh em: Forminator Forms, plugin tạo form hơn 600.000 site WordPress đang dùng, vừa bị phát hiện lỗ hổng CVE-2026-15748 với điểm CVSS 9.8 cho phép kẻ tấn công chưa đăng nhập tải thẳng file PHP độc hại lên server. Nếu site bạn đang chạy Forminator 1.56.1 trở xuống thì dừng mọi việc lại và cập nhật lên 1.56.2 ngay, vì lỗ hổng này khai thác được từ form công khai, không cần tài khoản.
Lỗ hổng Forminator CVE-2026-15748 nguy hiểm như thế nào?

Đây là lỗ hổng Unauthenticated Arbitrary File Upload, nghĩa là bất kỳ ai cũng có thể gửi request giả mạo tới form công khai của bạn để tải lên file PHP. Nhà nghiên cứu daroo báo cáo qua chương trình bug bounty của Wordfence và nhận 2.048 USD. Vấn đề nằm ở chỗ Forminator chấp nhận cấu hình upload do kẻ tấn công kiểm soát thông qua field Select, kết hợp cách vượt blocklist extension bằng pattern ph(p) và MIME type text/x-php. Nếu file PHP rơi vào thư mục có thể thực thi, attacker có webshell toàn quyền server: chạy lệnh, lấy credential database, cài malware.
Cách kiểm tra site có đang gặp rủi ro không?
Mình làm theo 3 bước sau. Đầu tiên, kiểm tra phiên bản plugin bằng WP-CLI ngay trên server. Thứ hai, xem Forminator có form nào dùng field upload hay không, vì lỗ hổng chỉ khai thác được qua form đã publish có field Select và upload. Thứ ba, rà thư mục upload của Forminator tìm file PHP khả nghi. Toàn bộ lệnh mình để ở phần dưới, anh em copy chạy là được.
Kiểm tra phiên bản hiện tại:
sudo -u www-data wp plugin list --path=/var/www/example.com/public_html | grep forminator
Kiểm tra thư mục upload mặc định của Forminator có file PHP nào không:
find /var/www/example.com/public_html/wp-content/uploads/forminator/ -name "*.php" -ls
Nếu lệnh find trả về kết quả bất kỳ, khả năng cao site đã bị khai thác. Anh em lưu ý thêm: nếu cấu hình custom upload path ra ngoài thư mục mặc định thì phải rà cả đường dẫn đó, vì .htaccess chặn PHP execution chỉ có sẵn ở thư mục mặc định.
Cách vá lỗ hổng và cập nhật lên 1.56.2 đúng chuẩn?
Nhà phát hành đã vá trong bản 1.56.2 phát hành ngày 31/7/2026, nên cách an toàn nhất vẫn là cập nhật plugin. Với mình, trước khi bấm update bao giờ cũng backup trước, kể cả khi đây chỉ là update minor. Quy trình 4 bước mình áp dụng:
Bước 1 — backup thư mục plugin và database:
cd /var/www/example.com/public_html/wp-content/plugins/
tar -czf /root/forminator-backup-$(date +%F).tar.gz forminator/
sudo -u www-data wp db export /root/db-backup-$(date +%F).sql --path=/var/www/example.com/public_html
Bước 2 — cập nhật plugin:
sudo -u www-data wp plugin update forminator --path=/var/www/example.com/public_html
Bước 3 — xác nhận phiên bản mới:
sudo -u www-data wp plugin list --path=/var/www/example.com/public_html | grep forminator
# Kết quả phải là 1.56.2 trở lên
Bước 4 — smoke test nhanh: mở một form có upload, thử gửi file đính kèm bình thường. Nếu gửi thành công và file nằm đúng thư mục upload là ổn.
Rà soát dấu vết tấn công sau khi vá như thế nào?
Vá xong chưa phải là hết việc, vì attacker có thể đã cài webshell từ trước. Anh em rà 3 nơi theo thứ tự ưu tiên. Thứ nhất là thư mục upload tìm mọi file .php như lệnh find ở trên. Thứ hai là access log tìm request POST bất thường tới URL chứa /forminator/ hoặc request GET trực tiếp tới file .php trong thư mục upload:
grep -E "POST.*forminator" /var/log/nginx/access.log | grep -v " 200 " | tail -50
grep -E "GET.*uploads/forminator.*\.php" /var/log/nginx/access.log
Thứ ba, kiểm tra danh sách user admin và plugin bất thường:
sudo -u www-data wp user list --role=administrator --path=/var/www/example.com/public_html
sudo -u www-data wp plugin list --path=/var/www/example.com/public_html | grep -v active
Ngoài ra mình khuyên anh em chặn thực thi PHP trong toàn bộ thư mục uploads bằng rule Nginx hoặc Apache, đây là lớp phòng thủ cuối cùng rất hiệu quả với mọi lỗ hổng upload tương tự. Với Nginx chỉ cần một khối location:
location ~* /uploads/.*\.php$ { deny all; }
Mình rút ra được gì từ đợt này?
Điểm đáng nói của CVE-2026-15748 là blocklist extension lại lần nữa bị vượt bằng một trick đơn giản như ph(p). Đây là lý do mình luôn theo triết lý defense in depth: plugin phải cập nhật nhanh, nhưng server cũng phải tự bảo vệ mình bằng cách chặn PHP execution ở thư mục upload. Anh em quản lý nhiều site thì nên dùng tool quản lý update tập trung, hoặc tối thiểu đặt lịch kiểm tra phiên bản plugin mỗi tuần bằng WP-CLI. Nếu muốn đọc thêm về các lỗ hổng plugin WordPress gần đây, xem thêm bài Pods CVE-2026-19598 và Elementor Pro RCE CVE-2026-32475 mà mình đã hướng dẫn trước đó.