Hiểu hơn về lỗ hổng cho phép tấn công thay đổi nội dung website - Deface

nonellldd

VIP Members
25/04/2015
18
19 bài viết
Hiểu hơn về lỗ hổng cho phép tấn công thay đổi nội dung website - Deface
Trong tháng trước, wordpress đã ghi nhận lỗ hổng nghiêm trọng nằm trong 2 phiên bản 4.7.0 và 4.7.1 cho phép kẻ tấn công có thể thực hiện thay đổi nội dung các bài viết, giao diện website. Đã vá trong phiên bản 4.7.2
Trong 4.7.0 và 4.7.1 wordpress bổ sung thêm REST api. Do mới phát triển nên module đã dính lỗ hổng nghiêm trọng =))

REST api là gì?
REST viết tắt của Representational State Transfer. Theo trang chỉ của wordpress thì “wordpress Rest api dễ sử dụng đối với ứng dụng đầu cuối sử dụng qua giao thức HTTP cho phép truy cập dữ liệu trang web ở dạng JSON, bao gồm dữ liệu của người dùng, bài viết, …
Nếu muốn lấy dữ liệu từ 1 bài viết. Đơn giản chỉ cần gửi request POST tới /wp-json/wp/v2/users/4 với 4 là ID của bài viết. Hoặc tìm kiếm các bài viết với từ khóa “awesome” thì gửi request GET /wp-json/wp/v2/posts?search=awesome“
Nói chung REST api sinh ra để phục vụ cho việc gọi các api của WP và kết quả trả về sẽ ở dạng json.
Trang tài liệu của wordpress http://v2.wp-api.org/reference/posts/
Để lấy hết nội dung các bài viết ta cần gửi request như sau:

curl -X GET /wp-json/wp/v2/posts/ (1)

Để thực xem 1 bài viết ta cần gửi request như sau:
curl -X GET /wp-json/wp/v2/posts/@id/ (2)
@id là id của bài viết.

Ứng dụng của REST api.
Nếu bạn muốn xây dựng 1 ứng dụng cho điện thoại, máy tính bảng hay tivi cho người dùng lướt các trang web wordpress thì REST api là giải pháp để bạn có thể lấy nội dung các bài viết một cách nhanh và chính xác nhất cùng với đó là tiết kiệm dung lượng khi sử dụng ....

Vào 1/2/2017 trang http://blog.sucuri.net đã đăng tải bài viết về lỗ hổng nằm trong REST api của wordpress 4.7.0 và 4.7.1
Bài viết sẽ giúp bạn hiểu hơn về lỗ hổng cũng như các thức khai thác và khai thác hàng loạt =))

Bước 1.
Đầu tiên download đúng WP 4.7.0 hoặc 4.7.1 tại

Bước 2.
Phân tích code.
Lỗ hổng tồn tại trong chức năng update bài viết trong file /wordpress/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php. Để thực hiện được chức năng update, WP sẽ gọi tới hàm update_item_permission_check sau đó gọi tới hàm update_item
register_rest_route.PNG

register_route

update_item_check_permission.PNG
Hàm update_item_permission_check
Để hàm update_item_permission_check này có 4 lần check là check1, check2, check3, check4. Đối với check2, check3 chỉ cần trong request không có các biến "author" "sticky" là có thế pass qua rồi.
test2vs3.PNG

Check2 và Check3

Check4 gọi đến hàm check_assign_terms_permission.
check_assign_terms_permission.PNG


Trong hàm check_assign_terms_permission. Chủ yếu hàm này là check các quyền các thuộc tính để phân loại bài viết như tags, categories. Nếu request không set thuộc tính nằm trong biến $base sẽ pass qua hàm check này.

Như vậy, mấu chốt chỉ nằm ở check1. Nếu pass qua chúng ta có thể gọi được đến hàm update_item
Hàm get_post dùng để lấy thông tin của bài viết với id là giá trị "@id" trong lệnh (2)

get_post.PNG


Hàm get_post tham số truyền vào là biến $post, nếu $post không phải là 1 đối tượng của class WP_Post, hay là 1 object của 1 class nào đó thì get_post sẽ gọi đến hàm get_instance (dòng 531 trong ảnh). Ở check1 truyền vào là 1 string do đó hàm WP_Post::get_instance sẽ được gọi.

get_instance.PNG


Hàm get_instance sẽ return false nếu id không phải số.
==>>> Có gì sai sai.

Nếu $post = false sẽ pass qua được check1. =)))

update_item.PNG


Ở dòng 631 biến $id được ép kiểu thành int, trong php, (int)"1abc" = 1. Đây chính là mấu chốt =))
Nếu trong request id=1abc sẽ pass qua được hàm update_item_permissions_check và thực hiện được việc update.

=> Mã khai thác:
curl -X POST http://host.com/wp-json/wp/v2/@id/?id=@idabc&title=hacked --data ""
OK, dựng 1 website 4.7.1 hoặc 4.7.0 để test thôi (download source bằng link ở trên nhé)

nonellldd​
 
Bên trên