CVE-2024-4041: XSS in Yoast SEO Plugin
Shut up, be better
Overview
Hello, dạo này mình có phân tích vài lỗ hổng của WordPress để làm quen với source code. Thì trong đó có CVE-2024-4041.
Yoast SEO là một trong những plugin SEO phổ biến nhất dành cho WordPress, với hàng triệu lượt cài đặt đang hoạt động. Plugin này giúp người dùng tối ưu hóa nội dung website cho công cụ tìm kiếm (như Google) và cải thiện thứ hạng trang web.
Plugin Yoast SEO cho WordPress tồn tại lỗ hổng Reflected Cross-Site Scripting (XSS) thông qua các URL ở tất cả các phiên bản <= 22.5. Lỗ hổng này phát sinh do việc không sanitization input đầy đủ và cơ chế thoát đầu ra bị lỗi và đặc biệt ảnh hưởng đến xử lý URL trong kiến trúc của plugin.
Lỗ hổng Reflected Cross-Site Scripting của Yoast SEO xảy ra do sử dụng hàm add_premium_link() trong class WPSEO_Admin_Bar_Menu và tác động đến hàm build_shortlink() trong class WPSEO_Shortlinker . Sự sai sót trong chức năng escape chưa được hiệu quả cho phép kẻ tấn công triển khai các script độc hại trên các trang web bị ảnh hưởng.
Affected Software
Plugin: Yoast SEO Plugin for WordPress
Active Installations: Over 5 million worldwide
Affected Assets: Yoast SEO <= 22.5
Classification: Reflected Cross-Site Scripting (XSS)
CVSS Score: 6.1 (Medium Severity)
Patch Analysis
Ta thấy file được patch có tên class-wpseo-admin-bar-menu.php ⇒ Có vẻ file code này dùng để hiển thị Bar Admin Menu cho Yoast SEO
Ta thấy ở đây bản patch dùng hàm esc_url() dùng để sanitize hàm $this->shortlinker->build_shortlink( '<https://yoa.st/admin-bar-get-premium>') ⇒ Ta biết được SINK là hàm trên. Công việc ở đây đã đơn giản hơn nhiều chỉ cần trace từ sink đến source.
Như ta thấy thì có 2 chỗ code được thay đổi: Dòng 593 và 603 /trunk/inc/class-wpseo-admin-bar-menu.php
Mình đã có sink gây lỗi ⇒ Từ sink này trace ngược vể source ⇒ Trace những hàm gọi tới hàm này:
\inc\class-wpseo-admin-bar-menu.php⇒add_premium_link()\inc\class-wpseo-shortlinker.php⇒build_shortlink()\src\helpers\short-link-helper.php⇒build()\src\helpers\short-link-helper.php⇒collect_additional_shortlink_data()
Technical Analysis
Hàm add_premium_link() có chức năng chính dùng để sell gói Premium của Plugin này hàm này tạo 1 Hyperlink dẫn tới trang đăng kí premium. Hàm sẽ kiểm tra xem thử nay có phải là Black Friday không nếu phải nó sẽ hiện thêm 30% discount khi đăng kí.
Hàm sprintf() Dùng để hiển thị đoạn HTML trên, Trong hàm sprintf() này có chứa đoạn code được patch đó là $this->shortlinker->build_shortlink( '<https://yoa.st/admin-bar-get-premium>') . Có thể đoán được rằng hàm build_shortlink() là một hàm được gọi để tạo liên kết rút gọn cho URL. ⇒ Nếu hàm này cho phép người dùng không xác thực có thể tạo URL tùy ý thì có thể dẫn tới XSS.
Tiếp tục kiểm tra đến hàm build_shortlink() trong class WPSEO_Shortlinker :
Hàm này nhận vào là một tham số có dạng là $url sau đó trả về URL được xử lí qua method build() ⇒ URL trả về là URL đã được rút gọn ⇒ Từ đó phân tích hàm build() trong short-link-helper.php
Hàm build() lại gọi đến hàm này collect_additional_shortlink_data() ⇒ Hàm này có thể dùng để import thêm data vào trong shortlink ⇒ Thử xem hàm thật sự dùng để làm gì ?
Đúng như cái tên collect_additional_shortlink_data() hàm này dùng để thêm những metadata vào Hyperlink. Hàm này lưu trữ các metadata bằng 1 array. Ngoài ra hàm này có nhận một tham số đến từ người dùng $_GET['page'] .
Tuy nhiên tham số $_GET['page'] sẽ được sanitize trước khi gán vào array ở dòng $admin_page = sanitize_text_field( \wp_unslash( $_GET['page'])) có 2 hàm dùng để filter, Sanitize:
wp_unslash()⇒ Loại bỏ các dấu backslash (\) ra khỏi chuỗisanitize_text_field()⇒ Loại bỏ tags HTML, Loại bỏ khoảng trắng thừa, Chuyển đổi các ký tự đặc biệt sang HTML entities
⇒ Thử xem xét context mà Untrusted Data rơi vào Sink:
Bước 1: Truy vấn main page với tham số
?page=macilious:

Bước 2: Sau đó check đường dẫn đến trang premium có giá trị hyperlink là gì ??

Ở đây ta có thể thao túng giá trị của screen=macilious
Từ đó ta thấy trong context này untrusted rơi thẳng vào tag <a> ⇒ Giả thuyết: Không cần tạo thêm một tag mới mà ta chỉ cần chèn thêm atrribute nào đó dùng để handler event là trigger được XSS rồi
Exploit
Bước 1: Truy cập vào Main Page, thêm tham số
?page=với tham số sau:
Bước 2: Sau khi thêm payload tấn công trên ta di chuyển chuột đến phần tử Hyper Link
Get Yoast SEO Premiumtừ đó Trigger được XSS:

Last updated

