Phân tích CVE-2019-8942 của wordpress
Bài đăng này đã không được cập nhật trong 3 năm
1. Giới thiệu
CVE-2019-8942 lợi dụng lỗi hổng LFI + File Upload để thực hiện RCE đến máy chủ web với quyền author. Phiên bản bị ảnh hưởng bao gồm trước 4.9.9 và từ 5.0.0 đến 5.0.1.
Tại các phiên bản này hàm wp_update_post
lấy trực tiếp biến $post_data
mà không cần kiểm tra các trường dữ liệu không được phép. Do đó, người dùng với quyền author có thể thay đổi dữ liệu của bài đăng bằng cách ghi đè tham số meta_input
và thực hiện khai thác.
2. Setup môi trường
Bước 1. Tải phiên bản
Phiên bản Wordpress 4.9.8
Các bạn có thể tải về tại đây
Tiến hành cài đặt bình thường:
Thực hiện tạo database:
Trước khi install wordpress, ta thêm 2 dòng sau vào wp-config.php:
define('AUTOMATIC_UPDATER_DISABLED',true);
define('WP_AUTO_UPDATE_CORE',false);
Thực hiện install:
Kiểm tra phiên bản
Bước 2.Tạo user quyền author
2. Khai thác và phân tích:
Bước 1.Tạo hình ảnh chứa mã khai thác
Ở đây mình sử dụng exiftool để truyền mã php vào:
gõ lệnh
exiftool ISP.jpg -documentname="<?php phpinfo(); ?>"
Bước 2. Tải tệp hình ảnh:
Vào Media -> Add New để tải ảnh lên.
Chọn hình ảnh đã tải lên và nhấp vào Edit more details- Update.
Sau khi tải ảnh lên, ảnh sẽ được chứa trong thư mục: wp-content/uploads
Việc tải ảnh lên sẽ gọi đến hàm wp_insert_post()
. kiểm tra trong source code /wp-admin/includes/post.php
tại dòng 3526 ta có:
Hàm wp_insert_post()
lấy hầu hết các biến $post_data
mà không kiểm tra trong đó có meta_input
. Để thực hiện khai thác, ta sẽ chèn thêm tham số meta_input[_wp_attached_file]
, đây là tham số nhằm thay đổi một tên tệp bất kỳ. Tên tệp này sẽ được gọi khi một yêu cầu chỉnh sửa hình ảnh được gửi đến server (ta sẽ thực hiện ở bước sau). Thực hiện thêm như sau &meta_input[_wp_attached_file]=2021/05/ISP.jpg#/../../../../themes/twentyseventeen/ISP.jpg
vào /wp-admin/post.php
ta được:
Kiểm tra trong database sẽ thấy dữ liệu đã được cập nhật.
Bước 3. Sử dụng chức năng cắt ảnh wp_crop_image()
Chức năng wp_crop_image()
sẽ cố gắng truy xuất 1 hình ảnh thông quaget_attached_file
để thực hiện việc xử lí ảnh:
Máy chủ truy xuất thông tin qua 2 phương thức là: thông qua tập tin gốc và thông qua HTTP URL.
Tuy nhiên khi ta thay đổi đường dẫn thì giá trị truy xuất tập tin gốc là: /wp-content/uploads/2021/05/ISP.jpg#/../../../../themes/twentyseventeen/ISP.jpg
không tồn tại.
Do đó mà máy chủ sẽ sử dụng phương thức thứ hai là truy xuất thông qua HTTP URL.
Giá trị truy xuất sẽ là /wp-content/uploads/2021/05/ISP.jpg#/../../../../themes/twentyseventeen/ISP.jpg
. Giá trị này hợp lệ vì với URL trên thì phần sau ký tự ? sẽ được bỏ qua.
Thực hiện: Đi tới Media và chọn hình ảnh đã tải lên.
Bấm Edit Image để cắt hình ảnh và sau đó bấm vào Save.
Kiểm tra trong Burp, bạn sẽ thấy một yêu cầu POST /wp-admin/admin-ajax.php
. Ta sẽ thực hiện gửi lại yêu cầu. Khi đó phản hồi có dạng:
Phân tích:
Sau khi thực hiện crop ảnh, máy chủ sẽ thực hiện lưu ảnh. Tuy nhiên sau khi cắt máy chủ không còn sử dụng hai phương thức truy xuất vị trí tệp hoặc tên tệp như trên mà mặc định sử dụng tên tệp cục bộ như giá trị gốc truyền vào từ meta_input[_wp_attached_file] là wp-content/uploads/2021/05/ISP.jpg#/../../../../themes/twentyseventeen/ISP.jpg
. Điều này dẫn đến lỗ hổng LFI(local file include) có thể được khai thác.
Bởi vì tệp hình ảnh hiện đi kèm với siêu dữ liệu đã sửa đổi, một bản sao với tên được sửa đổi sẽ tự động được lưu trong thư mục themes/twentyseventeen
. Ta sẽ vào thư mục trong máy để kiểm tra:
Như vậy là LFI thành công. Bây giờ ta sẽ POST 1 bài để thực hiện RCE Nhấp vào Posts -> Add New để tạo một bài viết mới và nhấp vào Publish:
Kiểm tra trong Burp, bạn sẽ thấy một yêu cầu POST /wp-admin/post.php
tương tự như bên dưới
Thêm &meta_input[_wp_page_template]= [tên bản sao]
và thực hiện gửi:
Lúc này ta chỉ cần vào xem bài đăng mới là sẽ thấy kết quả của mã PHP được thực thi.
Vậy là khai thác thành công.
3. Kết Luận:
Những lỗ hổng trên nằm tại những nơi mà nếu chỉ khai thác riêng rẽ thì gần như không có nhiều tác động. Tuy nhiên CVE trên đã xâu chuỗi các lỗ hổng lại và tạo nên 1 lỗ hổng vô cùng nguy hiểm.
Tại những phiên bản sau wordpress đã thực hiện loại bỏ Loại bỏ các tham số đầu vào như meta_input,file,…
Đồng thời có đoạn mã kiểm tra nếu đầu vào có tồn tại ../
hoặc..
hay không.
=> Điều này đã vá thành công CVE-2019-8942.
Cuối cùng hãy luôn cập nhật cài đặt WordPress của bạn lên phiên bản mới nhất để đảm bảo an toàn nhé.
All rights reserved