Existe-t-il une vulnérabilité connue pour wp-cron.php?


9

J'utilise WordPress v.4.1 et tous les plugins et le thème sont à jour.

J'en vois trop dans mes fichiers journaux ...

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"

xxx.xxx.xxx.xxx est l'adresse IP du serveur sur lequel le site Web est hébergé et " http://www.example.com " est mon site Web.

Existe-t-il une vulnérabilité (exploit) connue affectant wp-cron.php?
Existe-t-il un moyen de "protéger" le fichier?

Je vous remercie!

Réponses:


4

Dans wp-includes/default-filters.phpnous pouvons trouver un enregistrement de rappel:

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

Si nous allons wp_cron()maintenant à la fonction , nous voyons ceci:

$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() envoie la requête POST que vous voyez dans vos journaux:

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

Ici, vous pouvez également voir d'où vient le nombre flottant: Il est passé comme argument pour identifier le transitoire.

Rien à craindre.


-1

Si vous souhaitez protéger le fichier, vous pouvez restreindre l'accès au fichier via votre httpd.conf (fichier de configuration global Apache).

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

Remplacez l'IP dans l'exemple par l'IP de votre serveur. Cela vous donnera toujours accès au fichier depuis le serveur en utilisant une commande comme:

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

Et il renverra un 403 (accès refusé aux demandes de toute autre IP). Si vous utilisez une règle supplémentaire telle que ci-dessous, vous redirigerez les demandes externes 403 Forbiddenvers une autre page (comme la page d'accueil) qui n'est pas vraiment nécessaire.

ErrorDocument 403 https://www.domain.ca

Mieux encore, vous pouvez utiliser Require ip 127.0.0.1l'exemple ci - dessus et utiliser la demande wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Cela utilisera le contrôleur de réseau de bouclage et votre demande ne sera pas transmise à Internet public et inversement.


1
qui bloquera les invocations du cron du système d'exploitation qui sont généralement effectuées à l'aide de wget
Mark Kaplun

Pouvez-vous m'indiquer où wget est appelé dans le code source. Ma recherche rapide ne m'a pas aidé à le trouver rapidement. J'ai trouvé des références serveur sur wget, mais uniquement dans les plugins WordFence et BulletProof.
jonnyjandles

Wordpress n'utilise pas de crons de système d'exploitation. De plus, en utilisant la règle ci-dessus, j'ai pu wget wp-cron.php en utilisant à la fois wget localhost / wp-cron.php et wget 127.0.0.1/wp-cron.php . Cependant, lorsque j'essaie d'accéder de l'extérieur, je lis ce qui suit dans access_log "GET /wp-cron.php HTTP / 1.1" 302 (redirection). Parce que j'ai aussi un domaine ErrorDocument 403 domain.com/index.php qui achemine tout accès refusé à la page d'accueil.
jonnyjandles

cron est http demandé au noyau wordpress. Tous les tutoriels disponibles sur le net suggèrent que vous utilisiez wget pour déclencher WP cron à partir du système d'exploitation cron en remplacement du déclenchement natif WP crin. De plus, le filtrage par IP qui est toujours une stratégie de perte est encore pire dans ce cas car lorsque vous déplacez votre site, soit cron cessera de fonctionner et vous ne saurez pas pourquoi, soit ces lignes cesseront d'avoir un effet
Mark Kaplun

Utilisez 127.0.0.1 au lieu de l'adresse IP publique du serveur comme je l'ai mentionné dans ma réponse.
jonnyjandles
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.