Du bist hier: Startseite » Blog » WordPress REST API: Deaktiviere diese Sicherheitslücke!

WordPress REST API: Deaktiviere diese Sicherheitslücke!

6 Kommentare
WordPress REST-API Sicherheitslücke deaktivieren

Die WordPress REST API ist eine wunderbare Sache und wird für viele WordPress-Funktionen benötigt. Allerdings ist sie auch eine Sicherheitslücke, denn potenzielle Angreifer können so wichtige Daten auslesen. Hier erfährst Du, wie Du dieses Sicherheitsproblem schliessen kannst.

Die REST-API bietet viele Möglichkeiten Inhalte auszulesen und diese können dann an externe Apps oder Websites übergeben werden. Dazu stellt die API strukturierte Daten (JSON) öffentlich zur Verfügung. Dazu gehören jedoch auch Daten, die man nicht gern für jedermann öffentlich abrufbar sehen möchte.

Das Problem: mit der WordPress REST API lassen sich Usernamen anzeigen

Mit einem einfachen Kniff können die Benutzernamen der User-Accounts von WordPress ausgelesen werden. Das stellt ein ernsthaftes Sicherheitsproblem dar, denn so benötigen eventuelle Angreifer nur noch das User-Passwort für einen Hack der betreffenden Website. Gibt man folgendes in den Browser folgendes ein, erhält man die Datei mit den Usernamen:

https://www.deine-website.de/wp-json/wp/v2/users

So sehen dann die Daten aus, die daraufhin im Browser erscheinen: (nur etwas hübscher formatiert)

WordPress REST-API Sicherheitslücke deaktivieren - Die Ausgabe der Benutzernamen im JSON-Format
Die Ausgabe der Benutzernamen im JSON-Format

Hier sieht man unter »Slug« den Benutzernamen mit vielen weiteren Informationen. Da der Benutzername nun bekannt ist, kann ein Angreifer eine Brute-Force Attacke gegen den Adminbereich starten, um so das User-Passwort zu erhalten und in die Website eindringen zu können. Mit anderen Abfragen wiederum können die Inhalte von Seiten und Beiträgen ausgelesen werden. Das eignet sich dann perfekt für den Content-Diebstahl.

Weitere Informationen zum Thema

WordPress REST API Referenz

WordPress REST API ganz abschalten? Besser nicht!

Man könnte nun auf die Idee kommen, die WordPress REST-API ganz abzuschalten. Das sollte man jedoch auf keinen Fall tun, da viele WordPress-Funktionen ansonsten nicht mehr möglich sind.

Der Gutenberg-Editor (auch Block-Editor genannt) ist von der REST-API Schnittstelle abhängig und würde ohne sie nicht mehr funktionieren. Ebenfalls nutzen auch etliche Plugins diese Funktionalitäten der API. Daher ist es definitiv keine gute Idee, diese API komplett abzuschalten.

So geht es richtig: REST-API für externe Besucher deaktivieren

Wichtig ist, dass die Plugins und der Gutenberg-Editor die Funktionen aufrufen können, die sie benötigen. Daher sollte die API nur für externe Besucher deaktiviert werden. Im eingeloggten Zustand funktioniert dann alles wie gewohnt. Das folgende Snippet muss in die functions.php des aktiven (Child-) Themes. Wie Du ein Child-Theme erstellst kannst Du hier nachlesen.

Mit diesem Code Snippet schaltest Du die Schnittstelle für externe Besucher ab:

<?php
/* Ab hier kopieren */
/**
 * REST-API fuer extere User abschalten
 */
add_filter('rest_authentication_errors', function($result) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_API_cannot_access', array( 'status' => rest_authorization_required_code() ) );
}
return $result;
});

Statt alles zu deaktivieren: Schalte einzelne Endpoints ab [Update 18.11.2022]

Alle Inhalte einer WordPress-Installation werden für die WordPress REST-API verfügbar gemacht. Das ist der Standard. Wie bereits oben erwähnt lassen sich damit auch die Inhalte der Beiträge, Seiten und die Kommentare auslesen. Dazu kommen noch die Website-Einstellungen und so weiter...

Mittels WordPress-Filter können wir jedoch genau bestimmen, was von außen abgerufen werden kann. Hier nutzen wir den Filter rest_endpoints. Alles Wissenswerte dazu liest Du in der WordPress REST API Referenz.

Wir deaktivieren die API-Endpunkte für:

  • Benutzernamen
  • Einstellungen
  • Seiteninhalte
  • Beitragsinhalte

All diese Endpunkte werden nur für externe User deaktiviert. Im eingeloggten Zustand ist die Rest-API komplett aktiv.

Danach sind die Informationen nicht mehr in der API zu finden. Hier der Code dafür:

<?php

/* Ab hier kopieren */

/**
 * REST-API Filter entfernt wichtige Informationen fuer den Zugriff von Aussen
 * @link https://developer.wordpress.org/rest-api/reference/ REST-API Referenz
 */
add_filter('rest_endpoints', function ($endpoints) {
    
    if ( ! is_user_logged_in() ) {
  
    $endpoints_to_remove = array(
    'users', /* Entfernt die User aus den Daten */
    'settings', /* Entfernt die Website-Einstellungen aus den Daten */
    'posts', /* Entfernt die Beitragsinhalte aus den Daten */
    'pages' /* Entfernt die Seiteninhalte aus den Daten */  
  );

  foreach ($endpoints_to_remove as $endpoint) {
    $base_endpoint = "/wp/v2/{$endpoint}";
    foreach ($endpoints as $maybe_endpoint => $object) {
      if (strpos($maybe_endpoint, $base_endpoint) !== false) {
        unset($endpoints[$maybe_endpoint]);
      }
    }
  }

  return $endpoints;
}    
});

WordPress REST API Sicherheitslücke deaktivieren: Plugin Download

Du kannst allerdings auch mein kleines Plugin installieren, was ich Dir erstellt habe. Es beinhaltet nur den Code, der die Informationen zu den Einstellungen, den Benutzernamen und den Inhalten der Seiten und Beiträge herausfiltert und macht Deine Website also nicht langsamer.

Das Plugin wurde auf die Version 1.0.2 aktualisiert und filtert die Endpoints nur für externe User aus. Somit sollten alle Probleme behoben sein.
Kategorie: WordPress Snippets

Gründer und Inhaber

Andreas ist der Gründer und Inhaber der SEO Agentur Hamburg. Er hat mehr als 13 Jahre Erfahrung mit WordPress-Entwicklung und über 11 Jahre Erfahrung mit erfolgreicher Suchmaschinenoptimierung. Er hat Hunderte Artikel über WordPress und SEO für die Online-Magazine DrWeb.de und Noupe.com geschrieben.

Deine Wettbewerber sind bei Google vor Dir positioniert und Du weißt nicht, warum?

Diese Beiträge könnten Dich auch interessieren