Lỗ hổng bảo mật trong WordPress Plugin luôn là mối đe dọa lớn đối với các website sử dụng nền tảng này. Các lỗ hổng phổ biến như Code & Command Injection, Sensitive Information Disclosure, và Insufficient Randomness có thể dẫn đến việc kẻ tấn công chiếm quyền điều khiển máy chủ, lộ thông tin nhạy cảm hoặc thực thi mã độc từ xa. Bài viết phân tích các lỗ hổng này, cùng với ví dụ cụ thể và cách khai thác chúng, đồng thời đưa ra các biện pháp phòng chống nhằm giúp developer và bug hunter nâng cao nhận thức về bảo mật.

Code & Command Injection

Trong PHP, có nhiều hàm cho phép thực thi lệnh hệ thống, như ls để liệt kê thư mục, touch để tạo file, hay mkdir để tạo thư mục, và rất nhiều lệnh khác. Một số hàm PHP còn có khả năng thực thi mã PHP bất kỳ, ví dụ như <?php phpinfo();?>. Đặc biệt trong các plugin hoặc theme của WordPress, việc sử dụng các hàm này có thể dẫn đến những rủi ro bảo mật nghiêm trọng.

Dù không phải tất cả các hàm này đều gây ra lỗ hổng, nhưng nếu dữ liệu người dùng truyền vào các hàm này mà không được kiểm tra cẩn thận, chắc chắn plugin hoặc theme sẽ có nguy cơ gặp phải lỗ hổng Remote Code Execution (RCE).

Dưới đây là một số hàm PHP mà bạn cần phải đặc biệt lưu ý khi sử dụng, vì chúng cho phép thực thi lệnh hệ thống:

  • exec: Trả về dòng cuối cùng của kết quả lệnh.
  • passthru: Trả về kết quả của lệnh trực tiếp lên trình duyệt.
  • system: Giống passthru nhưng trả về dòng cuối cùng của kết quả lệnh.
  • shell_exec: Trả về kết quả của lệnh.
  • Backticks (` `): Giống shell_exec.
  • popen: Mở một pipe để đọc hoặc ghi lệnh.
  • proc_open: Giống popen nhưng có nhiều tùy chỉnh hơn.
  • pcntl_exec: Thực thi một chương trình.

Ngoài ra, một số hàm khác có thể thực thi mã PHP bất kỳ:

  • assert(): Giống như eval().
  • preg_replace('/.*/e', ...): Tùy chọn /e cho phép thực thi mã trong kết quả khớp.
  • create_function(): Tạo một function mới từ đoạn mã truyền vào.

Ví dụ, đoạn mã dưới đây cho phép gọi bất kỳ hàm nào thông qua tham số URL:

$_GET['func_name']($_GET['argument']);

Nếu người dùng truy cập với URL như sau: func_name=shell_exec&argument=whoami, thì đoạn mã trên sẽ thực thi:

shell_exec("whoami");

Một ví dụ khác cho thấy lỗ hổng khi sử dụng Reflection để khởi tạo và thực thi một hàm từ input người dùng:

$func = new ReflectionFunction($_GET['func_name']);
$func->invoke();
$func->invokeArgs(array());

Hãy cảnh giác với các hàm cho phép gọi hàm callback, như call_user_func:

call_user_func('shell_exec', 'id');

Hoặc array_filter, tuy không liên quan đến việc thực thi lệnh, nhưng vẫn có thể gọi callback lên từng phần tử của mảng:

array_filter($array, 'shell_exec');

Cách ngăn chặn RCE

  • Kiểm tra và lọc dữ liệu đầu vào: Áp dụng các bộ lọc (filter) và các hàm kiểm tra (sanitize) dữ liệu đầu vào của người dùng.
  • Phân quyền: Hạn chế quyền truy cập vào các chức năng nguy hiểm.
  • Tránh sử dụng các hàm nguy hiểm trừ khi không có cách nào khác.

Một số ví dụ cụ thể

  • CVE-2024-6386: Lỗ hổng trong plugin WPML Multilingual CMS (<= 4.6.12) liên quan đến Remote Code Execution qua Twig Template Injection, trong đó array_filter đã bị lợi dụng.

PoC:

{{ {1: phpinfo}|filter(call_user_func) }}
  • CVE-2024-5932: Lỗ hổng PHP Object Injection trong plugin GiveWP, cho phép tấn công thực hiện Remote Code Execution thông qua call_user_func.

Sensitive Information Disclosure

Lỗ hổng lộ thông tin nhạy cảm có thể bao gồm các đường dẫn file trên server hoặc dữ liệu cá nhân. Đặc biệt, nếu các giá trị nonce bị lộ ra, người dùng quyền thấp có thể lợi dụng để thực hiện những tác vụ không được phép.

Một số hàm cần lưu ý:

  • admin_footer: Thêm dữ liệu hoặc script vào footer trang admin.
  • admin_head: Thêm dữ liệu hoặc script vào head trang admin.
  • wp_footer: Thêm dữ liệu hoặc script vào footer trang bất kỳ.
  • wp_head: Thêm dữ liệu hoặc script vào head trang bất kỳ.

VD: CVE-2024-6551 – Lỗ hổng path disclosure trong plugin GiveWP (<= 3.15.1) cho phép tiết lộ đường dẫn file trên server khi lỗi xảy ra.


Insufficient Randomness

Lỗi này liên quan đến việc sử dụng các thư viện hoặc phương pháp sinh chuỗi ngẫu nhiên không an toàn, dễ bị brute-force. Ví dụ, plugin Elementor (<= 3.18.1) đã gặp phải vấn đề này khi sử dụng hàm uniqid() không đúng cách, dẫn đến việc có thể brute-force tên thư mục và thực thi mã độc.

Kết lại, trong chuỗi bài viết về các lỗ hổng bảo mật thường gặp trên WordPress Plugin, chúng ta đã khám phá những điểm yếu tiềm ẩn, từ lỗi Code & Command Injection đến việc lộ thông tin nhạy cảm hay các lỗ hổng liên quan đến tính ngẫu nhiên không đủ mạnh. Dù WordPress là một nền tảng mạnh mẽ và tiện lợi, nhưng việc quản lý bảo mật vẫn luôn là yếu tố quan trọng không thể xem nhẹ. Hy vọng rằng với những kiến thức và ví dụ cụ thể đã được đề cập, cả các nhà phát triển và người dùng có thể hiểu rõ hơn về các lỗ hổng bảo mật, đồng thời biết cách phòng tránh và khắc phục chúng một cách hiệu quả. Cảm ơn các bạn đã theo dõi, và hẹn gặp lại ở những bài viết tiếp theo!