Esiste una vulnerabilità nota per wp-cron.php?


9

Sto usando WordPress v.4.1 e tutti i plugin e il tema sono aggiornati.

Vedo nei miei file di registro troppi di questi ...

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"

dove xxx.xxx.xxx.xxx è l'indirizzo IP del server su cui è ospitato il sito Web e " http://www.example.com " è il mio sito Web.

Esiste una vulnerabilità nota (exploit) che interessa wp-cron.php?
C'è un modo per "proteggere" il file?

Grazie!

Risposte:


4

In wp-includes/default-filters.phppossiamo trovare una registrazione di richiamata:

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

Se andiamo wp_cron()ora alla funzione , vediamo questo:

$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() invia la richiesta POST che stai vedendo nei tuoi registri:

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

Qui puoi anche vedere da dove proviene il numero float: viene passato come argomento per identificare il transitorio.

Nulla di cui preoccuparsi.


-1

Se si desidera proteggere il file, è possibile limitare l'accesso al file tramite httpd.conf (file di configurazione globale di Apache).

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

Sostituisci l'IP nell'esempio con l'IP del tuo server. Questo ti darà comunque accesso al file dal server usando un comando come:

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

E restituirà un 403 (accesso negato alle richieste da qualsiasi altro IP). Se usi una regola aggiuntiva come quella sotto, reindirizzerai le richieste esterne da 403 Forbiddenun'altra pagina (come la homepage) che non è davvero necessaria.

ErrorDocument 403 https://www.domain.ca

Ancora meglio, è possibile utilizzare Require ip 127.0.0.1con l'esempio precedente e utilizzare la richiesta wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Questo utilizzerà il controller di rete loopback e la tua richiesta non verrà inoltrata in Internet pubblica e viceversa.


1
che bloccherà le invocazioni dal cron del sistema operativo che di solito vengono eseguite utilizzando wget
Mark Kaplun,

Puoi indicarmi dove viene chiamato wget nel codice sorgente. La ricerca rapida non mi ha aiutato a trovarla rapidamente. Ho trovato riferimenti serverali da wget, ma solo nei plugin WordFence e BulletProof.
Jonnyjandles,

Wordpress non utilizza i croni del sistema operativo. Inoltre, usando la regola sopra, sono stato in grado di wget wp-cron.php usando sia wget localhost / wp-cron.php che wget 127.0.0.1/wp-cron.php . Tuttavia, quando si tenta di accedere dall'esterno I quanto segue in access_log "GET /wp-cron.php HTTP / 1.1" 302 (reindirizzamento). Perché ho anche un ErrorDocument 403 domain.com/index.php che instrada tutti gli accessi negati alla homepage.
Jonnyjandles,

cron è http richiesto dal core di wordpress. Tutti i tutorial disponibili in rete suggeriscono di utilizzare wget per attivare WP cron dal cron OS in sostituzione del trigger crin nativo di WP. Inoltre, il filtro per IP è sempre una strategia perdente, in questo caso è anche peggio, poiché quando sposti il ​​tuo sito o cron smetterà di funzionare e non saprai perché o quelle linee smetteranno di avere alcun effetto
Mark Kaplun,

Utilizzare 127.0.0.1 anziché IP pubblico del server, come ho indicato nella mia risposta.
jonnyjandles,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.