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はWebサイトがホストされているサーバーのIPアドレスであり、 " http://www.example.com "は私のWebサイトです。

wp-cron.phpに影響する既知の脆弱性(エクスプロイト)はありますか?
ファイルを「保護」する方法はありますか?

ありがとうございました!

回答:


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。これはループバックネットワークコントローラーを使用し、リクエストは公共のインターネットに転送されたり戻ったりすることはありません。


1
通常はwgetを使用して行われるOS cronからの呼び出しをブロックします
Mark Kaplun

ソースコードでwgetが呼び出されている場所を教えていただけますか。クイック検索では、すぐに見つけることができませんでした。wgetへのサーバー参照を見つけましたが、WordFenceプラグインとBulletProofプラグインにのみあります。
jonnyjandles '06 / 06/18

WordpressはOSのcronを使用しません。また、上記のルールを使用して、wget localhost / wp-cron.phpとwget 127.0.0.1/wp-cron.phpの両方を使用してwp-cron.phpをwgetすることができました。ただし、外部からアクセスしようとすると、access_log "GET /wp-cron.php HTTP / 1.1" 302(リダイレクト)に次のようになります。なぜなら、拒否されたすべてのアクセスをホームページにルーティングするErrorDocument 403 domain.com/index.phpもあるからです。
jonnyjandles '06 / 06/18

cronは、ワードプレスコアからhttp要求されます。ネットで入手できるすべてのチュートリアルでは、WPネイティブクリントリガーの代わりに、wgetを使用してOS cronからWP cronをトリガーすることを推奨しています。また、あなたのサイトを移動する際にcronは動作を停止します、あなたはなぜか、それらの行はどんな効果を持つ停止します知ることができませんどちらかと負け戦略は、この場合にはさらに悪くなるlwaysあるwhih IPによるフィルタリング
マーク・Kaplun

私の回答で述べたように、サーバーのパブリックIPではなく127.0.0.1を使用します。
jonnyjandles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.