WordPress und die REST-API

Man lernt ja immer wieder dazu. Bis vor ein paar Tagen wusste ich nicht, dass das von mir genutzte CMS WordPress eine Schnittstelle besitzt, die sich REST-API nennt. Wobei „REST“ eine Abkürzung ist und für „Representational State Transfer“ steht. Es gibt auch einen Wikipedia-Artikel dazu. Der ist aber so technisch geschrieben, dass man ihn nicht versteht. Für was ist nun diese API gut?

Die Beschreibung der Kulturbanausen erklärt das wohl am besten:

Die REST-API von WordPress stellt die Inhalte einer Website über eine spezifische Adresse in strukturierter Form (JSON) öffentlich zur Verfügung. 

Kulturbanause

Das bedeutet man kann über einen Link so Dinge wie Artikel, Kategorien, Schlagworte, Seiten aber auch Benutzer auslesen. Was damit alles möglich ist erklärt die passende WordPress Referenz.

  • https://horstscheuer.de/wp-json/wp/v2/posts
  • https://horstscheuer.de/wp-json/wp/v2/categories
  • https://horstscheuer.de/wp-json/wp/v2/tags
  • https://horstscheuer.de/wp-json/wp/v2/pages
  • https://horstscheuer.de/wp-json/wp/v2/users

*Die Links funktionieren bei mir nicht. Ich habe die API deaktiviert.

Benutzer der Website

Ich war schon etwas erschrocken als ich das las. Da gibt es so Sachen wie Artikel oder Schlagworte, die mich nicht stören. Man kann aber wohl auch andere Inhalte auslesen. Und was wohl auch nicht ganz ohne ist alle Benutzer der Website. Das sieht bei mir so aus:

[{"id":1,"name":"Horst Scheuer","url":"","description":"","link":"https:\/\/horstscheuer.de\/author\/xyz\/","slug":"xyz","meta":[],"_links":{"self":[{"href":"https:\/\/horstscheuer.de\/wp-json\/wp\/v2\/users\/1"}],"collection":[{"href":"https:\/\/horstscheuer.de\/wp-json\/wp\/v2\/users"}]}}]

Okay, da gibt es (sieht man mal vom Link ab) nur die Dinge lesen, die man selbst im Backend eingegeben hat. Ich habe von mir im Footer der Seite und Impressum mehr veröffentlicht wie per REST-API auslesbar. Trotzdem ist diese Abfrage nicht ohne. In der Auflistung ist auf jeden Fall der Admin der Website mit seinem Benutzernamen dabei. Und das könnte zur Brute-Force-Attacke einladen.

Ich bin nicht der Einzige, der das so sieht. Zu dem Thema gibt’s ein Vulnerability, also eine Sicherheitslücke, mit der Bezeichnung CVE-2017-5487. Und auch Wordfence, die Macher von Sicherheitsplugins für WordPress, widmen sich ein einem etwas älteren Artikel diesem Thema.

Dies kann von Bots ausgenutzt werden, die Brute-Force-Angriffe zum Erraten von Passwörtern auf WordPress-Websites starten. Sie können diese API verwenden, um die Benutzernamen von jedem aufzulisten, der einen Beitrag auf einer WordPress-Site veröffentlicht hat. Die über diese API angezeigte Benutzerliste enthält fast immer einen Benutzer mit Zugriff auf Administratorebene.

Wordfence

*Übersetzt mit Hilfe Google Chrome

Snippet zum Deaktivieren der API

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;
  }
});

Man kann diese API deaktivieren. Einen Artikel dazu findet man bei den Kulturbanausen. Angesichts der Möglichkeiten, die diese API bietet und der Tatsache, dass ich für mich keinen Nutzen in der API sehe habe ich diese Funktion mit obigem Codeschnipsel deaktiviert.