Vào tháng 10 năm nay, chúng tôi đã nhận được báo cáo từ ngocnb và khuyenn từ Công ty cổ phần GiaoHangTietKiem về lỗ hổng SQL injection trong WordPress. Lỗi này có thể cho phép kẻ tấn công để lộ dữ liệu được lưu trữ trong cơ sở dữ liệu được kết nối. Lỗ hổng này gần đây đã được giải quyết là CVE-2022-21661 (ZDI-22-020). Blog này đề cập đến nguyên nhân gốc rễ của lỗi và xem xét cách nhóm WordPress đã chọn để giải quyết nó. Đầu tiên, đây là một video nhanh chứng minh lỗ hổng
lỗ hổng
Lỗ hổng xảy ra trong lớp WordPress Query (WP_Query). Đối tượng WP_Query được sử dụng để thực hiện các truy vấn tùy chỉnh tới cơ sở dữ liệu WordPress. Đối tượng này được sử dụng bởi các plugin và chủ đề để tạo hiển thị bài đăng tùy chỉnh của họ.
Lỗ hổng xảy ra khi plugin sử dụng lớp dễ bị tấn công. Một plugin như vậy là Elementor Custom Skin. Đối với bài đăng này, chúng tôi đã kiểm tra lỗ hổng trên WordPress phiên bản 5. 8. 1 và plugin Elementor Custom Skin phiên bản 3. 1. 3
Trong plugin này, lớp WP_Query dễ bị tấn công được sử dụng trong phương thức get_document_data của phân trang ajax. php
Hình 1- - wordpress/wp-content/plugins/ele-custom-skin/includes/ajax-pagination. php
Phương thức get_document_data được gọi khi yêu cầu được gửi tới wp-admin/admin-ajax. php và tham số hành động là ecsload.
Hình 2 - wordpress/wp-admin/admin-ajax. php
quản trị-ajax. trang php kiểm tra xem yêu cầu có được thực hiện bởi người dùng được xác thực hay không. Nếu yêu cầu đến từ người dùng không được xác thực, admin-ajax. php gọi một hành động Ajax không được xác thực. Ở đây, yêu cầu được gửi mà không cần xác thực để hành động Ajax không được xác thực được gọi, đó là wp_ajax_nopriv_ecsload
Tìm kiếm chuỗi “wp_ajax_nopriv_ecsload” cho thấy rằng đó là một tên hook có trong phân trang ajax. trang php
Hình 3 - wordpress/wp-content/plugins/ele-custom-skin/includes/ajax-pagination. php
Tên hook wp_ajax_nopriv_ecsload đề cập đến chức năng gọi lại get_document_data. Điều này có nghĩa là phương thức do_action gọi phương thức get_document_data
Phương thức get_document_data tạo một đối tượng WP_Query. Việc khởi tạo đối tượng WP_Query gọi phương thức get_posts sau
Hình 4 - wordpress/wp-gồm/class-wp-query. php
Trước tiên, phương thức get_posts phân tích cú pháp các tham số do người dùng cung cấp. Tiếp theo, nó gọi phương thức get_sql, phương thức này cuối cùng sẽ gọi get_sql_for_clause để tạo các mệnh đề của câu lệnh SQL từ dữ liệu do người dùng cung cấp. get_sql_for_clause gọi clean_query để xác thực chuỗi do người dùng cung cấp. Tuy nhiên, phương pháp không thể xác thực tham số thuật ngữ nếu tham số phân loại trống và giá trị của tham số trường là chuỗi “term_taxonomy_id”. Giá trị của tham số thuật ngữ sau này được sử dụng trong câu lệnh SQL
Hình 5 - wordpress/wp-includes/class-wp-tax-query. php
Lưu ý rằng biến sql được trả về bởi get_sql() được thêm vào câu lệnh SQL SELECT và được tập hợp bằng các chuỗi được trả về từ phương thức WP_Tax_Query->get_sql(). Sau đó, trong phương thức get_posts, truy vấn này được thực thi bằng phương thức $wpdb->get_col(), khi xảy ra điều kiện SQL injection
Lỗ hổng này có thể bị khai thác để đọc cơ sở dữ liệu WordPress
Xem kích thước đầy đủ
Mảnh vụn
Bản vá cho địa chỉ CVE-2022-21661 thêm một số kiểm tra bổ sung vào tham số điều khoản để giúp ngăn chặn các lần tiêm SQL tiếp theo xảy ra
Xem kích thước đầy đủ
Hình 7 - Phương thức clean_query của wordpress/wp-includes/class-wp-tax-query. php
Phần kết luận
Các cuộc tấn công tích cực vào các trang web WordPress thường tập trung vào các plugin tùy chọn hơn là cốt lõi của chính WordPress. Đó là trường hợp đầu năm nay khi một lỗi trong plugin Trình thiết kế sản phẩm ưa thích được báo cáo là đang bị tấn công tích cực. Tương tự, một lỗ hổng tải lên tệp trong plugin Contact Form 7 cũng được phát hiện là bị khai thác bởi các cảm biến của Trend Micro. Trong trường hợp này, lỗi được phát hiện thông qua các plugin, nhưng tồn tại trong chính WordPress. Mặc dù đây là vấn đề tiết lộ thông tin hơn là thực thi mã nhưng dữ liệu bị lộ có thể chứng minh giá trị đối với những kẻ tấn công. Chúng tôi sẽ không ngạc nhiên khi thấy lỗi này trong các cuộc tấn công tích cực trong tương lai gần. Chúng tôi khuyên bạn nên áp dụng bản vá hoặc thực hiện hành động khắc phục khác càng sớm càng tốt. Đặc biệt cảm ơn ngocnb và khuyenn từ GiaoHangTietKiem JSC đã báo cáo điều này với ZDI. Bạn có thể đọc phân tích của họ về lỗi tại đây
Trang này chứa thông tin chi tiết về plugin WordPress check_ajax_referer() Function SQL Injection Nessus bao gồm các khai thác và PoC có sẵn được tìm thấy trên GitHub, trong Metasploit hoặc Exploit-DB để xác minh lỗ hổng này
Tổng quan về plugin
TÔI. 25291
Tên. WordPress check_ajax_referer() Chức năng SQL Injection
tên tệp. wordpress_ajax_referer_sql_injection. mũi
Lỗ hổng được xuất bản. 2007-05-21
Plugin này đã được xuất bản. 2007-05-23
Thời gian sửa đổi cuối cùng. 2021-01-19
Phiên bản plugin. 1. 23
Loại plugin. Xa xôi
Gia đình plugin. lạm dụng CGI
phụ thuộc. wordpress_detect. mũi
Mục KB bắt buộc [?]. đã cài đặt_sw/WordPress, www/PHP
Thông tin lỗ hổng
mức độ nghiêm trọng. Cao
Lỗ hổng được xuất bản. 2007-05-21
Bản vá đã xuất bản. 2007-05-21
CVE [?]. CVE-2007-2821
CPE [?]. cpe. /Một. báo chí. báo chí
Tóm tắt
Máy chủ web từ xa chứa tập lệnh PHP dễ bị tấn công SQL injection
Sự miêu tả
Phiên bản WordPress trên máy chủ từ xa không thể vệ sinh đầu vào đúng cách cho tham số 'cookie' của 'wp-admin/admin-ajax. php' trước khi sử dụng nó trong chức năng 'check_ajax_referer' trong các truy vấn cơ sở dữ liệu. Bất kể cài đặt 'magic_quotes_gpc' của PHP là gì, kẻ tấn công từ xa, không được xác thực có thể lợi dụng vấn đề này để khởi chạy các cuộc tấn công SQL injection đối với ứng dụng bị ảnh hưởng, bao gồm cả việc phát hiện mật khẩu băm của người dùng WordPress
Giải pháp
Nâng cấp lên phiên bản 2. 2. 1 hoặc muộn hơn
Khai thác công cộng
(Các) Cổng Mạng Mục tiêu. 80
(Các) Tài sản Mục tiêu. Dịch vụ/www
Khai thác có sẵn. Đúng (Khai thác-DB, GitHub)
Khai thác dễ dàng. Không cần khai thác
Dưới đây là danh sách các khai thác và PoC đã biết công khai để xác minh lỗ hổng WordPress check_ajax_referer() Function SQL Injection
Trước khi chạy bất kỳ khai thác nào đối với bất kỳ hệ thống nào, hãy đảm bảo rằng bạn được chủ sở hữu của (các) hệ thống đích ủy quyền để thực hiện hoạt động đó. Trong mọi trường hợp khác, đây sẽ được coi là một hoạt động bất hợp pháp
CẢNH BÁO. Cẩn thận với việc sử dụng các khai thác chưa được xác minh từ các nguồn như GitHub hoặc Exploit-DB. Những khai thác và PoC này có thể chứa phần mềm độc hại. Để biết thêm thông tin, xem
Thông tin rủi ro
Vectơ CVSS V2 [?]. AV. không áp dụng. L/Âu. không áp dụng. SỐ PI. P/A. THỂ DỤC. H/RL. CỦA/RC. Điểm cơ sở CCVSS. 7. 5 (Cao)Điểm phụ tác động. 6. 4Điểm phụ về khả năng khai thác. 10. 0CVSS Điểm tạm thời. 6. 5 (Trung bình)Điểm môi trường CVSS. NA (Không có)Chỉ số phụ tác động đã sửa đổi. NAĐiểm CVSS tổng thể. 6. 5 (Trung bình)Đi
Nguồn plugin
Đây là wordpress_ajax_referer_sql_injection. mã nguồn plugin nasl nessus. Tập lệnh này là Bản quyền (C) 2007-2021 Tenable Network Security, Inc
#%NASL_MIN_LEVEL 70300 # # (C) Tenable Network Security, Inc. # include('deprecated_nasl_level.inc'); include('compat.inc'); if (description) { script_id(25291); script_version("1.23"); script_set_attribute(attribute:"plugin_modification_date", value:"2021/01/19"); script_cve_id("CVE-2007-2821"); script_bugtraq_id(24076); script_xref(name:"EDB-ID", value:"3960"); script_name(english:"WordPress check_ajax_referer() Function SQL Injection"); script_summary(english:"Attempts to generate a SQL error."); script_set_attribute(attribute:"synopsis", value: "The remote web server contains a PHP script that is prone to a SQL injection attack."); script_set_attribute(attribute:"description", value: "The version of WordPress on the remote host fails to properly sanitize input to the 'cookie' parameter of the 'wp-admin/admin-ajax.php' script before using it in the 'check_ajax_referer' function in database queries. Regardless of PHP's 'magic_quotes_gpc' setting, an unauthenticated, remote attacker can leverage this issue to launch SQL injection attacks against the affected application, including the discovery of password hashes of WordPress users."); script_set_attribute(attribute:"see_also", value:"//www.waraxe.us/advisory-50.html"); script_set_attribute(attribute:"see_also", value:"//seclists.org/bugtraq/2007/May/316"); script_set_attribute(attribute:"solution", value:"Upgrade to version 2.2.1 or later."); script_set_cvss_base_vector("CVSS2#AV:N/AC:L/Au:N/C:P/I:P/A:P"); script_set_cvss_temporal_vector("CVSS2#E:H/RL:OF/RC:C"); script_set_attribute(attribute:"exploitability_ease", value:"No exploit is required"); script_set_attribute(attribute:"exploit_available", value:"false"); script_set_attribute(attribute:"vuln_publication_date", value:"2007/05/21"); script_set_attribute(attribute:"patch_publication_date", value:"2007/05/21"); script_set_attribute(attribute:"plugin_publication_date", value:"2007/05/23"); script_set_attribute(attribute:"plugin_type", value:"remote"); script_set_attribute(attribute:"cpe", value:"cpe:/a:wordpress:wordpress"); script_end_attributes(); script_category(ACT_ATTACK); script_family(english:"CGI abuses"); script_copyright(english:"This script is Copyright (C) 2007-2021 Tenable Network Security, Inc."); script_dependencies("wordpress_detect.nasl"); script_require_keys("installed_sw/WordPress", "www/PHP"); script_require_ports("Services/www", 80); exit(0); } include("audit.inc"); include("global_settings.inc"); include("misc_func.inc"); include("http.inc"); include("url_func.inc"); include("install_func.inc"); app = "WordPress"; get_install_count(app_name:app, exit_if_zero:TRUE); port = get_http_port(default:80, php:TRUE); install = get_single_install( app_name : app, port : port ); dir = install['path']; install_url = build_url(port:port, qs:dir); # Try to exploit the flaw to generate a SQL error. exploit = "'" + SCRIPT_NAME; # nb: this works as long as the USER_COOKIE and PASS_COOKIE are # derived from COOKIEHASH / site url as in wp-settings.php. site = "//" + get_host_name(); if (port != 80) site = site + ":" + port; if (strlen(dir)-1 == '/') dir = substr(dir, 0, strlen(dir)-2); site = site + dir; cookiehash = hexstr(MD5(site)); # nb: we need to encode (twice) the single quote. cookie = urlencode( str : exploit, unreserved : "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_!~*()-]/" ); cookie = "wordpressuser_" + cookiehash + "=" + cookie + "; " + "wordpresspass_" + cookiehash + "=x"; u = dir + "/wp-admin/admin-ajax.php?cookie=" + urlencode(str:cookie); r = http_send_recv3(method: "GET", port:port, item: u, exit_on_fail: TRUE); # There's a problem if we see an error involving our exploit for the user name. if ("WordPress database error" >< r[2]) { res2 = str_replace(find:"'", replace:"'", string:r[2]); if (" WHERE user_login = '" + exploit + "'" >< res2) { set_kb_item(name: 'www/'+port+'/SQLInjection', value: TRUE); security_hole(port); exit(0); } } else audit(AUDIT_WEB_APP_NOT_AFFECTED, app, install_url);Phiên bản mới nhất của tập lệnh này có thể được tìm thấy ở những vị trí này tùy thuộc vào nền tảng của bạn
- Linux / Unix
/opt/nessus/lib/nessus/plugins/wordpress_ajax_referer_sql_injection.nasl - các cửa sổ
C:\ProgramData\Tenable\Nessus\nessus\plugins\wordpress_ajax_referer_sql_injection.nasl - hệ điều hành Mac
/Library/Nessus/run/lib/nessus/plugins/wordpress_ajax_referer_sql_injection.nasl
Đi
Làm thế nào để chạy
Đây là cách chạy WordPress check_ajax_referer() Function SQL Injection như một plugin độc lập thông qua giao diện người dùng web Nessus (https. //máy chủ cục bộ. 8834/)
- Nhấp để bắt đầu Quét mới
- Chọn Quét nâng cao
- Điều hướng đến tab Plugin
- Ở góc trên cùng bên phải, nhấp để Tắt tất cả các plugin
- Ở bảng bên trái, chọn họ plugin lạm dụng CGI
- Trên bảng bên phải, chọn WordPress check_ajax_referer() Hàm plugin SQL Injection ID 25291
- Chỉ định mục tiêu trên tab Cài đặt và nhấp để Lưu quá trình quét
- Chạy quét
Dưới đây là một vài ví dụ về cách chạy plugin trong dòng lệnh. Lưu ý rằng các ví dụ bên dưới minh họa cách sử dụng trên nền tảng Linux/Unix
sử dụng cơ bản
/opt/nessus/bin/nasl wordpress_ajax_referer_sql_injection.nasl -tChạy plugin với thông báo theo dõi kiểm toán trên bảng điều khiển
/opt/nessus/bin/nasl -a wordpress_ajax_referer_sql_injection.nasl -tChạy plugin với việc thực thi tập lệnh theo dõi được ghi vào bảng điều khiển (hữu ích để gỡ lỗi)
/opt/nessus/bin/nasl -T - wordpress_ajax_referer_sql_injection.nasl -tChạy plugin bằng cách sử dụng tệp trạng thái cho mục tiêu và cập nhật nó (hữu ích khi chạy nhiều plugin trên mục tiêu)