Существует ли известная уязвимость для wp-cron.php?
Я использую WordPress v.4.1, и все плагины и тема обновлены.
Я вижу в своих файлах журналов слишком много таких...
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 - это IP-адрес сервера, на котором размещен веб-сайт, и "http://www.example.com " - это мой веб-сайт.
Существует ли известная уязвимость (эксплойт), влияющая wp-cron.php ?
Есть ли способ "защитить" файл?
Спасибо вам!
2 answers
В wp-includes/default-filters.php
мы можем найти регистрацию обратного вызова:
// WP Cron
if ( !defined( 'DOING_CRON' ) )
add_action( 'init', 'wp_cron' );
Если мы сейчас перейдем к функции wp_cron()
, мы увидим следующее:
$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()
отправляет запрос на публикацию, который вы видите в своих журналах:
$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'] );
Здесь вы также можете увидеть, откуда берется число с плавающей точкой: оно передается в качестве аргумента для идентификации переходного процесса.
Не о чем беспокоиться.
Если вы хотите защитить файл, вы можете ограничить доступ к файлу с помощью httpd.conf (глобальный конфигурационный файл Apache).
# Wordpress wp-cron.php file
<Files "wp-cron.php">
Require ip 1.2.3.4
</Files>
Замените IP-адрес в примере на IP-адрес вашего сервера. Это все равно даст вам доступ к файлу с сервера с помощью команды, например:
wget -q -O - domain.com/wp-cron.php?doing_wp_cron
И он вернет 403 (доступ запрещен для запросов с любого другого IP-адреса). Если вы используете дополнительное правило, например, приведенное ниже, вы перенаправите внешние запросы с 403 Forbidden
на другую страницу (например, домашнюю страницу). в чем на самом деле нет необходимости.
ErrorDocument 403 https://www.domain.ca
Еще лучше, вы можете использовать Require ip 127.0.0.1
в приведенном выше примере и использовать запрос wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron
. При этом будет использоваться сетевой контроллер обратной связи, и ваш запрос не будет перенаправлен в общедоступный Интернет и обратно.