Existe uma vulnerabilidade conhecida para wp-cron.php?


9

Estou usando o WordPress v.4.1 e todos os plugins e o tema estão atualizados.

Vejo nos meus arquivos de log muitos desses ...

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"

onde xxx.xxx.xxx.xxx é o endereço IP do servidor em que o site está hospedado e " http://www.example.com " é o meu site.

Existe uma vulnerabilidade conhecida (exploração) que afeta o wp-cron.php?
Existe uma maneira de "proteger" o arquivo?

Obrigado!

Respostas:


4

Em wp-includes/default-filters.phppodemos encontrar um registro de retorno de chamada:

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

Se formos a função wp_cron()agora, vemos o seguinte:

$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() envia a solicitação POST que você está vendo em seus logs:

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

Aqui você também pode ver de onde vem o número flutuante: Ele é passado como argumento para identificar o transitório.

Nada para se preocupar.


-1

Se você deseja proteger o arquivo, pode restringir o acesso ao arquivo através do seu httpd.conf (arquivo de configuração global do Apache).

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

Substitua o IP no exemplo pelo IP do seu servidor. Isso ainda lhe dará acesso ao arquivo do servidor usando um comando como:

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

E retornará um 403 (acesso negado a solicitações de qualquer outro IP). Se você usar uma regra adicional como a abaixo, redirecionará solicitações externas de 403 Forbiddenpara outra página (como a página inicial) que não é realmente necessária.

ErrorDocument 403 https://www.domain.ca

Mesmo melhor, você pode usar Require ip 127.0.0.1com o exemplo acima e usar o pedido wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Isso usará o controlador de rede de loopback e sua solicitação não será encaminhada para a Internet pública e vice-versa.


1
que irá bloquear invocações do cron OS que se realiza utilizando wget
Mark Kaplun

Você pode me indicar onde o wget é chamado no código-fonte. A pesquisa rápida não me ajudou a encontrá-la rapidamente. Encontrei referências de servidor para o wget, mas apenas nos plugins WordFence e BulletProof.
22619 jonnyjandles # 0636

Wordpress não usa crons de SO. Além disso, usando a regra acima, consegui wget-cron.php usando o wget localhost / wp-cron.php e o wget 127.0.0.1/wp-cron.php . No entanto, ao tentar acessar de fora, faça o seguinte em access_log "GET /wp-cron.php HTTP / 1.1" 302 (redirecionamento). Porque também tenho um ErrorDocument 403 domain.com/index.php que direciona todo o acesso negado à página inicial.
22619 jonnyjandles

cron é http solicitado do núcleo wordpress. Todos os tutoriais disponíveis na rede sugerem que você use o wget para acionar o cron do WP a partir do cron do sistema operacional como uma substituição do acionamento nativo do WP. Além filtragem por IP whih é lways uma estratégia perdedora é ainda pior neste caso, como quando você mover seu site, quer cron irá parar de funcionar e você não sabe por que ou essas linhas vai parar de ter qualquer efeito
Mark Kaplun

Use 127.0.0.1 em vez do IP público do servidor, como mencionei na minha resposta.
jonnyjandles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.