600.000 Website WordPress Trước Nguy Cơ RCE: Lỗ Hổng Forminator Nguy Hiểm Đến Đâu?

Tổng Quan
Hãy hình dung một kịch bản tưởng chừng bất khả thi: Một kẻ tấn công hoàn toàn xa lạ, không có tài khoản quản trị, không cần đăng nhập, và cũng chẳng cần đánh lừa bất kỳ ai nhấp vào đường dẫn độc hại. Chỉ bằng một HTTP Request duy nhất gửi đến biểu mẫu liên hệ trên trang web của bạn, kẻ đó đã lặng lẽ biến một tệp tin mã độc PHP thành tệp hợp lệ, đưa thẳng nó vào ổ đĩa máy chủ và ngay lập tức chiếm toàn bộ quyền điều khiển hệ thống (RCE).
Điều đáng nói là điểm tựa cho cuộc tấn công này lại nằm ở một thành phần ngây thơ nhất: Chiếc danh sách chọn (Select field) - nơi người dùng thường nhấp vào để chọn "Bộ phận cần liên hệ" hoặc "Loại dịch vụ".
Làm thế nào một trường danh sách chọn bình thường lại có thể bị "hô biến" thành một mảng cấu hình giả mạo, ép hệ thống tin rằng nó là một trường Upload đáng tin cậy? Và tại sao một cặp dấu ngoặc đơn đơn giản như ph(p) lại có thể đánh gục hoàn toàn bộ lọc danh sách đen (Blocklist) nguy hiểm của WordPress?
Lỗ hổng mang mã hiệu CVE-2026-15748 với điểm số tuyệt đối CVSS 9.8 (Critical) chính là câu trả lời cho chuỗi sơ hở logic tinh vi này. Với hơn 600.000 trang web WordPress đang sử dụng plugin Forminator Forms (trong đó ước tính 300.000+ trang web chứa biểu mẫu nguy hiểm), đây là một trong những lỗ hổng RCE đáng chú ý nhất trong năm 2026.
Nếu bạn muốn biết:
Kẻ tấn công đã đánh lừa luồng xử lý mã nguồn PHP của Forminator bằng kỹ thuật chèn mảng (Carrier Field Injection) ra sao?
Cấu trúc request thực tế và cách dựng môi trường Lab cục bộ để tự tay kiểm chứng nguyên lý hoạt động?
Các bước phòng thủ củng cố máy chủ (Server Hardening) nhằm chặn đứng mọi đợt quét tự động từ các mạng lưới botnet?
Hãy cùng đi sâu vào phần phân tích kỹ thuật chi tiết bên dưới.
Tổng Quan Về Forminator Forms
Để hiểu lý do tại sao lỗ hổng này lại gây ảnh hưởng quy mô lớn, trước hết chúng ta cần tìm hiểu bản chất và vị trí của Forminator Forms trong hệ sinh thái WordPress.
Forminator Forms là một plugin tạo biểu mẫu toàn diện được phát triển bởi WPMU DEV - một trong những nhà phát triển phần mềm lâu đời và uy tín nhất cho WordPress. Plugin này hiện đạt cột mốc hơn 600.000 bản cài đặt hoạt động (Active Installations) trên trang chính thức WordPress.org và liên tục nằm trong Top các lựa chọn hàng đầu cho quản trị viên web.
Các tính năng cốt lõi khiến Forminator phổ biến:
Trình dựng kéo-thả trực quan (Drag-and-Drop Form Builder): Cho phép người dùng tạo từ các biểu mẫu liên hệ đơn giản (Contact Form) đến các mẫu đăng ký tư vấn complex mà không cần viết dòng code nào.
Tính năng Tải tệp đính kèm (File Upload): Hỗ trợ người dùng gửi tệp đính kèm (như CV xin việc, hình ảnh sự cố, tài liệu thiết kế, hóa đơn...) trực tiếp qua biểu mẫu. Tính năng này xử lý cả tải tệp đơn lẻ (Single Upload) và nhiều tệp (Multi-file Upload).
Bài kiểm tra tương tác & Khảo sát (Quizzes & Polls): Cung cấp các công cụ tạo bài trắc nghiệm tính điểm, thăm dò ý kiến khán giả tích hợp sẵn trong plugin.
Tính toán động & Tích hợp thanh toán (Calculations & Payments): Hỗ trợ tính toán công thức theo thời gian thực và tích hợp sẵn cổng thanh toán trực tuyến như Stripe và PayPal.
Kết nối sinh thái phong phú: Dễ dàng đồng bộ dữ liệu người dùng gửi về với các nền tảng CRM, Email Marketing như HubSpot, Mailchimp, Zapier, Google Sheets hay Slack.
Tại sao Forminator lại trở thành mục tiêu hấp dẫn của Hacker?
Do đặc thù là một plugin phục vụ tương tác người dùng, các biểu mẫu do Forminator tạo ra bắt buộc phải xuất bản công khai (Public-facing) trên giao diện trang web. Bất kỳ ai truy cập trang web đều có thể gửi dữ liệu tới endpoint xử lý biểu mẫu mà không cần thực hiện xác thực (Authentication).
Khi tính năng File Upload kết hợp với quy mô cài đặt lớn, Forminator trở thành một "mỏ vàng" cho kẻ tấn công. Chỉ cần phát hiện một kẽ hở trong luồng xử lý và xác thực tệp tin tải lên, kẻ tấn công có thể biến một plugin quản lý biểu mẫu thông thường thành cánh cửa hậu (Backdoor) để đặt chân vào hệ thống máy chủ web.
Bối Cảnh Kỹ Thuật
Dưới đây là các thông số kỹ thuật chính thức của lỗ hổng được ghi nhận bởi NVD và Wordfence Intelligence:
| Thông số | Chi tiết kỹ thuật |
|---|---|
| Mã lỗ hổng | CVE-2026-15748 |
| CVSS v3.1 Base Score | 9.8 (Critical) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Phân loại Weakness (CWE) | CWE-434: Unrestricted Upload of File with Dangerous Type |
| Sản phẩm bị ảnh hưởng | Forminator Forms – Contact Form, Payment Form & Custom Form Builder |
| Phiên bản bị ảnh hưởng | Tất cả các phiên bản <= 1.56.1 |
| Phiên bản đã khắc phục | 1.56.2 (Phát hành ngày 31/07/2026) |
| Tác giả phát hiện | daroo (Báo cáo qua Bug Bounty Program của Wordfence - Thưởng $2,048) |
Cơ Chế Khai Thác & Phân Tích Nguyên Nhân Gốc Rễ
Lỗ hổng CVE-2026-15748 hình thành từ sự kết hợp của 3 sơ hở logic trong mã nguồn xử lý biểu mẫu của Forminator.
Mắt xích 1: Carrier Field Injection qua trường Select
Trong lớp Forminator_CForm_Front_Action, hàm set_field_data() đảm nhận nhiệm vụ chuẩn bị dữ liệu gửi lên từ biểu mẫu. Khi xử lý các trường dạng danh sách chọn (select-, radio-, checkbox-*), bộ lọc sanitization của Forminator cố ý giữ nguyên mảng lồng (nested array) để phục vụ các bước xử lý riêng tiếp theo.
Kẻ tấn công lợi dụng trường Select làm "trường mang tải" (carrier field). Bằng cách chèn thuộc tính return vào mảng request của trường Select, hàm xử lý lập tức bỏ qua khâu kiểm tra tính hợp lệ và đẩy trực tiếp mảng dữ liệu do kẻ tấn công thao túng vào mảng lưu trữ nội bộ field_data_array:
Mắt xích 2: Trusted Upload Configuration Override
Sau khi dữ liệu đầu vào được gom lại, hàm process_uploads() thuộc lớp Forminator_Upload tiến hành duyệt qua từng phần tử trong field_data_array. Hàm này chỉ kiểm tra xem thuộc tính field_type có bằng 'upload' hay không. Nếu thỏa mãn, nó hoàn toàn tin tưởng mảng field_array đi kèm và dùng mảng này làm mảng cấu hình tải tệp:
Nhờ việc kiểm soát được $field_settings, kẻ tấn công bật tùy chọn định dạng tùy chỉnh (custom-files = true) và ép hệ thống chấp nhận các định dạng mở rộng do mình chỉ định qua thuộc tính additional-type.
Mắt xích 3: Exact-Match Blocklist Bypass với ph(p)
Để ngăn chặn việc tải lên các tệp tin nguy hiểm, Forminator gọi hàm forminator_allowed_mime_types() để duyệt và xóa các định dạng tệp thực thi ra khỏi danh sách được phép:
Cấu trúc in_array($key, $filters, true) thực hiện so sánh chuỗi chính xác. Khi kẻ tấn công gửi định dạng dưới dạng biểu thức ph(p)|text/x-php, biến $key mang giá trị 'ph(p)'. Vì 'ph(p)' !== 'php', câu lệnh unset() bị bỏ qua, giúp đuôi ph(p) lách qua bộ lọc an toàn.
Ngay sau đó, hàm kiểm tra tệp wp_check_filetype() của WordPress được gọi. Cơ chế ánh xạ mở rộng của WordPress lại phân tích ph(p) thành biểu thức chính quy (regex) hợp lệ khớp với phần mở rộng .php. Tệp mã độc PHP được chấp nhận và ghi trực tiếp vào thư mục công khai của máy chủ web.
Dựng Lab Thử Nghiệm & Phân Tích Bản Chất Kỹ Thuật
Bước 1: Chuẩn bị môi trường Lab
Khởi chạy môi trường WordPress:
WordPress Core: 6.5.x hoặc 6.6.x
PHP: 8.1 (chạy trên Nginx hoặc Apache)
Cài đặt Forminator Forms lỗi:
Tải tập tin Zip plugin Forminator Forms phiên bản
1.55.1hoặc1.56.1.Kích hoạt plugin trong giao diện quản trị WordPress.
Bước 2: Cấu hình Biểu mẫu dính lỗi
Truy cập Forminator \(\rightarrow\) Forms \(\rightarrow\) Create.
Chọn mẫu Blank Form và thêm 2 trường dữ liệu:
File Upload (tên thuộc tính mặc định:
upload-1)Select (tên thuộc tính mặc định:
select-1)
Nhấn Publish và chèn shortcode của biểu mẫu vào một trang web công khai (ví dụ Form ID là
100).
Bước 3: Cấu trúc Request Payload chi tiết
Sử dụng cURL hoặc Burp Suite gửi HTTP POST Request tới endpoint xử lý AJAX (/wp-admin/admin-ajax.php):
Phân tích ý nghĩa các trường Payload:
select-1[return]=1: Kích hoạt điều kiện !empty($field_data['return']), ép hàm đẩy cấu hình giả mạo vào mảng field_data_array.select-1[field_type]=upload: Đánh lừa hàm process_uploads() rằng mảng bị inject này chính là cấu hình của trường Upload.select-1[name]=upload-1: Chỉ định tên trường file input thực tế sẽ nhận tệp tin đính kèm.select-1[field_array][additional-type]=ph(p)|text/x-php: Bắt hệ thống nạp quy tắc mở rộng ph(p) để vượt qua mảng lọc filters.
Bước 4: Kiểm chứng kết quả thực thi
Forminator xử lý tệp tin và lưu dưới tên tệp ngẫu nhiên (ví dụ b7e9f1a2c3d4-webshell.php) tại thư mục /wp-content/uploads/forminator/100_.../.
Gửi HTTP GET Request để kích hoạt mã lệnh từ xa:
Ghi Nhận Khai Thác Thực Tế & Timeline Công Bố
Mặc dù chưa ghi nhận các chiến dịch tấn công APT có mục tiêu rõ ràng sử dụng lỗ hổng này, nguy cơ đối với các hệ thống WordPress công khai là rất lớn do chi tiết kỹ thuật đã được công bố đầy đủ. Các mạng lưới botnet thường quét tự động toàn bộ dải IP internet để phát hiện các biểu mẫu Forminator chưa vá và cài cắm Web Shell hàng loạt.
Timeline công bố thông tin:
14/07/2026: Researcher "daroo" phát hiện & báo cáo qua Bug Bounty
14/07/2026: Wordfence xác minh và chuyển giao báo cáo cho WPMU DEV
20/07/2026: WPMU DEV xác nhận lỗi và bắt đầu xây dựng bản vá
31/07/2026: WPMU DEV phát hành bản vá chính thức phiên bản 1.56.2
17/08/2026: Wordfence phát hành bài báo cáo kỹ thuật công khai
MITRE ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Mới bổ sung / Ngữ cảnh mở rộng |
|---|---|---|---|
| Defense Evasion | T1036.007 | Masquerading: Double Extension | Kẻ tấn công vượt qua bộ lọc file bằng kỹ thuật nén hoặc đổi tên file (vd: shell.php.png, bypass MIME-type check). |
| Discovery | T1083 | File and Directory Discovery | Web shell tự động duyệt cây thư mục web, đọc tệp wp-config.php để lấy cơ sở dữ liệu credentials. |
| Credential Access | T1552.001 | Unsecured Credentials: Credentials In Files | Trích xuất thông tin truy cập Database / Secret Keys từ wp-config.php. |
Phát Hiện & Phản Ứng
Giám sát Log Web Server
Kiểm tra các yêu cầu HTTP POST gửi tới endpoint admin-ajax.php hoặc các tuyến đường xử lý form của Forminator chứa cấu hình tham số khác thường trong phần body request:
grep -E "forminator_submit_form|forminator_upload" /var/log/nginx/access.log | grep "POST"
find /var/www/html/wp-content/uploads/ -type f -name "*.php" -ls
Mẫu SIEM / WAF Detection Query Concept
Dành cho hệ thống WAF hoặc SIEM (Elastic / Splunk / QRadar):
request_method: "POST"
AND request_uri: "admin-ajax.php"
AND body_content: "forminator"
AND body_content: ".php"
Nhận Định Chuyên Gia
Lỗ hổng Arbitrary File Upload trên môi trường WordPress không phải là dạng bài toán mới nhưng luôn mang lại thiệt hại nghiêm trọng nhất. Với CVSS 9.8, CVE-2026-15748 cho phép biến một biểu mẫu liên hệ thông thường thành cổng xâm nhập chiếm toàn bộ máy chủ mà không đòi hỏi bất kỳ thông tin đăng nhập nào.
Tại thị trường Việt Nam, hệ quản trị nội dung WordPress chiếm tỷ lệ rất lớn trong khối doanh nghiệp vừa và nhỏ (SMB), các cơ quan báo chí, trang tin tức cũng như các chiến dịch landing page của phòng marketing. Thực tế vận hành SOC cho thấy, nhiều đơn vị thường có thói quen cài đặt plugin và để hệ thống chạy dài ngày mà không thiết lập quy trình kiểm tra và vá lỗi định kỳ (Patch Management).
Khi một lỗ hổng RCE dạng này bị công khai PoC, các mạng lưới botnet chỉ mất vài giờ để quét toàn bộ dải IP Việt Nam và tự động thả Web Shell. Do đó, việc phụ thuộc hoàn toàn vào bộ lọc mặc định của plugin là chưa đủ; doanh nghiệp cần áp dụng các lớp phòng thủ chuyên sâu (Defense-in-Depth).
Khuyến Nghị Hành Động
Để bảo vệ website trước nguy cơ bị khai thác qua lỗ hổng CVE-2026-15748, các cá nhân và tổ chức đang vận hành WordPress cần nhanh chóng triển khai các biện pháp khắc phục được phân loại chi tiết dưới đây:
Dành cho Người quản trị Website (Site Admin / Người dùng phổ thông)
Cập nhật plugin ngay lập tức:
Truy cập giao diện quản trị WordPress → Plugins → Installed Plugins.
Tìm plugin Forminator Forms và nhấn Update Now để nâng cấp lên phiên bản 1.56.2 (hoặc mới hơn).
Khuyến nghị: Bật tính năng Enable auto-updates cho plugin này để hệ thống tự động nhận các bản vá an ninh trong tương lai.
Rà soát và xóa các biểu mẫu không sử dụng:
- Xóa bỏ các form dùng thử, form nháp hoặc form cũ không còn hoạt động để thu hẹp bề mặt tấn công (attack surface).
Quét mã độc toàn bộ website:
- Sử dụng các plugin an ninh uy tín trên WordPress (như Wordfence Security, iThemes Security, Sucuri) để quét toàn bộ hệ thống file, đặc biệt là thư mục
wp-content/uploads/, nhằm phát hiện sớm các Web Shell hoặc file nghi vấn đã bị tải lên trước thời điểm cập nhật bản vá.
- Sử dụng các plugin an ninh uy tín trên WordPress (như Wordfence Security, iThemes Security, Sucuri) để quét toàn bộ hệ thống file, đặc biệt là thư mục
Dành cho Quản trị viên Kỹ thuật & Đội ngũ IT (SysAdmin / DevOps)
Vô hiệu hóa quyền thực thi script PHP trong thư mục Uploads:
- Đây là lớp phòng thủ chuyên sâu (Defense-in-Depth) quan trọng nhất. Ngay cả khi kẻ tấn công vượt qua plugin để tải file
.phplên thư mụcuploads/, Web Server vẫn sẽ từ chối thực thi tệp đó.
Cấu hình mẫu cho Nginx:
location ~* ^/wp-content/uploads/.*.php$ {
deny all; access_log off;
log_not_found off;
}
Cấu hình mẫu cho Apache (Tạo file .htaccess nằm trong thư mục wp-content/uploads/):
<Files *.php>
Order Deny,Allow
Deny from all
</Files>
Rà soát Log máy chủ (Log Audit):
- Quét Access Log của Web Server để truy vết các request
HTTP POSTbất thường hướng tới endpointadmin-ajax.phpcó chứa tham số Forminator, cũng như các truy cậpHTTP GETđến các file.phpmới được tạo trong thư mụcuploads/.
Tài Liệu Tham Khảo
Forminator WordPress Flaw Can Enable Unauthenticated RCE via Malicious PHP Uploads
300,000 WordPress Sites Potentially Exposed to Hacking Due to Form Plugin Flaw - SecurityWeek






