WordPress-Schwachstellen

Die WordPress-REST-API: was öffentlich ist und wie du sie einschränkst

Illustration zur Sicherheit der WordPress-REST-API mit dem Schild von WP Masquerade.

Die REST-API ist der unauffällige Motor des modernen WordPress: Der Block-Editor, mobile Apps und zahlreiche Plugins hängen von ihr ab. Ein Teil dieser API antwortet aber jedem, ohne Authentifizierung, und kann die Liste deiner Konten preisgeben. Dieser Artikel erklärt, was standardmäßig öffentlich ist, was problematisch ist und wie du die API einschränkst, ohne den Editor kaputt zu machen.

Wozu die REST-API dient

Seit WordPress 4.7 ist die REST-API in den Core integriert und stellt die Inhalte der Website als strukturierte Daten bereit, erreichbar unter Adressen, die mit /wp-json/ beginnen. Mit ihr kann ein Programm Beiträge, Seiten, Kategorien oder Kommentare lesen oder schreiben, ohne die klassische Oberfläche zu nutzen. Der Block-Editor nutzt sie ständig: Jedes Speichern eines Entwurfs ist eine Anfrage an die API.

Diese Architektur ist eine Stärke. Das Problem ist nicht die API an sich, sondern dass einige ihrer Routen konstruktionsbedingt anonymen Besuchern antworten, damit öffentliche Inhalte abrufbar bleiben.

Ein Einstieg in die WordPress-REST-API, um ihre Funktionsweise zu verstehen.

Was standardmäßig öffentlich ist

Mehrere Routen liefern Daten ohne Authentifizierung. Die meisten sind harmlos: Sie zeigen, was auf der Website ohnehin sichtbar ist.

RouteZurückgegebener InhaltSensibilität
/wp-json/wp/v2/postsVeröffentlichte BeiträgeGering (bereits öffentlich)
/wp-json/wp/v2/pagesVeröffentlichte SeitenGering
/wp-json/wp/v2/categoriesKategorien und SchlagwörterGering
/wp-json/wp/v2/commentsFreigegebene KommentareGering bis mittel
/wp-json/wp/v2/usersAutoren mit mindestens einem veröffentlichten BeitragHoch (Aufzählung)
Die wichtigsten öffentlichen Routen der REST-API und ihre Sensibilität.

Die sensible Route ist die letzte. Standardmäßig liefert /wp-json/wp/v2/users ganz ohne Authentifizierung die Liste der Benutzer, die mindestens einen Beitrag in einem öffentlichen Inhaltstyp veröffentlicht haben. Für jeden enthält die Antwort die numerische ID, den angezeigten Namen und vor allem den slug, der vom Anmeldenamen abgeleitet ist.

Schema eines anonymen Bots, der /wp-json/wp/v2/users abfragt und eine Liste von Autoren erhält, deren Slug den Anmeldenamen verrät.
Ohne Authentifizierung verrät die Benutzer-Route die Anmeldenamen der Autoren.

Warum die Aufzählung von Konten zählt

Die Anmeldenamen zu kennen, verschafft noch keinen Zugang, ist aber die erste Hälfte der Arbeit eines Angreifers. Mit der Liste echter Benutzernamen wird ein Brute-Force- oder Credential-Stuffing-Angriff deutlich wirksamer: Es fehlt nur noch das Passwort. Die Kontonamen frei Haus zu liefern, heißt anzuzeigen, an welchem Schloss man ansetzen soll.

Die Aufzählung läuft nicht nur über die REST-API. Die alten Pfade /?author=1, die Autoren-Sitemap und die oEmbed-Einbettung können diese Namen ebenfalls verraten. Ein schlüssiger Schutz behandelt sie gemeinsam, sonst bringt es nichts, eine Tür zu schließen und die anderen offen zu lassen.

Einschränken, ohne den Editor kaputt zu machen

Der klassische Fehler besteht darin, die REST-API mit einem radikalen Plugin vollständig abzuschalten. Ergebnis: Der Block-Editor kann nicht mehr speichern, manche Verwaltungsfunktionen fallen aus, und legitime Plugins funktionieren nicht mehr. Das Ziel ist nicht, alles zu schließen, sondern das zu schließen, was geschlossen werden muss.

  • Lass die API für authentifizierte Benutzer aktiv. Der Editor arbeitet mit einem Sicherheitstoken (Nonce), das belegt, dass die Anfrage aus einer angemeldeten Sitzung kommt. Rühre diesen Mechanismus nicht an.
  • Schränke die Benutzer-Route für anonyme Besucher ein. Technisch heißt das, auf /wp/v2/users die Berechtigung list_users zu verlangen, sodass ein nicht angemeldeter Besucher eine leere Antwort oder einen Fehler erhält, während ein Administrator den Zugriff behält.
  • Schließe auch die anderen Wege der Aufzählung: die Autorenarchive /?author=, die Autoren-Sitemap und die oEmbed-Ankündigung.
  • Teste nach jeder Änderung: Speichern eines Entwurfs, Einfügen eines Mediums, Vorschau, dann die Plugins, die du tatsächlich nutzt.

Achte auf ein Detail: Die Ankündigung zur Erkennung der API zu entfernen (den Link <link rel="https://api.w.org/"> im Kopfbereich der Seiten), deaktiviert die API nicht. Es verringert nur die Hinweise für automatisierte Werkzeuge. Um eine Route wirklich zu blockieren, musst du ihre Berechtigung ändern, nicht ihre Ankündigung.

Den Zustand deiner Website prüfen

Der Test ist einfach und braucht kein Werkzeug. Öffne in einem privaten Browserfenster, also ohne angemeldet zu sein, die Adresse /wp-json/wp/v2/users deiner Website. Siehst du eine Liste von Benutzern mit ihrem slug, ist die Route offen. Erhältst du eine leere Antwort oder einen Berechtigungsfehler, ist sie für Anonyme geschlossen. Mach dasselbe mit /?author=1, um zu prüfen, dass es nicht auf ein Archiv mit dem Anmeldenamen weiterleitet.

Wie WP Masquerade diese Routen behandelt

WP Masquerade Pro behandelt die Aufzählung als zusammenhängendes Ganzes. Sein Modul Härtung blockiert für anonyme Besucher die Autorenarchive und die öffentlichen Anfragen an /wp/v2/users, während die übrigen REST-Routen und authentifizierte Benutzer verfügbar bleiben. Der Block-Editor funktioniert also weiter. Parallel dazu entfernt das Modul technische Links die Erkennungsankündigungen für REST-API und oEmbed, die Scannern als Hinweise dienen.

Die Anleitung des Plugins ist ehrlich, was die Reichweite der Maßnahme angeht: Die Benutzer-Route zu blockieren, verringert bestimmte Wege der Aufzählung, verbirgt aber keinen Namen, der bereits anderswo veröffentlicht ist, zum Beispiel in der Autorenzeile eines Beitrags. Es ist eine Verkleinerung der Angriffsfläche, kein Verschwinden. In Kombination mit starken Passwörtern und der Begrenzung der Anmeldeversuche macht sie die Arbeit des Angreifers einfach länger und auffälliger.

Legitime Nutzungen, die du nicht kaputt machen darfst

Bevor du einschränkst, musst du wissen, wer auf deiner Website auf die REST-API angewiesen ist, sonst schaltest du eine nützliche Funktion ab. Mehrere völlig legitime Nutzungen laufen über sie.

  • Der Block-Editor, der Inhalte fortlaufend speichert, abruft und formatiert.
  • Mobile Apps, offizielle oder von Drittanbietern, die auf der Website veröffentlichen.
  • Headless-Integrationen, bei denen ein separates Frontend die Inhalte über die API bezieht.
  • Manche Plugins (Formulare, Shops, Buchungen), die eigene Routen bereitstellen.

Die goldene Regel lautet daher: fein abgestuft einschränken, Route für Route, statt alles zu blockieren. Ein Plugin, das verspricht, „die REST-API zu deaktivieren“, ohne zu unterscheiden, ist eine schlechte Wahl: Es löst ein Aufzählungsproblem, indem es mehrere andere schafft, die manchmal unsichtbar bleiben, bis sich ein Kunde beschwert, dass ein Formular nicht mehr funktioniert.

Anwendungspasswörter, die richtige Tür für Automatisierung

Muss ein externer Dienst über die API auf deiner Website schreiben, vertraue ihm nicht das Passwort eines Administrators an. WordPress bietet seit Version 5.6 Anwendungspasswörter: eigene, einzeln widerrufbare Zugangsdaten zur Authentifizierung von API-Anfragen, ohne das Hauptpasswort preiszugeben. Jede Integration erhält ihr eigenes, und an dem Tag, an dem ein Dienst nicht mehr genutzt wird, widerrufst du seinen Zugang, ohne den Rest anzurühren.

Dieser Ansatz begrenzt den Schaden bei einem Leck: Ein kompromittiertes Anwendungspasswort lässt sich mit einem Klick widerrufen, und sein Wirkungsbereich bleibt auf einen einzigen Dienst beschränkt. Es ist auch der Mechanismus, mit dem ein durch Zwei-Faktor-Authentifizierung geschütztes Konto weiter mit der API und XML-RPC kommuniziert, da diese Kanäle das klassische Passwort nicht mehr akzeptieren, sobald der zweite Faktor aktiviert ist.

Lies auch: MCP in WordPress: was das Model Context Protocol ändert und wie du es nutzt.

Das Wichtigste in Kürze

  • Die REST-API ist für bereits sichtbare Inhalte konstruktionsbedingt öffentlich; der heikle Punkt ist die Route /wp/v2/users.
  • Diese Route liefert anonymen Besuchern die Anmeldenamen der Autoren.
  • Schalte die API nicht komplett ab: Der Block-Editor braucht sie. Schränke nur die sensiblen Routen ein.
  • Schließe auch /?author=, die Autoren-Sitemap und oEmbed für einen schlüssigen Schutz.

Quellen

Weitere herangezogene Quellen: offizielle Dokumentation.

WordPress-Schwachstellen5 Min.

So verhinderst du die Benutzeraufzählung in WordPress

Ein Bot muss deine Benutzernamen nicht erraten: WordPress veröffentlicht standardmäßig gleich mehrere. Die fünf Quellen des Lecks, wie du deine Website testest und Gegenmaßnahmen, die nichts…

WordPress-Sicherheit ohne Lärm

Eine E-Mail, wenn es wichtig ist: neu beobachtete Angriffe, Updates des Plugins und praktische Anleitungen. Kein Spam, Abmeldung mit einem Klick.

Starte kostenlos und wechsle zu Pro, wenn du so weit bist

Die kostenlose Version versteckt WordPress bereits und verschiebt die Anmeldeseite. Pro ergänzt Aliasse, Zwei-Faktor-Authentifizierung und Überwachung.