+2

Phân tích CVE-2019-20042 WordPress và BuddyPress (phần 2)

1. Giới thiệu

Tiếp tục với series về phân tích CVE wordpress, Hôm nay mình sẽ đi phân tích CVE về lỗ hổng XSS: CVE-2019-20042.

Phiên bản bị ảnh hưởng bao gồm các phiên bản có ngày được phát hành trước ngày phát hành của phiên bản 5.3.0. Điều này đã được vá trong WordPress phiên bản 5.3.1, cùng với tất cả các phiên bản WordPress trước đó từ 3.7 đến 5.3 thông qua một bản phát hành nhỏ.

Lỗ hổng XSS xảy ra do hàm wp_targeted_link_rel() nằm trong wp-includes/formatting.php của Wordpress xử lí thay thế khoảng trắng bằng ký tự " . Hacker có thể dựa vào đó để thoát khỏi thuộc tính hiện tại khiến XSS được thực thi.

Bên cạnh đó ta cũng sẽ tìm hiểu 1 lỗi XSS trên BuddyPress (1 plugin của Wordpress).

2. Setup môi trường

Tại phần setup môi trường các bạn có thể tham khảo Phần 1 của mình.

Phiên bản Wordpress 5.2.4

Về các phiên bản Wordpress, các bạn có thể tải về tại đây. Mình sẽ tải bản 5.2.4

Kiểm tra phiên bản

2. Khai thác và phân tích:

a. Phân tích

Ta sẽ đi phân tích hàm wp_targeted_link_rel() nằm trong wp-includes/formatting.php:

Về cơ bản thì hàm này ban đầu nhận vào 1 biến $text . Sau đó hàm sẽ thực hiện kiểm tra xem đầu vào có phải là 1 thẻ <a> hay không. Nếu đúng, nó sẽ chuyển toàn bộ chuỗi nằm trong thẻ a này tới hàm wp_targeted_link_rel_callback() để thay thế:

Tại hàm này sẽ sử dụng biến $attr_regex để phân tích cú pháp thuộc tính rel và chuyển kết quả vào $rel_match

Nếu thuộc tính rel được tìm thấy, hàm sẽ thực hiện như sau:

Tại đây hàm thực hiện filter các giá trị đầu vào của thuộc tính rel. Tuy nhiên việc xử lí không đúng cách đã dẫn đến hacker có thể khai thác XSS. Ta sẽ chú ý vào 3 dòng từ 3098 -> 3100> Đoạn trên sẽ kiểm tra ký tự khoảng trắng ở 2 đầu của chuỗi sau dấu = . Nếu trống thì sẽ tự động thêm ký tự " vào 2 đầu của giá trị thuộc tính rel. Sau đó, thuộc tính rel gốc được thay thế bằng thuộc tính mới.

Ví dụ như sau. Ta truyền vào 1 thẻ a:

<a title=" target='xyz' rel=abc "> PoC </a>

Sau khi chuyển đổi thì thẻ a sẽ chuyển thành

<a title =" target = 'xyz' rel = "abc" "> PoC </a>

Khi đó thì ký tự " đã được đưa vào và thuộc tínhtitle đã bị thoát.

Hàm wp_targeted_link_rel () có thể được gọi trên mô tả người dùng. Tức là ta cần hiển thị được thông tin người dùng thì mới có thể khai thác XSS.

b. Khai thác:

Ta có thể sử dụng BuddyPress (phiên bản bất kỳ) để chỉnh phần thông tin hiển thị người dùng để khai thác.

Bạn có thể tải bất kỳ phiên bản nào của BuddyPress tại đây Thực hiện cài đặt: Cài đặt hiển thị tiểu sử người dùng. Vào Appearence -> Customize chọn BuddyPress Nouveu -> Member front page. Thực hiện bật chức năng hiển thị tiểu sử người dùng:

Tạo 1 tài khoản user và thực hiện thêm vào tiểu sử như sau:

Đoạn thẻ a:

<a href="#" title=" target='abc' rel= onmouseover=alert(1) ">

Sẽ được chuyển đổi thành:

<a href="#" title=" target='abc' rel="onmouseover=alert(1)" ">

Khi đó thuộc tính onmouseover=alert(1) sẽ thực thi và hiển thị alert.

Vào bằng tài khoản admin và thực hiện xem tiểu sử người dùng. Khi di chuyển chuột đến phần nội dung chứa payload XSS thì alert được thực thi:

c. BuddyPress

Nói thêm về BuddyPress thì đây là 1 plugin do chính Wordpress phát triển và có nằm trong chương trình bug bounty của Wordpress.

BuddyPress giúp ta có thể tạo được 1 trang web mạng xã hội nhanh chóng và tiện lợi.

Mình cũng sẽ demo luôn 1 lỗi XSS của BuddyPress. Lỗi này bị ở các phiên bản 4.1 trở xuống. XSS xảy ra trên chức nằng Private message của BuddyPress. Đây là một chức năng cho phép người dùng có thể gửi tin nhăn riêng tư cho nhau, tuy nhiên thì việc không kiểm soát đầu vào chặt chẽ dẫn đến lỗ hổng XSS có thể được thực thi.

Để khai thác, trước hết ta sẽ tải và cài đặt BuddyPress phiên bản 4.1 về:

Ta vào cài đặt -> BuddyPress và thực hiện bật chức năng private message:

Thiết lập tài khoản user:

Đăng nhập với tài khoản user và vào trang thông tin của admin:

Tại đây bạn sẽ thấy có chức năng Private message. Thực hiện gửi tin nhắn cho admin với nội dung như sau:

Test<iframe src=javascript:alert(1) width=0 height=0 style=display:none;></iframe>

Thẻ <iframe> cho phép bạn nhúng một trang web HTML khác vào trang hiện tại, ở đây là hiển thị alert(1):

Vào xem tin nhắn với tài khoản admin và xác nhận XSS khai thác thành công:

3. Kết Luận:

Lỗ hổng XSS trước giờ vẫn là 1 lỗ hổng vô cùng nguy hiểm và luôn được các hacker khai thác. Để phòng tránh lỗ hổng trên, bạn cần cố gắng kiểm tra và lọc dữ liệu đầu vào của mình và sử dụng các hàm filter các ký tự đặc biệt như ',",<,>,/,...

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí