Phân tích CVE-2017-1001000

– Tác giả:

Sucuri security team

– CVE link:

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1001000

– Dạng lỗi:

Leo thang đặc quyền (Privilege Escalation)

– Sản phẩm dính đạn:

WordPress 4.7.0, 4.7.1

– Tóm tắt lỗi:

WordPress core 4.7.0 – 4.7.1 hỗ trợ REST API, tuy nhiên vì REST API ngộ nghĩnh quá nên anh dev chủ quan => filter thọt, kẻ tấn công có thể bypass function kiểm tra quyền sửa bài viết => Leo thang đặc quyền!

– Cụ thể:

Trong bài sử dụng bộ source wordpress 4.7, zô đây down nè.

Xem REST controller:
./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:80

Lỗi ở mấy dòng bị bôi bôi, ở line 80, đại khái chương trình sẽ nhận biến id thông qua API như sau:
http://wordpress-site/wp-json/wp/v2/posts/1234 thì id1234
ở id còn có thêm cái regex để kiểm tra

chỉ nhận số thôi, có chữ vào là tạch, safe vcl, nhưng mà vì vậy nên mới thọt.

REST API khá ngộ nghĩnh, nếu nhập như trên thì id là 1234, còn nhập theo phương thức GET/POST thì độ ưu tiên được cao hơn.

http://wordpress-site/wp-json/wp/v2/posts/1234?id=5 thì id là 5 chứ không phải là 1234

(1) Ok vậy chúng ta có thể control biến id (không bị regex chỉ được là số) bằng cách gửi theo phương thức GET!

Line 93-98 là define cho tính năng update bài viết, ở đây sẽ chạy function update_item_permissions_check trước để kiểm tra xem bạn có quyền edit bài viết hay không? nếu có thì chạy function update_item

vào function update_item_permissions_check xem:

Check lắm vl, id nhập ở trên sẽ được đưa vào function get_post (./wp-includes/post.php), trace tiếp:


Tùm lum! nhưng id sẽ lại đi qua function get_instance (./wp-includes/class-wp-post.php):

Trong hàm này thì… id sẽ đi qua function is_numeric để kiểm tra xem id có phải là số hay không, nếu phải thì trả về true, sai thì trả về false.

Từ (1), ví dụ ta ko nhập ?id=5 mà là ?id=5abc thì sao nè?

zậy thì !is_numeric('5abc') == !False == True => vào trong If => return False

Túm lại là $post ở đây sẽ có giá trị là False nếu nhập như trên

Nhìn line 594, $post False cmnr nên AND với cái đếu gì cũng False, pass qua được If => Bypass check permission, nhảy thẳng vô function update_item

Chời đậu má, tự nhiên ở đây id lại “được” ép kiểu (int) trước khi đi vào get_post.

php thì magic lắm, nhìn hình dưới nè

Cái này gọi là php type juggling

Rồi xong, bypass được check permission, lại đi update được đúng id bài viết => Tạch

– Exploit:

Đầu tiên là dựng WordPress 4.7 lên nhé, xong tạo vài bài viết chơi!

Tìm id bài viết bằng cách zô đây:
http://wordpress-site/wp-json/wp/v2/posts/

Okay, zậy là bài viết với tiêu đề aaaaaaaaaaaa và nội dung ecec có id là 5.

Giờ gửi request lên đổi thôi, bạn để ý là trong python code không có session nào hết nhé (nghĩa là guest user bem trực tiếp ^_^)

Chốt: Dmmm cứ tưởng đang chơi CTF =))

Reference:

https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html

Advertisements

1 thought on “Phân tích CVE-2017-1001000

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s