Có một lỗ hổng đã biết cho wp-cron.php không?


9

Tôi đang sử dụng WordPress v.4.1 và tất cả các plugin và chủ đề được cập nhật.

Tôi thấy trong các tệp nhật ký của mình có quá nhiều ...

xxx.xxx.xxx.xxx - - [02/Jan/2015:13:30:27 +0200] "POST /wp-cron.php?doing_wp_cron=1420198227.5184459686279296875000 HTTP/1.0" 200 - "-" "WordPress/217; http://www.example.com"

trong đó xxx.xxx.xxx.xxx là địa chỉ IP của máy chủ mà trang web được lưu trữ và " http://www.example.com " là trang web của tôi.

Có một lỗ hổng đã biết (khai thác) ảnh hưởng đến wp-cron.php không?
Có cách nào để "bảo vệ" tập tin không?

Cảm ơn bạn!

Câu trả lời:


4

Trong wp-includes/default-filters.phpchúng tôi có thể tìm thấy một đăng ký gọi lại:

// WP Cron
if ( !defined( 'DOING_CRON' ) )
    add_action( 'init', 'wp_cron' );

Nếu chúng ta đi chức năng wp_cron()bây giờ, chúng ta thấy điều này:

$schedules = wp_get_schedules();
foreach ( $crons as $timestamp => $cronhooks ) {
    if ( $timestamp > $gmt_time ) break;
    foreach ( (array) $cronhooks as $hook => $args ) {
        if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )
            continue;
        spawn_cron( $gmt_time );
        break 2;
    }
}

spawn_cron() gửi yêu cầu POST mà bạn đang thấy trong nhật ký của mình:

$doing_wp_cron = sprintf( '%.22F', $gmt_time );
set_transient( 'doing_cron', $doing_wp_cron );

/**
 * Filter the cron request arguments.
 *
 * @since 3.5.0
 *
 * @param array $cron_request_array {
 *     An array of cron request URL arguments.
 *
 *     @type string $url  The cron request URL.
 *     @type int    $key  The 22 digit GMT microtime.
 *     @type array  $args {
 *         An array of cron request arguments.
 *
 *         @type int  $timeout   The request timeout in seconds. Default .01 seconds.
 *         @type bool $blocking  Whether to set blocking for the request. Default false.
 *         @type bool $sslverify Whether SSL should be verified for the request. Default false.
 *     }
 * }
 */
$cron_request = apply_filters( 'cron_request', array(
    'url'  => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),
    'key'  => $doing_wp_cron,
    'args' => array(
        'timeout'   => 0.01,
        'blocking'  => false,
        /** This filter is documented in wp-includes/class-http.php */
        'sslverify' => apply_filters( 'https_local_ssl_verify', false )
    )
) );

wp_remote_post( $cron_request['url'], $cron_request['args'] );

Ở đây bạn cũng có thể thấy số float đến từ đâu: Nó được truyền dưới dạng đối số để xác định thoáng qua.

Không có gì phải lo lắng về.


-1

Nếu bạn muốn bảo vệ tệp, bạn có thể hạn chế quyền truy cập vào tệp qua httpd.conf (tệp cấu hình Apache toàn cầu).

# Wordpress wp-cron.php file
<Files "wp-cron.php">
  Require ip 1.2.3.4
</Files>

Thay thế IP trong ví dụ bằng IP máy chủ của bạn. Điều này vẫn sẽ cung cấp cho bạn quyền truy cập vào tệp từ máy chủ bằng lệnh như:

wget -q -O - domain.com/wp-cron.php?doing_wp_cron

Và nó sẽ trả về 403 (quyền truy cập bị từ chối đối với các yêu cầu từ bất kỳ IP nào khác). Nếu bạn sử dụng một quy tắc bổ sung như bên dưới, bạn sẽ chuyển hướng các yêu cầu bên ngoài từ 403 Forbiddenmột trang khác (chẳng hạn như trang chủ) không thực sự cần thiết.

ErrorDocument 403 https://www.domain.ca

Thậm chí tốt hơn, bạn có thể sử dụng Require ip 127.0.0.1với ví dụ trên và sử dụng yêu cầu wget : wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Điều đó sẽ sử dụng bộ điều khiển mạng loopback và yêu cầu của bạn sẽ không được chuyển tiếp vào internet công cộng và quay lại.


1
điều đó sẽ chặn các yêu cầu từ hệ điều hành thường được thực hiện bằng cách sử dụng wget
Mark Kaplun

Bạn có thể chỉ cho tôi nơi wget được gọi trong mã nguồn. Tôi tìm kiếm nhanh không giúp tôi tìm thấy nó nhanh chóng. Tôi đã tìm thấy các giới thiệu máy chủ để wget, nhưng chỉ trong các plugin WordFence và BulletProof.
jonnyjandles

Wordpress không sử dụng hệ điều hành. Ngoài ra, bằng cách sử dụng quy tắc trên, tôi có thể wget wp-cron.php bằng cả wget localhost / wp-cron.php và wget 127.0.0.1/wp-cron.php . Tuy nhiên, khi cố gắng truy cập từ bên ngoài tôi như sau trong access_log "GET /wp-cron.php HTTP / 1.1" 302 (chuyển hướng). Bởi vì tôi cũng có ErrorDocument 403 domain.com/index.php , tất cả các truy cập đều bị từ chối đến trang chủ.
jonnyjandles

cron là http được yêu cầu từ lõi wordpress. Tất cả các hướng dẫn có sẵn trên mạng đều đề nghị bạn sử dụng wget để kích hoạt cron WP từ cron OS để thay thế cho kích hoạt crin riêng của WP. Ngoài ra, việc lọc bằng IP là một chiến lược thua lỗ thậm chí còn tồi tệ hơn trong trường hợp này vì khi bạn di chuyển trang web của mình, cron sẽ ngừng hoạt động và bạn sẽ không biết tại sao hoặc những dòng đó sẽ ngừng có hiệu lực
Mark Kaplun

Sử dụng 127.0.0.1 thay vì IP công cộng của máy chủ như tôi đã đề cập trong câu trả lời của mình sau đó.
jonnyjandles
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.