wp-cron.php是否存在已知漏洞?


9

我正在使用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的已知漏洞(漏洞)?
有没有一种方法可以“保护”文件?

谢谢!

Answers:


4

在这里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() 发送您在日志中看到的POST请求:

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

在这里,您还可以看到浮点数来自何处:它作为参数传递,以标识瞬态。

没有什么可担心的。


-1

如果要保护文件,则可以通过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。这将使用环回网络控制器,并且您的请求将不会转发到公共Internet并返回。


1
通常会使用wget来阻止OS cron的调用
Mark Kaplun

您能否指出我在源代码中调用wget的位置。我快速搜索并没有帮助我快速找到它。我找到了wget的服务器参考,但仅在WordFence和BulletProof插件中。
jonnyjandles

Wordpress不使用OS Cron。另外,使用上述规则,我能够使用wget localhost / wp-cron.php和wget 127.0.0.1/wp-cron.php来wget wp-cron.php 。但是,当尝试从外部访问时,access_log中的以下内容“ GET /wp-cron.php HTTP / 1.1” 302(重定向)。因为我还有一个ErrorDocument 403 domain.com/index.php,它将所有拒绝访问的路由都路由到主页。
jonnyjandles

cron是从wordpress核心请求的http。网络上所有可用的教程都建议您使用wget从OS cron触发WP cron,以替代WP本机crin触发。此外,在这种情况下,通过IP进行过滤始终是一种失败的策略,因为当您移动网站时,cron将停止工作,并且您将不知道为什么或这些行将停止产生任何效果
Mark Kaplun

然后使用127.0.0.1代替我在答案中提到的服务器公共IP。
jonnyjandles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.