Wp-admin/admin-ajax php trả về 0 khai thác

Gần đây, nhóm Wordfence Threat Intelligence đã xác định được nhiều lỗ hổng nghiêm trọng trong plugin Total Donations thương mại dành cho WordPress. Các lỗ hổng này, có trong tất cả các phiên bản plugin đã biết cho đến và bao gồm 2. 0. 5, đang bị khai thác bởi các tác nhân độc hại để có quyền truy cập quản trị vào các trang web WordPress bị ảnh hưởng. Chúng tôi đã dành riêng CVE-2019-6703 để theo dõi và tham chiếu chung các lỗ hổng này

Chúng tôi khuyên chủ sở hữu trang web sử dụng Total Donations nên xóa–chứ không chỉ hủy kích hoạt–plugin dễ bị tấn công càng sớm càng tốt để bảo mật trang web của họ. Bài viết sau đây trình bày chi tiết các sự cố hiện có trong Tổng số tiền quyên góp, cũng như các cuộc tấn công đang hoạt động nhằm vào plugin. Chúng tôi cũng sẽ xem xét quy trình tiết lộ của chúng tôi và các bước chúng tôi đã thực hiện trong nỗ lực liên hệ với nhà phát triển plugin để đạt được giải pháp

Nhật ký truy cập tò mò

Như trường hợp của nhiều cuộc điều tra, phát hiện này được hỗ trợ trực tiếp bởi sai lầm của kẻ tấn công. Trong quá trình khắc phục một trang web bị xâm nhập, một nhà phân tích đã xác định một loạt hành động AJAX đáng ngờ trong nhật ký truy cập của trang web [dữ liệu bổ sung đã bị xóa để làm rõ]

POST /wp-admin/admin-ajax.php?action=migla_getme
POST /wp-admin/admin-ajax.php?action=migla_getme
POST /wp-admin/admin-ajax.php?action=miglaA_update_me
POST /wp-admin/admin-ajax.php?action=miglaA_update_me
GET /wp-login.php?action=register

Tìm kiếm cơ sở mã của trang web để tìm các chuỗi

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
6 và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
0 đã phát hiện ra plugin Total Donations đã cài đặt và chúng tôi đã nhanh chóng xác định các lỗ hổng bị khai thác cũng như quy trình làm việc của kẻ tấn công

Sai lầm của kẻ tấn công là sử dụng

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
1 trong chuỗi truy vấn của các yêu cầu này. API AJAX của WordPress xử lý
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
2 và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
3 như nhau, vì vậy nếu
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
4 được chuyển vào phần POST của yêu cầu thay vì chuỗi truy vấn, thì hoạt động đó sẽ gần như không rõ ràng

Nhiều hành động AJAX dễ bị tổn thương

Total Donations đăng ký tổng cộng 88 hành động AJAX duy nhất vào WordPress, mỗi hành động trong số đó có thể được truy cập bởi người dùng chưa được xác thực bằng cách truy vấn điểm cuối

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
5 điển hình. Chúng tôi đã xác định rằng 49 trong số 88 hành động này có thể bị kẻ xấu khai thác để truy cập dữ liệu nhạy cảm, thực hiện các thay đổi trái phép đối với nội dung và cấu hình của trang web hoặc chiếm toàn bộ trang web dễ bị tổn thương

Một số vấn đề đáng chú ý hơn như sau

Cập nhật tùy chọn tùy ý dẫn đến tiếp quản trang web

Các lỗ hổng rõ ràng nhất trong Tổng số tiền quyên góp cho phép người dùng không được xác thực đọc và cập nhật các tùy chọn WordPress tùy ý và đây là nơi chúng tôi đã xác định hoạt động khai thác tích cực trong tự nhiên

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}

Hàm

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
6 [hiển thị ở trên] và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
7 đều cho phép kẻ tấn công không có đặc quyền đọc giá trị của bất kỳ tùy chọn WordPress nào

add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
0 [hiển thị ở trên],
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
9 và
add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
0 [thực ra giống hệt với
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
0] đều có thể được sử dụng để sửa đổi giá trị của các tùy chọn này

Cùng nhau, có thể sử dụng

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
6 và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
0 để bật tùy chọn
add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
4 và đặt
add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
5 thành “quản trị viên”. Với các cài đặt này, bất kỳ ai cũng có thể tự do đăng ký tài khoản với quyền quản trị trên trang web dễ bị tấn công, nơi họ có thể thực hiện các hoạt động độc hại khác mà không gặp sự cố

Truy cập, sửa đổi và xóa các gói thanh toán Stripe định kỳ

Total Donations có thể kết nối với Stripe với tư cách là bên xử lý thanh toán và có thể sử dụng API Plans của Stripe để lên lịch quyên góp định kỳ. Thật không may, không có chức năng AJAX nào được sử dụng để tương tác với các gói này có bất kỳ tính năng kiểm soát truy cập nào

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
7

Các chức năng này, bao gồm 

add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
6 [hiển thị ở trên],
add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
7 và
add_action["wp_ajax_nopriv_miglaA_update_me", "miglaA_update_me"];
add_action["wp_ajax_miglaA_update_me", "miglaA_update_me"];

function miglaA_update_me[] {
$key = $_POST['key'];
$value = $_POST['value'];

update_option[ $key , $value];

die[];
}
8, có thể bị lợi dụng để thực hiện các thay đổi trái phép đối với các khoản đóng góp định kỳ của trang web bị ảnh hưởng

Ngoài ra, khi kết hợp với lỗ hổng cập nhật tùy chọn tùy ý có trong

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
0, kẻ tấn công có thể sửa đổi các tùy chọn lưu trữ khóa API của Stripe để định tuyến hoàn toàn các khoản đóng góp đến một tài khoản Stripe khác

Truy cập danh sách gửi thư liên tục và Mailchimp

Các trang web đang tìm cách thực hiện các đợt quyên góp thường sẽ sử dụng danh sách gửi thư để thúc đẩy các chiến dịch này và Total Donations bao gồm chức năng có thể tích hợp các chiến dịch của riêng mình với danh sách gửi thư thông qua cả Liên hệ liên tục và Mailchimp

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
2

Giống như phần còn lại của các chức năng này, cả

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
70 và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
71 [hiển thị ở trên] đều không thể thực hiện bất kỳ loại kiểm tra quyền nào trước khi trả về dữ liệu được liên kết với danh sách gửi thư của tài khoản được kết nối

Các lỗ hổng khác

Một số lỗ hổng khác tồn tại trong plugin, sẽ gây tranh cãi khi kẻ tấn công có thể có quyền truy cập quản trị và thực hiện bất kỳ hoạt động nào khác theo cách thủ công từ đó. Tuy nhiên, để minh họa phạm vi các vấn đề của Total Donation, đây là một vài trong số đó

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
5

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
72, một chức năng nhằm tạo báo cáo quyên góp, có thể cho phép truy cập không được xác thực vào các bài đăng riêng tư và chưa xuất bản

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
7

Cả

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
73 và
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
74 đều gọi hàm nội bộ
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
75 [sic], có thể dễ bị SQL injection nếu tính năng
add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
76 của WordPress bị bỏ qua. Không bỏ qua, nó vẫn có thể được sử dụng để thay đổi tiêu đề bài đăng tùy ý trên một trang web dễ bị tấn công

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
2

Nhiều hành động, bao gồm cả

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
77, có thể bị kẻ tấn công lạm dụng để gửi email kiểm tra đến một địa chỉ tùy ý. Điều này có thể được tự động hóa dưới dạng Từ chối dịch vụ [DoS] đối với email gửi đi, bằng cách kích hoạt giới hạn chuyển tiếp thư đi của máy chủ lưu trữ hoặc bằng cách khiến trang web nạn nhân xuất hiện trong danh sách đen spam

Plugin bị bỏ rơi, không có phản hồi của nhà phát triển

Những lỗ hổng bảo mật này được coi là lỗ hổng zero-day do chúng bị khai thác tích cực và thiếu bản vá có sẵn. Vào ngày 16 tháng 1, chúng tôi đã làm việc để liên hệ với nhóm phát triển của Total Donations, Calmar Webmedia, để cùng nhau tạo ra một bản vá và bảo vệ những người dùng bị ảnh hưởng. Thật không may, quá trình thực hiện liên hệ này đã tiết lộ rằng một giải pháp có thể không bao giờ đến

Trang web Tổng số tiền quyên góp chính thức hiện đang hiển thị trang giới thiệu Sắp ra mắt này và kể từ tháng 5 năm 2018

Hiện tại dường như không có bất kỳ phương tiện hợp pháp nào để có được phiên bản Total Donations mới nhất. Trang chủ của plugin hiện đang hiển thị trang Sắp ra mắt, có hình ảnh mô phỏng của một trang web mới. Đường dẫn tải lên của hình ảnh này cho thấy trang web đã ở trạng thái này kể từ tháng 5 năm 2018

Plugin trước đây được phân phối qua thị trường CodeCanyon của Envato. Total Donations không còn có sẵn để mua, nhưng trang đánh giá của nó vẫn có thể truy cập được

Các đánh giá tiêu cực về sự vắng mặt của hỗ trợ nhà phát triển trong nhiều năm trở lại đây

Vấn đề phổ biến nhất được trích dẫn trong các đánh giá này là thiếu hỗ trợ sản phẩm, với các khiếu nại kéo dài đến ba năm nêu chi tiết về việc các nhà phát triển plugin hoàn toàn không phản hồi. Là một nhà nghiên cứu bảo mật muốn liên hệ khẩn cấp về một mối đe dọa đang hoạt động, đây là một điềm xấu sớm

Hồ sơ người bán được liên kết với Total Donations chứa thông tin và liên kết hỗ trợ đến Calmar Webmedia, một công ty phát triển có trụ sở tại Vancouver. Tuy nhiên, dự án này dường như cũng đã bị bỏ rơi. Trang hỗ trợ của công ty tải một màn hình trống, có thể là Màn hình trắng chết chóc và trang Yêu cầu báo giá chỉ hiển thị một mã ngắn không hoạt động

Một yếu tố vẫn còn hoạt động trên trang web của Calmar Webmedia là hoạt ảnh JavaScript của một hình người que đang chạy từ một chiếc xe tăng, xuất hiện ở cuối trang của mỗi trang

Cuối cùng, phương pháp chính thức duy nhất để liên hệ với Calmar Webmedia là một biểu mẫu liên hệ có sẵn ở cuối trang chủ của công ty. Vào ngày 16 tháng 1, chúng tôi đã gửi yêu cầu liên hệ thông qua biểu mẫu này và chưa nhận được bất kỳ xác nhận nào từ Calmar Webmedia

Do không có bất kỳ phản hồi nào của nhà phát triển, việc từ bỏ plugin Total Donations rõ ràng và các cuộc tấn công tích cực vào các trang web dễ bị tổn thương, theo chính sách tiết lộ đã công bố của chúng tôi, chúng tôi đã tiết lộ thông tin này như một phương tiện để cộng đồng nhận thức được mối đe dọa

Xóa plugin, đừng chỉ hủy kích hoạt nó

Như chúng tôi đã đề xuất trước đó trong bài đăng này, để bảo mật hoàn toàn một trang web bị ảnh hưởng, plugin Tổng số tiền quyên góp phải bị xóa hoàn toàn, không chỉ bị vô hiệu hóa. Điều này là do một điểm cuối AJAX thay thế được các nhà phát triển tích hợp vào Total Donations

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
4

Tập lệnh,

add_action["wp_ajax_migla_getme", "migla_getme"];
add_action["wp_ajax_nopriv_migla_getme", "migla_getme"];

function migla_getme[]{
$r = get_option[$_POST['key']];
echo $r;
die[];
}
78, tải môi trường WordPress của trang web, sau đó đăng ký và thực thi bất kỳ hành động AJAX nào được thông qua, ngay cả khi Tổng số tiền quyên góp bị hủy kích hoạt. Điều này cũng có thể được sử dụng để gọi bất kỳ chức năng tùy ý nào, bất kể nó có được liên kết với plugin Total Donations hay không, tự nó gây ra các rủi ro bảo mật bổ sung

Bước tiếp theo

Chúng tôi sẽ tiếp tục theo dõi hoạt động độc hại liên quan đến CVE-2019-6703 trong tương lai và sẽ báo cáo về bất kỳ thay đổi đáng chú ý nào trong hoạt động này

Chúng tôi đã phát hành quy tắc tường lửa để bảo vệ các trang web sử dụng Wordfence WAF khỏi các lỗ hổng này, mà những người đăng ký Premium của chúng tôi đã nhận được. Các trang web được bảo vệ bởi phiên bản miễn phí sẽ nhận được nó sau độ trễ tiêu chuẩn của chúng tôi là ba mươi ngày. Do mức độ nghiêm trọng của các lỗ hổng, chúng tôi thực sự khuyên mọi người, kể cả khách hàng Cao cấp của chúng tôi, hãy xóa plugin khỏi trang web của họ và tìm kiếm một giải pháp thay thế

Vui lòng cân nhắc chia sẻ tiết lộ này để nâng cao nhận thức về các mối đe dọa này và nếu ai đó bạn biết sử dụng plugin trên một trong các trang web của họ, hãy cảnh báo họ ngay lập tức

Đối với bất kỳ câu hỏi nào liên quan đến quyết định tiết lộ những lỗ hổng chưa được vá này của chúng tôi, vui lòng tham khảo Chính sách tiết lộ lỗ hổng bảo mật của chúng tôi

Tín dụng. Dữ liệu tấn công ban đầu được phát hiện bởi Nhà phân tích bảo mật Nate Smith. Đánh giá lỗ hổng và nghiên cứu nhà cung cấp được thực hiện bởi Nhà phân tích mối đe dọa Mikey Veenstra, với đánh giá bổ sung của Matt Rusnak và Ramuel Gall. Do Dan Moen và Mark Maunder biên tập

Chủ Đề