Gibt es eine bekannte Sicherheitslücke für wp-cron.php?

9

Ich benutze WordPress v.4.1 und alle Plugins und das Theme sind aktuell.

Ich sehe in meinen Protokolldateien zu viele davon ...

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"

Dabei ist xxx.xxx.xxx.xxx die IP-Adresse des Servers, auf dem die Website gehostet wird, und " http://www.example.com " meine Website.

Gibt es eine bekannte Sicherheitslücke (Exploit), die wp-cron.php betrifft?
Gibt es eine Möglichkeit, die Datei zu "schützen"?

Vielen Dank!

Kananen
quelle

Antworten:

4

In finden wp-includes/default-filters.phpwir eine Rückrufregistrierung:

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

Wenn wir jetzt die Funktion wp_cron()ausführen, sehen wir Folgendes:

$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() sendet die POST-Anfrage, die Sie in Ihren Protokollen sehen:

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

Hier können Sie auch sehen, woher die Float-Nummer kommt: Sie wird als Argument zur Identifizierung des Transienten übergeben.

Nichts, über das man sich sorgen sollte.

Fuxia
quelle
-1

Wenn Sie die Datei schützen möchten, können Sie den Zugriff auf die Datei über Ihre httpd.conf (globale Apache-Konfigurationsdatei) einschränken.

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

Ersetzen Sie die IP im Beispiel durch Ihre Server-IP. Auf diese Weise können Sie vom Server aus mit einem Befehl wie dem folgenden auf die Datei zugreifen:

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

Und es wird ein 403 zurückgegeben (Zugriff auf Anforderungen von einer anderen IP verweigert). Wenn Sie eine zusätzliche Regel wie die folgende verwenden, leiten Sie externe Anforderungen von 403 Forbiddeneiner anderen Seite (z. B. der Startseite) weiter, was nicht wirklich erforderlich ist.

ErrorDocument 403 https://www.domain.ca

Noch besser ist es, wenn Sie Require ip 127.0.0.1das obige Beispiel verwenden und die wget-Anfrage verwenden : wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Dadurch wird der Loopback-Netzwerkcontroller verwendet und Ihre Anfrage wird nicht an das öffentliche Internet und zurück weitergeleitet.

jonnyjandles
quelle
1
das wird Aufrufe vom OS-Cron blockieren, die normalerweise mit wget ausgeführt werden
Mark Kaplun
Können Sie mir zeigen, wo wget im Quellcode aufgerufen wird? Die schnelle Suche hat mir nicht geholfen, sie schnell zu finden. Ich habe mehrere Refs zum Wget gefunden, aber nur in WordFence- und BulletProof-Plugins.
Jonnyjandles
Wordpress verwendet keine Betriebssystem-Crones. Mit der obigen Regel konnte ich auch wp-cron.php mit wget localhost / wp-cron.php und wget 127.0.0.1/wp-cron.php wget . Wenn Sie jedoch versuchen, von außen darauf zuzugreifen, gehen Sie in access_log "GET /wp-cron.php HTTP / 1.1" 302 wie folgt vor (Umleitung). Weil ich auch ein ErrorDocument 403 domain.com/index.php habe, das alle verweigerten Zugriffe auf die Homepage weiterleitet .
Jonnyjandles
cron wird vom WordPress-Kern http angefordert. Alle im Internet verfügbaren Tutorials schlagen vor, dass Sie wget verwenden, um WP cron vom OS cron als Ersatz für das native Auslösen von WP crin auszulösen. Darüber hinaus ist das Filtern nach IP, was immer eine Verluststrategie ist, in diesem Fall noch schlimmer, da beim Verschieben Ihrer Site entweder cron nicht mehr funktioniert und Sie nicht wissen, warum oder diese Zeilen keine Wirkung mehr haben
Mark Kaplun
Verwenden Sie 127.0.0.1 anstelle der öffentlichen Server-IP, wie ich damals in meiner Antwort erwähnt habe.
Jonnyjandles