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.

7 Kommentare Schreibe einen Kommentar

  1. Die User sind über diese API mit dem Namen auslesbar, der an der WordPress-Oberfläche sichtbar ist, z.B. als Autor von Artikeln. Also mit der „Autoren-Titelform“, wie das im Adminbereich genannt wird. Die ist unkritisch, weil rein oberflächlich.

    Wenn man allerdings denselben Namen als „Benutzernamen“ verwendet (also den, den man zum Login nutzt), hat man leider schon verloren, bevor man sich über die Sicherheit des eigenen Blogs Gedanken machen kann.

    Als Benutzernamen wählt man selbstverständlich einen möglichst überhaupt nicht erratbaren Namen, also etwas ähnlich Sicheres wie das zugehörige Passwort.

    Aber grundsätzlich ist es schon gut, jedweden Programmunfug abzuschalten, der irgendetwas hinterrücks auslösbar macht.

  2. @Boris: Du hast unrecht. Diese REST-API nennt, wenn man den User abfragt, auch den Link https:\/\/horstscheuer.eu\/author\/xyz\/. Wobei das „xyz“ der Benutzername ist (habe ich hier unkenntlich gemacht). Mit diesem Benutzernamen und dem Passwort meldet man sich im Dashboard an.

  3. Hmm… irgendwo wurmts, denn bei mir gibt diese REST-API für ‚users‘ z.B. für den Administrator Folgendes zurück:

    https://www.borisstumpf.de/author/der-administrator/

    Und ‚der-administrator‘ ist garantiert nicht der Benutzername zum Login, sondern bloß der Autor-Name in URL-Form, wenn ich mit diesem Benutzer Artikel schreiben würde. Also völlig harmlos.

    Möglicherweise liegt das daran, dass ich (seit gefühlt ewig) das Plugin „Edit Author Slug“ einsetze, das die Autoren-Titelform (z.B. aus dem Spitznamen oder dem öffentlichen Namen eines Benutzers, in meinem Fall „Der Administrator“) in eine passende URL-Form umsetzt („der-administrator“). Genau dazu hat jeder meiner User auch einen Spitznamen und einen Öffentlichen Namen.

    Jedenfalls kommen bei meinem Blog an wirklich keiner Stelle die tatsächlichen Benutzernamen ans Tageslicht, mit welchem Aufruf auch immer.

    Ich meine mich zu erinnern, dass diese Sicherheitslücke der auslesbaren Benutzernamen vor Jahren schon einmal thematisiert wurde, möglicherweise war „Edit Author Slug“ damals Teil der Lösung.

  4. @Boris: Da hast du wohl recht. Das liegt an deinem Plugin

  5. Kleine Korrektur, wenn auch technisch und nicht über-relevant für das, was du im Artikel ausdrücken möchtest:

    Mit dem Codeschnipsel hast die die REST API nicht vollständig deaktiviert, sondern das Nutzen der API auf eingeloggte User beschränkt. Ist wer eingeloggt, steht die API zur Verfügung.
    Das ist eine pfiffige Lösung, weil Bots die Daten weiterhin nicht einfach auslesen können, aber als eingeloggter User profitiert man von der API (insbesondere Gutenberg setzt auf die API).

    Nun muss man also nur dem unerwünschten Spam-Registrieren entgegenwirken und schon ist das mit viel Charme gelöst worden.

  6. @Phil: Ich hoffe es ist angekommen. Das Snippet habe ich bei den Kulturbanausen geklaut. Du schreibst Nun muss man also nur dem unerwünschten Spam-Registrieren entgegenwirken. Siehst du die Fragezeichen auf miner Stirn?

  7. Ich hoffe, ich kann dir die Fragezeichen nehmen ?

    Es gibt ja auch manche Blogs, wo automatisiert Registrierungen durchgeführt werden. Und wenn ein Bot sich am Blog registriert und dann sich (automatisiert) einloggen kann, dann kann dieser auch auf die API zugreifen.
    Ist für die Bots ein weiterer Winkelzug und wird vermutlich nicht besonders attraktiv sein – technisch möglich wäre es aber.

    Aber, ich habe gerade festgestellt, dass du deine wp-login.php mit htaccess geschützt hast, sodass ein Login/Registrieren ohne die zusätzlichen Zugangsdaten nicht möglich ist.
    Also kann sich nichts bei dir missbräuchlich registrieren und somit auch nicht missbräuchlich Daten auslesen.

    Problem gelöst, ehe es ein Problem gab 😉

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.