– 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ì id
là 1234
ở 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
nice job :v
trước em đập 1 thằng cũng bị tương tự chỗ API, kiểu mò = tay ra đc magic vcl xong search tên cms thì thấy có cve rồi :v
LikeLike