Code smell trong plugin WordPress: nhìn qua biết ngay sắp bị hack

Không phải lúc nào plugin WordPress cũng bị hack từ lỗ hổng zero-day. Nhiều khi chính code “bốc mùi” đã đủ để mở đường cho kẻ tấn công. Một số đoạn code nhìn qua là thấy nguy cơ: thiếu kiểm tra, xử lý input ẩu, hoặc để hở API. Bài viết này tổng hợp những code smell phổ biến nhất trong plugin WordPress, kèm ví dụ cụ thể.

Code smell trong plugin WordPress: nhìn qua biết ngay sắp bị hack

1. Query SQL nối chuỗi trực tiếp

Đây là cửa ngõ cho SQL Injection. Nhiều plugin vẫn viết kiểu này:

global $wpdb;
$user = $_GET['user'];
$result = $wpdb->get_results("SELECT * FROM users WHERE username = '$user'");

Chỉ cần input ' OR '1'='1 là hacker có thể dump toàn bộ bảng users. Thay vì nối chuỗi, hãy dùng $wpdb->prepare() hoặc ORM an toàn.

2. File upload mà không validate

Plugin cho phép upload nhưng không check loại file hay giới hạn quyền:

if ( isset($_FILES['file']) ) {
  move_uploaded_file($_FILES['file']['tmp_name'], ABSPATH . '/uploads/' . $_FILES['file']['name']);
}

Kẻ tấn công chỉ cần upload một file shell.php là có cửa hậu để thực thi lệnh trên server. Upload an toàn phải kiểm tra MIME type, extension, và giới hạn thư mục.

3. Nonce hoặc CSRF token bị bỏ qua

Nhiều plugin viết form action nhưng không kèm nonce:

<form method="post" action="options.php">
  <input type="text" name="site_title">
  <input type="submit" value="Save">
</form>

Khi thiếu nonce, hacker có thể lừa admin click vào link bẫy và thay đổi cài đặt site qua CSRF. Giải pháp: dùng wp_nonce_field() và verify với check_admin_referer().

4. AJAX mở toang không kiểm soát quyền

Plugin thường đăng ký AJAX mà không check capability:

add_action('wp_ajax_delete_post', 'delete_post_callback');

function delete_post_callback() {
  $id = $_POST['id'];
  wp_delete_post($id);
}

Nếu không có current_user_can() để kiểm tra quyền, bất kỳ user đăng nhập nào cũng có thể gọi AJAX để xóa bài. Đây là lỗi logic cực kỳ nguy hiểm.

5. Dùng eval() hoặc base64_decode() bừa bãi

Nhiều plugin bị cấy mã độc hoặc dev non tay copy code về chạy thử:

$code = $_POST['payload'];
eval($code);

Hoặc:

$backdoor = base64_decode("ZWNobyAiSGFja2VkISI7");
eval($backdoor);

Chỉ cần một request độc hại là site bị điều khiển. Code sạch sẽ không bao giờ cần eval cho input từ user.

6. Hiển thị lỗi chi tiết ra ngoài

Plugin debug ẩu, in thẳng lỗi SQL hoặc stack trace ra frontend:

echo "SQL Error: " . $wpdb->last_error;

Hacker có thể dùng thông tin này để tìm injection point. Cách đúng: log lỗi nội bộ, không bao giờ show ra cho end-user.

7. Capability và role bị hardcode sai

Ví dụ plugin tự tạo menu nhưng gán quyền quá rộng:

add_menu_page('My Plugin', 'My Plugin', 'read', 'my-plugin', 'my_plugin_page');

read là quyền cơ bản ai cũng có, nghĩa là mọi user đều vào được admin page của plugin. Đáng lẽ phải dùng manage_options hoặc custom capability phù hợp.

Kết luận

Code smell trong plugin WordPress không khó phát hiện, chỉ cần tinh ý. Những mùi quen thuộc nhất: query SQL nối chuỗi, upload file thiếu kiểm tra, form thiếu nonce, AJAX bỏ quyền, lạm dụng eval/base64. Chúng không chỉ là code kém chất lượng, mà còn là lỗ hổng bảo mật chờ bị khai thác. Khi review code plugin, nếu thấy những đoạn trên, hãy cảnh giác: site của bạn có thể sắp trở thành nạn nhân.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...