Apakah ada kerentanan yang diketahui untuk wp-cron.php?

9

Saya menggunakan WordPress v.4.1 dan semua plugin dan tema sudah terbaru.

Saya melihat di file log saya terlalu banyak dari ini ...

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"

di mana xxx.xxx.xxx.xxx adalah alamat IP server tempat situs web-host dan " http://www.example.com " adalah situs web saya.

Apakah ada kerentanan (exploit) yang diketahui memengaruhi wp-cron.php?
Apakah ada cara untuk "melindungi" file?

Terima kasih!

kanenas
sumber

Jawaban:

4

Di wp-includes/default-filters.phpkami dapat menemukan pendaftaran panggilan balik:

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

Jika kita menjalankan fungsinya wp_cron()sekarang, kita melihat ini:

$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() mengirimkan permintaan POST yang Anda lihat di log Anda:

$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'] );

Di sini Anda juga dapat melihat dari mana angka float berasal: Ini dilewatkan sebagai argumen untuk mengidentifikasi transien.

Tidak ada yang perlu dikhawatirkan.

fuxia
sumber
-1

Jika Anda ingin melindungi file Anda dapat membatasi akses ke file melalui httpd.conf Anda (file konfigurasi Apache global).

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

Ganti IP dalam contoh dengan IP server Anda. Ini masih akan memberi Anda akses ke file dari server menggunakan perintah seperti:

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

Dan itu akan mengembalikan 403 (akses ditolak untuk permintaan dari IP lain). Jika Anda menggunakan aturan tambahan seperti di bawah ini Anda akan mengarahkan permintaan eksternal dari 403 Forbiddenke halaman lain (seperti beranda) yang sebenarnya tidak perlu.

ErrorDocument 403 https://www.domain.ca

Bahkan lebih baik, Anda dapat menggunakan Require ip 127.0.0.1dengan contoh di atas dan menggunakan permintaan wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Itu akan menggunakan pengontrol jaringan loopback dan permintaan Anda tidak akan diteruskan ke internet umum dan kembali.

jonnyjandles
sumber
1
yang akan memblokir permintaan dari cron OS yang biasanya dilakukan menggunakan wget
Mark Kaplun
Bisakah Anda mengarahkan saya ke tempat wget dipanggil dalam kode sumber. Pencarian cepat saya tidak membantu saya menemukannya dengan cepat. Saya menemukan ref serveral untuk wget, tetapi hanya di WordFence dan plugin BulletProof.
jonnyjandles
Wordpress tidak menggunakan crons OS. Juga, dengan menggunakan aturan di atas, saya bisa menggunakan wget-cron.php menggunakan wget localhost / wp-cron.php dan juga wget 127.0.0.1/wp-cron.php . Namun, ketika mencoba mengakses dari luar saya mengikuti di access_log "GET /wp-cron.php HTTP / 1.1" 302 (redirection). Karena saya juga memiliki ErrorDocument 403 domain.com/index.php yang rute semua akses ditolak untuk homepage.
jonnyjandles
cron adalah http yang diminta dari wordpress core. Semua tutorial yang tersedia di internet menyarankan agar Anda menggunakan wget untuk memicu WP cron dari OS cron sebagai pengganti pemicu crin asli WP. Selain itu pemfilteran dengan IP yang selalu merupakan strategi kehilangan bahkan lebih buruk dalam kasus ini seperti ketika Anda memindahkan situs Anda baik cron akan berhenti bekerja dan Anda tidak akan tahu mengapa atau garis-garis itu akan berhenti berpengaruh
Mark Kaplun
Gunakan 127.0.0.1 alih-alih IP publik server seperti yang saya sebutkan dalam jawaban saya.
jonnyjandles