Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
setup-wordpress-with-security-best-practice — Umfassender Leitfaden zur Härtung von WordPress-Installationen: deckt Änderungen am Admin-Benutzer, HTTPS-Erzwingung, Plugin-Sicherheit, Dateiberechtigungen und Serverkonfiguration für statische Unternehmensseiten ab. | Kitploit
Tools/GitHubGitHub/password123456/setup-wordpress-with-security-best-practice
KonfigurationsprüfungWebsicherheitLernen & Bildung
GitHubpassword123456/setup-wordpress-with-security-best-practice

setup-wordpress-with-security-best-practice

Umfassender Leitfaden zur Härtung von WordPress-Installationen: deckt Änderungen am Admin-Benutzer, HTTPS-Erzwingung, Plugin-Sicherheit, Dateiberechtigungen und Serverkonfiguration für statische Unternehmensseiten ab.

Repository anzeigen

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
294vor 2 JahrenVon Kitploit geprüft

Setup WordPress mit bewährten Sicherheitspraktiken

Hits

Dieses Dokument wurde mit dem Ziel verfasst, für Webanwendungen geeignet zu sein, die mit WordPress entwickelt wurden und nicht mit Benutzern interagieren. Es richtet sich hauptsächlich an Unternehmens-Webseiten, verschiedene statische Ansichten, Stellenanzeigenseiten und ähnliche Websites.

Für Websites, auf denen sich Benutzer registrieren und die Website frei nutzen, wie offene Communities, sind einige Punkte in diesem Dokument möglicherweise nicht anwendbar. Bitte beachten Sie dies beim Lesen.

Dieses Dokument enthält nicht alle Inhalte, die für die Sicherung von WordPress erforderlich sind.

Es enthält jedoch allgemeine und detaillierte Informationen auf einem Niveau, das Sicherheitsrisikobewertungen und Schwachstellenreaktionen basierend auf der Anleitung ermöglicht.

Wenn Sie dies hilfreich finden, geben Sie bitte einen "Stern"🌟, um weitere Verbesserungen zu unterstützen.


Inhaltsverzeichnis

  • 1. Sicherstellen, dass der Standard-WordPress-Admin-Benutzername geändert wurde
  • 2. Sicherstellen, dass Benutzerrollen und -berechtigungen in WordPress ordnungsgemäß verwaltet werden
  • 3. Sicherstellen, dass die Benutzerregistrierung deaktiviert ist
  • 4. Sicherstellen, dass der Plugin-Datei-Editor deaktiviert ist
  • 5. Sicherstellen, dass ungenutzte, unnötige Plugins deaktiviert sind
  • 6. Sicherstellen, dass WordPress so konfiguriert ist, dass nur HTTPS verwendet wird, einschließlich des WordPress-Adminbereichs
  • 7. Sicherstellen, dass IP-Zugriffsbeschränkungen (ACL) angewendet werden
    • 7.1. Sicherstellen, dass IP-Zugriffsbeschränkungen auf den WordPress-Adminbereich angewendet werden
    • 7.2. IP-Zugriff einschränken oder JSON-REST-API-Funktion deaktivieren
    • 7.3. XML-RPC-API-Funktion deaktivieren
    • 7.4. WP-Cron deaktivieren oder die Funktion einschränken
  • 8. Systemkonfiguration für sicheres WordPress
    • 8.1. Sicherstellen, dass nicht das Ende der Lebensdauer (EOL) von WordPress- und PHP-Versionen verwendet wird
    • 8.2. Sicherstellen, dass nur notwendige PHP-Erweiterungen für WordPress aktiviert sind
    • 8.3. Sicherheit von Plugins mit Datei-Upload-Funktionen gewährleisten
    • 8.4. Sicherstellen, dass PHP-Funktionen und -Einstellungen ordnungsgemäß konfiguriert sind
    • 8.5. Sicherstellen, dass der Webserver als Nicht-Root-Benutzer läuft – eigener, nicht privilegierter Benutzer und Gruppe für die Serveranwendung
    • 8.6. Sicherstellen, dass PHP-FPM als Nicht-Root-Benutzer läuft – eigener, nicht privilegierter Benutzer und Gruppe für die Serveranwendung
    • 8.7. Sicherstellen einer sicheren Konfiguration des WordPress-Heimatverzeichnisses
    • 8.8. Sicherstellen, dass die PHP-Ausführung in beschreibbaren Verzeichnissen deaktiviert ist
    • 8.9. Sicherstellen, dass der Webserver nur auf domänenbasierte Host-Header antwortet
    • 8.10. Abgeschlossene Webserver-Konfiguration
  • 9. WordPress-Sicherheitsupdates sicherstellen
  • 10. Regelmäßige Sicherheitsüberprüfungen auf Schwachstellen für WordPress sicherstellen

1. Sicherstellen, dass der Standard-WordPress-Admin-Benutzername geändert wurde

Wenn Sie WordPress installieren, lautet der Standard-Admin-Benutzername "admin", sofern Sie ihn während des Installationsvorgangs nicht ändern. Der Benutzername "admin" ist allgemein bekannt, daher sollte er in einen anderen Namen geändert werden. Wenn Sie weiterhin "admin" als Admin-Benutzernamen verwenden, könnte ein Angreifer einen Brute-Force-Angriff mit "admin" versuchen, um Zugriff auf Ihre WordPress-Website zu erhalten.

Wenn ein Angreifer Zugriff auf das WordPress-Admin-Konto erhält, hat er die vollständige Kontrolle über die Website. Der Standard-WordPress-Admin-Benutzername sollte in einen anderen Namen geändert werden.

Audit:

  • Überprüfen Sie, ob der Standard-WordPress-Admin-Benutzername noch auf "admin" gesetzt ist.

Behebung:

  • Wenn der Benutzername "admin" ist, ändern Sie ihn sofort in einen weniger vorhersagbaren Benutzernamen.
  1. Melden Sie sich mit dem Admin-Konto im WordPress-Admin-Dashboard an.
  2. Gehen Sie zum Bereich "Benutzer" in Ihrem Dashboard-Panel und klicken Sie auf "Neuen Benutzer hinzufügen".
  3. Füllen Sie das Formular aus und wählen Sie "Administrator" im Dropdown-Menü "Rolle" (denken Sie daran, ein starkes Web-Passwort zu verwenden und nutzen Sie den bereitgestellten Passwortstärke-Indikator, um zu bestätigen, dass Ihr neues Passwort stark genug ist).
  4. Klicken Sie abschließend auf die Schaltfläche "Neuen Benutzer hinzufügen".
  5. Melden Sie sich erneut mit Ihrem neuen WordPress-Admin-Benutzernamen an.
  6. Navigieren Sie erneut zum Bereich "Benutzer".
  7. Wählen Sie in der Benutzerliste den vorherigen Benutzernamen "admin" aus und wählen Sie "Löschen" aus dem Dropdown-Menü.
  8. Beim Löschen des alten Admins werden Sie nach den Artikeln gefragt, die unter dem vorherigen Benutzernamen "admin" veröffentlicht wurden.
    • Wählen Sie die Option "Alle Beiträge und Links zuweisen an:" und wählen Sie Ihren neuen Administrator.
    • Klicken Sie auf "Löschen bestätigen", wenn alles erledigt ist.

Hinweis:

  • Verwenden Sie immer einen anderen "Anzeigenamen" als den Benutzernamen. Wenn der tatsächliche Benutzername als Anzeigename des Inhaltsautors verwendet wird, kann ein Hacker den Benutzernamen leicht identifizieren und das Konto angreifen.

2. Sicherstellen, dass Benutzerrollen und -berechtigungen in WordPress ordnungsgemäß verwaltet werden

Standardmäßig verfügt WordPress über fünf Benutzerrollen – "Administratoren", "Editoren", "Autoren", "Mitwirkende", "Abonnenten"

Diese Rollen ermöglichen es Ihnen, durch die Vergabe entsprechender Berechtigungen zu steuern, welche Aufgaben Benutzer auf Ihrer Website ausführen können. Wenn Benutzerrollen und -berechtigungen nicht ordnungsgemäß verwaltet werden, könnten Benutzer unnötigen Zugriff auf kritische Funktionen erhalten, was ein erhebliches Sicherheitsrisiko darstellt.

Audit:

  • Überprüfen Sie, ob die WordPress-Benutzerrollen und -berechtigungen an die Anforderungen Ihrer Website angepasst sind.
  • Überprüfen Sie alle Benutzerrollen, um sicherzustellen, dass sie mit den aktuellen betrieblichen Richtlinien Ihrer Website übereinstimmen.

Behebung:

  • Weisen Sie Benutzerrollen entsprechend den Anforderungen Ihrer Website zu und verwalten Sie diese.
  • Im Allgemeinen sollte WordPress mit einem Administrator, einem Editor und einem Autor betrieben werden.
  • Entfernen Sie unnötige Admin-Konten oder reduzieren Sie Berechtigungen, wo erforderlich.
  • Überprüfen Sie regelmäßig Benutzer und ihre Rollen, um sicherzustellen, dass sie auf dem neuesten Stand sind und alle Änderungen berücksichtigt werden.

Hinweis:

  • In den meisten Fällen reichen für dienstleistungsorientierte Websites wie Unternehmensblogs, Stellenanzeigenseiten, Markenseiten und Werbeseiten, auf denen Benutzer nur minimal interagieren und Inhalte hauptsächlich präsentiert werden, Rollen wie "Administratoren", "Editoren" und "Autoren" aus.

3. Sicherstellen, dass die Benutzerregistrierung deaktiviert ist

WordPress enthält eine integrierte Benutzerregistrierungsfunktion. Diese Funktion ist standardmäßig deaktiviert, kann aber von einem Administrator aktiviert werden.

Wenn diese Funktion aktiviert ist, kann sich jeder registrieren und möglicherweise auf das WordPress-Admin-Dashboard zugreifen, was zu Sicherheitsproblemen führen kann. Für die meisten Websites, die nicht als offene Communities betrieben werden sollen, ist die Benutzerregistrierungsfunktion unnötig und sollte deaktiviert bleiben.

Audit:

  • Überprüfen Sie, ob die Benutzerregistrierung deaktiviert ist. Dies können Sie testen, indem Sie versuchen, auf die Benutzerregistrierungsseite zuzugreifen.
  1. Mit einem Webbrowser

    • Gehen Sie zu https://yourwordpress.com/wp-login.php?action=register
    • Wenn die Benutzerregistrierung deaktiviert ist, wird "User registration is currently not allowed." angezeigt. 3.1!
  2. Mit curl

    • Wenn die Benutzerregistrierung deaktiviert ist, erfolgt eine Weiterleitung zur deaktivierten Seite.```

curl -i -k "https://yourwordpress.com/wp-login.php?action=register"

(response) HTTP/1.1 302 Moved Temporarily cache-control: no-cache, no-store, must-revalidate, max-age=0 content-type: text/html; charset=UTF-8 server: Apache content-length: 0 ... location: https://yourwordpress.com/wp-login.php?registration=disabled

root@kitploit:~
**Behebung:**
- Wenn die Benutzerregistrierung aktiviert ist, deaktivieren Sie sie.
- Deaktivieren Sie die Option „Jeder kann sich registrieren“
![3.2!](https://assets.kitploit.com/production/public/readmes/6586/46991061b1bec392d06e00e986f048c6369b8db2c9e5a6b30f4f66dbc9b862d1.png)


## 4. Stellen Sie sicher, dass der Plugin-Datei-Editor deaktiviert ist
Wenn ein Angreifer in ein WordPress-Administratorkonto eindringt, kann er die vollständige Kontrolle über Ihre Website übernehmen. Er kann den Code Ihres Themes und Ihrer Plugins über die integrierte „Editor“-Funktion bearbeiten, bösartige Skripte hochladen, Ihre Website verunstalten, Ihre Benutzer mit Spam belästigen und mehr.

Häufige Hacks über diese Editoren umfassen SQL-Injection, SEO-Spam-Hacks und japanischen SEO-Spam.

**Prüfung:**
- Überprüfen Sie, ob der Datei-Editor deaktiviert ist.
- Prüfen Sie, ob Sie über Design > Editor oder Plugins > Plugin-Editor auf den Editor zugreifen können.

**Behebung:**
- Wenn der Datei-Editor aktiviert ist, deaktivieren Sie ihn, indem Sie die folgenden Schritte befolgen:

1. Greifen Sie mit dem Dateimanager oder FTP auf Ihre wp-config.php-Datei zu.
2. Öffnen Sie die wp-config.php-Datei zur Bearbeitung.
3. Scrollen Sie zum Ende der Datei (wenn Sie die Standard-wp-config.php verwenden).
4. Suchen Sie die folgende Zeile:
`
/* That’s all, stop editing! Happy publishing. */
`
5. Fügen Sie oberhalb dieser Zeile den folgenden Code ein:
`
define('DISALLOW_FILE_EDIT', true);
`
6. Speichern Sie die Änderungen und schließen Sie den Editor.
7. Kehren Sie zu Ihrem WordPress-Dashboard zurück und bestätigen Sie, dass die Editor-Optionen nicht mehr verfügbar sind.


## 5. Stellen Sie sicher, dass ungenutzte, unnötige Plugins deaktiviert sind
Viele Sicherheitslücken in WordPress entstehen durch Plugin-Sicherheitsprobleme. Plugins sind Open Source, was es Angreifern erleichtert, Schwachstellen zu finden und auszunutzen. Es ist entscheidend, die von Ihnen verwendeten Plugins auf dem neuesten Stand zu halten und ungenutzte Plugins zu deaktivieren, um eine potenzielle Ausnutzung zu verhindern.

**Prüfung:**
- Überprüfen Sie, ob ungenutzte, unnötige Plugins deaktiviert sind.
- Stellen Sie sicher, dass ungenutzte und unnötige Plugins deaktiviert sind.

**Behebung:**
- Deaktivieren Sie alle ungenutzten, unnötigen Plugins, indem Sie die folgenden Schritte befolgen:

**Verwenden Sie Plugin Check - PCP:**
- PCP: https://wordpress.org/plugins/plugin-check
1. Installieren und aktivieren Sie Plugin Check (PCP):
   - Gehen Sie zu Ihrem WordPress-Admin-Dashboard
   - Navigieren Sie zu Plugins > Installieren.
   - Suchen Sie nach „Plugin Check“ und installieren und aktivieren Sie es.

2. Führen Sie einen Plugin-Check durch:
   - Gehen Sie im WordPress-Dashboard zum Menü „Plugin Check“.
   - Wählen Sie die Plugins aus, die Sie überprüfen möchten, und führen Sie den Scan aus.

3. Analysieren Sie die Scan-Ergebnisse:
   - PCP analysiert den Code des Plugins und erstellt einen Bericht, der Folgendes umfasst:
     - Code-Standard-Konformität: Wie gut das Plugin den WordPress-Codierungsstandards entspricht.
     - Sicherheitsprobleme: Potenzielle Schwachstellen oder bösartiger Code.
     - Leistungsprobleme: Die Auswirkungen auf die Website-Leistung.
     - Kompatibilitätsprobleme: Ob das Plugin mit anderen Plugins und Themes kompatibel ist.

4. Identifizieren Sie problematische Plugins:
   - Wenn der Bericht erhebliche Sicherheitslücken, bösartigen Code oder zahlreiche Verstöße gegen Codierungsstandards hervorhebt, ist das Plugin wahrscheinlich „verdächtig“.
   - Seien Sie vorsichtig bei Plugins, die unnötige externe Anfragen stellen oder übermäßige Datenbankabfragen durchführen.

5. Beheben Sie die Probleme:
   - Beheben Sie die identifizierten Probleme durch Updates oder finden Sie die Probleme auf den Plugin-Seiten.
   - Vermeiden Sie die Verwendung von Plugins mit schwerwiegenden Sicherheitsproblemen. Finden Sie bei Bedarf alternative Plugins.

**Plugin-Verwaltung:**
1. Plugin-Auswahl:
   - Verwenden Sie offizielle Repositories, überprüfen Sie Bewertungen und Sterne, prüfen Sie die Glaubwürdigkeit der Entwickler
   - Verwenden Sie keine unbekannten, nicht verifizierten Plugins

2. Regelmäßige Updates
   - Halten Sie Plugins auf dem neuesten Stand, um sicherzustellen, dass Sie die neuesten Sicherheitspatches haben.

3. Deaktivieren und Löschen ungenutzter Plugins
   - Selbst inaktive Plugins können ein Sicherheitsrisiko darstellen. Entfernen Sie sie daher, wenn sie nicht verwendet werden.
   - Minimieren Sie Plugins: Verwenden Sie nur die wesentlichen Plugins


## 6. Stellen Sie sicher, dass WordPress nur über HTTPS konfiguriert ist, einschließlich des WordPress-Adminbereichs
Heutzutage sind die meisten Websites so konfiguriert, dass sie über SSL (HTTPS) betrieben werden. Einige Webserver können jedoch fälschlicherweise so eingerichtet sein, dass sie sowohl HTTP- als auch HTTPS-Verbindungen verarbeiten. Dies kann den Zugriff auf WordPress über beide Protokolle ermöglichen, was ein Sicherheitsrisiko darstellt. WordPress, einschließlich des WordPress-Adminbereichs, sollte ausschließlich über HTTPS erzwungen werden.

**Prüfung:**
- Überprüfen Sie, ob WordPress, einschließlich des WordPress-Adminbereichs, so konfiguriert ist, dass es nur über HTTPS zugänglich ist.
- Überprüfen Sie die VirtualHost-Konfiguration des Webservers, um sicherzustellen, dass keine HTTP-VirtualHosts eingerichtet sind.

**Behebung:**
- Wenn HTTP-Zugriff möglich ist, überprüfen und ändern Sie zunächst die Webserver-Einstellungen.
- Wenn der Server HTTP-VirtualHosts hat, leiten Sie diese entweder auf HTTPS um oder löschen Sie die HTTP-VirtualHosts.
- Aktivieren Sie gegebenenfalls die Funktion „FORCE_SSL_ADMIN“, um HTTPS-Zugriff für den WordPress-Adminbereich zu erzwingen.

**Schritte zum Aktivieren von FORCE_SSL_ADMIN:**
1. Greifen Sie mit dem Dateimanager oder FTP auf Ihre wp-config.php-Datei zu.
2. Öffnen Sie die wp-config.php-Datei zur Bearbeitung.
3. Scrollen Sie zum Ende der Datei (wenn Sie die Standard-wp-config.php verwenden).
4. Suchen Sie die folgende Zeile:
`
/* That’s all, stop editing! Happy publishing. */
`
5. Fügen Sie oberhalb dieser Zeile den folgenden Code ein:
`
define('FORCE_SSL_ADMIN', true);`
`
6. Speichern Sie die Änderungen und schließen Sie den Editor.
Kehren Sie zu Ihrem WordPress-Dashboard zurück und melden Sie sich erneut an, um sicherzustellen, dass der WordPress-Adminbereich nur über HTTPS zugänglich ist.

**HTTP auf dem Webserver auf HTTPS umleiten:**
1. Für Apache:
    ```
    <VirtualHost *:80>
        ServerName yourwordpress.com
    
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </VirtualHost>
    ```
2. Für Nginx:
    ```
    server {
        listen 80;
        server_name yourwordpress.com;
    
        location / {
            return 301 https://$host$request_uri;
        }
    }
    ```
Indem Sie sicherstellen, dass WordPress und der WordPress-Adminbereich nur über HTTPS zugänglich sind, können Sie die Sicherheit Ihrer Website erheblich verbessern, Daten schützen und unbefugten Zugriff verhindern.   

## 7. Stellen Sie sicher, dass IP-Zugriffsbeschränkungen (ACL) angewendet werden
Überprüfen Sie, ob IP-Zugriffsbeschränkungen angewendet werden

Um WordPress sicher zu betreiben, ist es wichtig, IP-Zugriffsbeschränkungen auf bestimmte URLs anzuwenden, einschließlich des WordPress-Adminbereichs, um zu verhindern, dass unerwünschte Benutzer, Computer und Bots darauf zugreifen. Dies beinhaltet, den Zugriff nur von erlaubten IP-Adressen zu gestatten, wie z. B. Administrator-IPs. Darüber hinaus ist es notwendig, ungenutzte Funktionen zu deaktivieren, um die Angriffsfläche zu minimieren.

Die zu sichernden URLs umfassen den WordPress-Adminbereich, die Benutzerregistrierung (wp-signup.php), die JSON-REST-API und die XML-RPC-Funktion.

Dieser Sicherheitsleitfaden richtet sich an serviceorientierte Websites wie Unternehmensblogs, Karriereseiten, Markenseiten und Werbeseiten, bei denen die Benutzerinteraktion minimal ist und der Inhalt hauptsächlich präsentiert wird.

Durch die Implementierung von IP-Zugriffsbeschränkungen können Sie das Risiko unbefugten Zugriffs erheblich reduzieren und die allgemeine Sicherheit Ihrer Website verbessern.


### 7.1. Stellen Sie sicher, dass IP-Zugriffsbeschränkungen auf den WordPress-Adminbereich angewendet werden.
Der Zugriffspfad des WordPress-Administrators ist fest in Form von wp-login.php oder /wp-admin, was ihn für unbefugte Benutzer leicht zugänglich macht. Stellen Sie sicher, dass eine IP-Zugriffsbeschränkung angewendet wird, um unbefugten Zugriff auf die Admin-Seite zu verhindern.

**Prüfung:**
- Überprüfen Sie, ob IP-Zugriffsbeschränkungen für den WordPress-Adminbereich angewendet werden.
- In den meisten Fällen wird dies auf dem Webserver (Apache, Nginx) konfiguriert.

**Behebung:**
- Wenn keine IP-Zugriffsbeschränkungen angewendet werden, implementieren Sie diese.
- Im Folgenden finden Sie Methoden zum Anwenden von IP-Zugriffsbeschränkungen mit Apache- und Nginx-Webservern.

**Anwenden von IP-Zugriffsbeschränkungen auf den WordPress-Adminbereich:**
- /wp-admin, wp-login.php 

1. Für Apache:
    ```
   # Files Directive 
    <Files "wp-login.php">
        Require ip 10.10.77.49  # Replace with your IP address
    </Files>
    
    # FilesMatch Directive
    <FilesMatch "^wp-login\.php$">
        Require all granted
    </FilesMatch>

   # Directory, Files Mixing Directive
    <Directory /www/vhosts/yourwordpress>
        Require all granted
        AllowOverride None
        <Files "wp-login.php">
            Require ip 10.10.77.49  # Replace with your IP address
        </Files>
    </Directory>
   
   # Location Directive
    <Location "/wp-admin">
        Require ip 10.10.77.49  # Replace with your IP address
    </Location>
    
    <Location "/wp-login.php">
        Require ip 10.10.77.49  # Replace with your IP address
    </Location>
    ```
2. Für Nginx:
    ```
    location /wp-admin {
        allow 10.10.77.49;  # Replace with your IP address
        deny all;
    }
    
    location ~* \wp-login.php {
        allow 10.10.77.49;  # Replace with your IP address
        deny all;
    }
    ```


### 7.2. IP-Zugriff einschränken oder JSON-REST-API-Funktion deaktivieren
WordPress bietet zwei REST-Funktionalitäten (xmlrpc, json rest api) und ist standardmäßig bei der WordPress-Installation aktiviert. Die REST-API stellt Endpunkte für WordPress-Datentypen bereit und ermöglicht die ferne Interaktion mit der Website für Aufgaben wie das Abfragen von Beiträgen oder Daten, das Ändern von Ressourcen, Bearbeiten und Löschen.

Für die meisten WordPress-Installationen ist die REST-API-Funktion nicht wesentlich. Die Aktivierung kann WordPress DDoS-Angriffen aussetzen und zu Ressourcenverbrauch und Website-Verlangsamungen führen.

**Prüfung:**
- Überprüfen Sie, ob die JSON-REST-API-Funktion aktiviert ist. (Standard: Aktiviert)```
# curl -i -k https://yourwordpress.com/wp-json

(response)
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, max-age=0
content-type: text/html; charset=UTF-8
...
Server: Apache

{"name":"mywordress","description":"".......................

Behebung:

  • Falls die REST-API nicht benötigt wird, deaktivieren Sie sie. Die Deaktivierung ist durch eine einfache Plugin-Installation möglich.
  • Bei Verwendung der REST-API sollten Sie IP-Zugriffsbeschränkungen anwenden, um den Zugriff nur von erlaubten IPs zu ermöglichen.

Plugin "Disable REST API" installieren und aktivieren:

  1. Gehen Sie zu Ihrem WordPress-Admin-Dashboard.
  2. Navigieren Sie zu Plugins > Neu hinzufügen.
  3. Suchen Sie nach "Disable REST API" und installieren und aktivieren Sie es.
  4. Nach der Aktivierung sollte das Plugin die REST-API-Funktionalität Ihrer WordPress-Seite automatisch deaktivieren.

IP-Zugriffsbeschränkung für die JSON-REST-API:

  1. Für Apache:
    root@kitploit:~
    <Location "/wp-json">
        Require ip 10.10.77.49  # Replace with your IP address
    </Location>
    
  2. Für Nginx:
    root@kitploit:~
    location ~ ^/wp-json/ {
        allow 10.10.77.49;   # Replace with your allowed IP address
        deny all;
    }
    

7.3. Deaktivieren der XML-RPC-API-Funktion

Ähnlich wie bei der JSON-REST-API ist es ratsam, die XML-RPC-API zu deaktivieren, da sie für die meisten WordPress-Installationen nicht erforderlich ist.

Falls die REST-API benötigt wird, wird empfohlen, stattdessen die JSON-REST-API zu verwenden.

XML-RPC hat zwei Hauptschwächen:

Brute-Force-Angriffe:

  • Angreifer versuchen, sich mit Hilfe von xmlrpc.php mit so vielen Benutzername/Passwort-Kombinationen wie möglich in WordPress anzumelden.
  • Eine Methode in xmlrpc.php ermöglicht es dem Angreifer, mit einem einzigen Befehl (system.multicall) Hunderte von Passwörtern zu erraten.

Denial-of-Service-Angriffe über Pingback:

  • Bereits 2013 versendeten Angreifer Pingback-Anfragen über xmlrpc.php von etwa 2500 WordPress-Seiten.
  • Dies gibt jedem Angreifer eine praktisch unbegrenzte Anzahl von IP-Adressen, um einen Denial-of-Service-Angriff über ein Netzwerk von über 100 Millionen WordPress-Seiten zu verteilen, ohne diese kompromittieren zu müssen.

Wenn XML-RPC aktiviert ist, kann es immer noch für solche Angriffe ausgenutzt werden.

Prüfung:

  • Überprüfen Sie, ob die XML-RPC-API-Funktion aktiviert ist. (Standard: Aktiviert)```

curl -i -k https://yourwordpress.com/xmlrpc.php

(response) HTTP/1.1 405 Method Not Allowed Date: Mon, 25 Jun 2018 08:30:24 GMT Server: Apache Allow: POST Content-Length: 42 Content-Type: text/plain; charset=UTF-8

XML-RPC server accepts POST requests only.

root@kitploit:~
**Behebung:**
- Deaktivieren Sie die XML-RPC-Funktion mit einem Plugin

**Installieren und aktivieren Sie das Plugin "Disable XML-RPC-API":**
1. Gehen Sie zu Ihrem WordPress-Admin-Dashboard
2. Navigieren Sie zu Plugins > Installieren.
3. Suchen Sie nach "[Disable XML-RPC-API](https://wordpress.org/plugins/disable-xml-rpc-api/)" und installieren und aktivieren Sie es.
4. Die XML-RPC-API ist jetzt deaktiviert.

**Über XML-RPC-Pingback-Angriffe:**

1. Überprüfen, ob XML-RPC aktiviert ist
    ```
    # curl -i -k https://yourwordpress.com/xmlrpc.php
    
    (response)
    HTTP/1.1 405 Method Not Allowed
    Date: Mon, 25 Jun 2018 08:30:24 GMT
    Server: Apache
    Allow: POST
    Content-Length: 42
    Content-Type: text/plain; charset=UTF-8
     
     
    XML-RPC server accepts POST requests only.
    ```
2. Suchen nach verfügbaren XML-RPC-Methoden
    ```
    (request)
    POST /xmlrpc.php HTTP/1.1
    Host: yourwordpress.com
    Content-Length: 135
    
    <?xml version="1.0" encoding="utf-8"?>
    <methodCall>
        <methodName>system.listMethods</methodName>
        <params></params>
    </methodCall>
    
    
    (response)
    HTTP/1.1 200 OK
    cache-control: no-cache, no-store, must-revalidate, max-age=0
    ...
    Server: Apache
    Content-Length: 4272
    Content-Type: text/xml; charset=UTF-8
    
    <?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
        <params>
            <param>
                <value>
                    <array><data>
                        <value><string>system.multicall</string></value>
                        <value><string>system.listMethods</string></value>
                        <value><string>system.getCapabilities</string></value>
                        <value><string>demo.addTwoNumbers</string></value>
                        <value><string>demo.sayHello</string></value>
                        <value><string>pingback.extensions.getPingbacks</string></value>
                        <value><string>pingback.ping</string></value>
                        <value><string>mt.publishPost</string></value>
                        ...
                        <value><string>wp.getUsersBlogs</string></value>
                    </data></array>
                </value>
            </param>
        </params>
    </methodResponse>
    
    ```
3. Pingbacks durchführen
    - Der Erfolg eines Pingback-Angriffs und spezifische Überprüfungsmethoden werden nicht beschrieben.
    ```
    (request)
    POST /xmlrpc.php HTTP/1.1
    Host: yourwordpress.com
    Content-Length: 303
    
    <?xml version="1.0" encoding="UTF-8"?>
        <methodCall>
        <methodName>pingback.ping</methodName>
            <params>
                <param>
                    <value><string>call-back url for pingback result</string></value>
                </param>
                <param>
                    <value><string>https://yourwordpress.com/</string></value>
            </param>
        </params>
    </methodCall>
    
    
    (response)
    HTTP/1.1 200 OK
    ...
    Server: Apache
    Content-Length: 370
    Content-Type: text/xml; charset=UTF-8
    
    <?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
      <fault>
        <value>
          <struct>
            <member>
              <name>faultCode</name>
              <value><int>0</int></value>
            </member>
            <member>
              <name>faultString</name>
              <value><string></string></value>
            </member>
          </struct>
        </value>
      </fault>
    </methodResponse>
    ```


### 7.4. WP-Cron deaktivieren oder Funktion einschränken
In WordPress wird WP-Cron (wp-cron.php) verwendet, um Aufgaben wie das Veröffentlichen von Beiträgen zu einem geplanten Zeitpunkt, Plugin-/Theme-Update-Prüfungen und das Versenden von Benachrichtigungs-E-Mails zu automatisieren.

WP-Cron funktioniert im Wesentlichen, indem es bei jedem Laden einer Seite die Liste der geplanten Aufgaben überprüft.
Das Problem tritt bei starkem Seitenaufkommen auf.

Da WP-Cron-Aufgaben bei jedem Seitenaufruf ausgeführt werden, führen mehrere wiederholte Zugriffe zu entsprechenden WP-Cron-Aufrufen. Infolgedessen können Systemressourcen knapp werden, was zu einer Verlangsamung oder sogar zum Stillstand der Website führen kann.
Dies ist ein reales Problem und wird häufig bei Schwachstellenangriffen auf WordPress ausgenutzt.

Wenn WP-Cron nicht notwendig ist, wird empfohlen, es zu deaktivieren.
Falls erforderlich, beschränken Sie den Zugriff nur auf lokale Hosts.


**Überprüfung:**
- Überprüfen, ob WP-Cron aktiviert ist. (Standard: Aktiviert)```
# curl -i -k https://yourwordpress.com/wp-cron.php

(response)
HTTP/1.1 200 ok
Date: Mon, 25 Jun 2018 08:30:24 GMT
Server: Apache
Allow: POST
Content-Length: 42
Content-Type: text/plain; charset=UTF-8

Behebung:

  • Deaktivieren Sie WP-Cron, falls es nicht verwendet wird.
  • Falls verwendet, wenden Sie eine der folgenden Optionen entsprechend an:
    1. Aktivieren Sie "ALTERNATE_WP_CRON" und beschränken Sie den IP-Zugriff auf wp-cron.php.
    2. Verwenden Sie System-Cron (crontab) oder andere alternative Methoden zur Ausführung von Cron-Aufgaben.

Schritte zum Deaktivieren von WP-Cron:

  1. Greifen Sie über den Dateimanager oder FTP auf Ihre wp-config.php-Datei zu.
  2. Öffnen Sie die wp-config.php-Datei zur Bearbeitung.
  3. Scrollen Sie nach unten zum Ende der Datei (wenn Sie die Standard-wp-config.php verwenden).
  4. Suchen Sie die folgende Zeile: /* That’s all, stop editing! Happy publishing. */
  5. Fügen Sie oberhalb dieser Zeile den folgenden Code hinzu: define('DISABLE_WP_CRON', true);
  6. Speichern Sie die Änderungen und schließen Sie den Editor.
  7. Wenden Sie IP-Zugriffsbeschränkungen mit Apache- und Nginx-Webservern an.
    1. Für Apache:
      root@kitploit:~
      # Files Directive 
      <Files "wp-cron.php">
          Require ip 127.0.0.1  # localhost only
      </Files>
      
      # FilesMatch Directive
      <FilesMatch "^wp-cron\.php$">
          Require ip 127.0.0.1  # localhost only
      </FilesMatch>
      
      # Location Directive
      <Location "/wp-cron.php">
          Require ip 127.0.0.1  # localhost only
      </Location>
      
    2. Für Nginx:
      root@kitploit:~
       location = /wp-cron.php {
           allow 127.0.0.1;
           deny all;
           access_log off;
           log_not_found off;
       }
      

Schritte zum Aktivieren von "ALTERNATE_WP_CRON":

  1. Greifen Sie über den Dateimanager oder FTP auf Ihre wp-config.php-Datei zu.
  2. Öffnen Sie die wp-config.php-Datei zur Bearbeitung.
  3. Scrollen Sie nach unten zum Ende der Datei (wenn Sie die Standard-wp-config.php verwenden).
  4. Suchen Sie die folgende Zeile: /* That’s all, stop editing! Happy publishing. */
  5. Fügen Sie oberhalb dieser Zeile den folgenden Code hinzu: define( 'ALTERNATE_WP_CRON', true );
  6. Speichern Sie die Änderungen und schließen Sie den Editor.
  7. Wenden Sie IP-Zugriffsbeschränkungen mit Apache- und Nginx-Webservern an.
    1. Für Apache:
      root@kitploit:~
      # Files Directive 
      <Files "wp-cron.php">
          Require ip 127.0.0.1  # localhost only
      </Files>
      
      # FilesMatch Directive
      <FilesMatch "^wp-cron\.php$">
          Require ip 127.0.0.1  # localhost only
      </FilesMatch>
      
      # Location Directive
      <Location "/wp-cron.php">
          Require ip 127.0.0.1  # localhost only
      </Location>
      
    2. Für Nginx:
      root@kitploit:~
       location = /wp-cron.php {
           allow 127.0.0.1;
           deny all;
           access_log off;
           log_not_found off;
       }
      

Beispiel: Verwendung von System-Cron (crontab):

  • Deaktivieren Sie zuerst WP-Cron, bevor Sie dies anwenden.```

vim /etc/crontab

.. ... */10 * * * * curl http://yourwordpress.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

*/10 * * * * cd /var/www/yourwordpress.com/htdocs; php /var/www/yourwordpress.com/htdocs/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Also can use WP-Cli

*/10 * * * * cd /var/www/example.com/htdocs; wp cron event run --due-now > /dev/null 2>&1

root@kitploit:~
**Über die Durchführung eines DoS-Angriffs mit wp-cron.php:**
- Senden Sie eine große Menge von Anfragen an die wp-cron.php
- Dies führt dazu, dass das Skript übermäßig viele Ressourcen verbraucht und schließlich den Server überlastet
![7.4.1!](https://assets.kitploit.com/production/public/readmes/6586/b1647fd6883b8d7b3178e7f042290fada6614e9de11a4e6e256f435902b12633.png)
![7.4.2!](https://assets.kitploit.com/production/public/readmes/6586/07d6a5d1794a3ba03177b78f63631eb5fb8f8f6092d6156965535847636d2769.png)


## 8. Systemkonfiguration für sicheres WordPress.
Die Gewährleistung eines sicheren Betriebs von WordPress erfordert eine ordnungsgemäße Konfiguration des Webservers und die Härtung der Backend-Komponenten. Hier sind mehrere wesentliche Punkte, die überprüft und umgesetzt werden müssen.

### 8.1. Sicherstellung der Verwendung von nicht abgekündigten (EOL) WordPress- und PHP-Versionen
Um eine sichere WordPress-Installation zu gewährleisten, ist es wichtig, Versionen von WordPress und PHP zu verwenden, die sich nicht am Ende ihrer Lebensdauer (EOL) befinden. EOL-Versionen werden nicht mehr unterstützt und erhalten keine Sicherheitsupdates, wodurch Ihre Website anfällig für ungepatchte Sicherheitsprobleme bleibt.

Die Verwendung unterstützter Versionen stellt sicher, dass alle entdeckten Schwachstellen umgehend behoben werden und Ihre Website vor potenziellen Angriffen geschützt ist. Hier erfahren Sie, was Sie tun müssen, um Ihre WordPress- und PHP-Versionen zu überprüfen und zu aktualisieren:

**Überprüfung:**
- Überprüfen Sie, dass Ihre aktuellen WordPress- und PHP-Versionen nicht EOL sind.

**Behebung:**
- Installieren und verwenden Sie nicht abgekündigte Versionen von WordPress und PHP.
- Stand Mai 2024 ist die unterstützte WordPress-Version 6.5 und höher. Die unterstützten PHP-Versionen sind 8.1, 8.2 und 8.3.
- Wenn Sie einen Webhosting-Dienst nutzen, nutzen Sie dessen Funktionen zum Wechseln der Versionen, um sicherzustellen, dass Sie unterstützte Versionen von WordPress und PHP verwenden.

**EOL-Status ab Mai 2024**
 1. PHP: [supported-versions](https://www.php.net/supported-versions.php)
    - Derzeit unterstützte Versionen: 8.1, 8.2, 8.3
 2. WordPress: [current-releases](https://wordpress.org/download/releases/)
    - Derzeit unterstützte Versionen: 6.5er-Serie

**Beispiel: PHP in RockyLinux 8.5**
- In RockyLinux 8.5 sind die standardmäßig verfügbaren PHP-Versionen 7.2, 7.3 und 7.4.
    ```
    # dnf module list php
    Rocky Linux 8 - AppStream
    Name         Stream          Profiles                           Summary                       
    php          7.2 [d]         common [d], devel, minimal         PHP scripting language        
    php          7.3             common [d], devel, minimal         PHP scripting language        
    php          7.4             common [d], devel, minimal         PHP scripting language        
    
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
    
    # dnf module enable php:7.4
    ==============================================================================================
     Package               Architecture         Version               Repository             Size
    ==============================================================================================
    Enabling module streams:
     httpd                                      2.4                                              
     php                                        7.4                                              
    
    Transaction Summary
    ==============================================================================================
    
    Is this ok [y/N]: y
    Complete!
    ```
- PHP 7 hat bereits das Ende seiner Lebensdauer (EOL) erreicht; ein Upgrade auf PHP 8 wird empfohlen.
- PHP 8 kann aus dem REMI-Repository installiert werden.
- Hier ist ein Beispiel, wie Sie PHP 8.2 mit REMI aktivieren und installieren:
    ```
    # Install PHP 8.2 in Rocky Linux 8
    
    # dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
    # dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
    # dnf -y install yum-utils
    # dnf module reset php
    # dnf module install php:remi-8.2
    Last metadata expiration check: 0:00:39 ago on Tue 13 Dec 2022 07:19:26 AM UTC.
    Dependencies resolved.
    =======================================================================================================================================
     Package                       Architecture        Version                                             Repository                 Size
    =======================================================================================================================================
    Installing group/module packages:
     php-cli                       x86_64              8.2.0-1.el8.remi                                    remi-modular              5.4 M
     php-common                    x86_64              8.2.0-1.el8.remi                                    remi-modular              1.3 M
     php-fpm                       x86_64              8.2.0-1.el8.remi                                    remi-modular              1.9 M
     php-mbstring                  x86_64              8.2.0-1.el8.remi                                    remi-modular              574 k
     php-xml                       x86_64              8.2.0-1.el8.remi                                    remi-modular              254 k
    Installing dependencies:
     httpd-filesystem              noarch              2.4.37-51.module+el8.7.0+1059+126e9251              appstream                  41 k
     libxslt                       x86_64              1.1.32-6.el8                                        baseos                    249 k
     oniguruma5php                 x86_64              6.9.8-1.el8.remi                                    remi-safe                 212 k
    Installing weak dependencies:
     nginx-filesystem              noarch              1:1.14.1-9.module+el8.4.0+542+81547229              appstream                  23 k
    Installing module profiles:
     php/common
    Enabling module streams:
     httpd                                             2.4
     nginx                                             1.14
     php                                               remi-8.2
    
    Transaction Summary
    =======================================================================================================================================
    Install  9 Packages
    
    # dnf update
    # dnf install php
    Last metadata expiration check: 0:00:23 ago on Tue 13 Dec 2022 07:29:55 AM UTC.
    Dependencies resolved.
    =======================================================================================================================================
     Package                       Architecture       Version                                               Repository                Size
    =======================================================================================================================================
    Installing:
     php                           x86_64             8.2.0-1.el8.remi                                      remi-modular             1.8 M
    Installing dependencies:
     apr                           x86_64             1.6.3-12.el8                                          appstream                128 k
     apr-util                      x86_64             1.6.1-6.el8.1                                         appstream                104 k
     httpd                         x86_64             2.4.37-51.module+el8.7.0+1059+126e9251                appstream                1.4 M
     httpd-tools                   x86_64             2.4.37-51.module+el8.7.0+1059+126e9251                appstream                108 k
     libsodium                     x86_64             1.0.18-2.el8                                          epel                     162 k
     mailcap                       noarch             2.1.48-3.el8                                          baseos                    38 k
     mod_http2                     x86_64             1.15.7-5.module+el8.6.0+823+f143cee1                  appstream                153 k
     rocky-logos-httpd             noarch             86.3-1.el8                                            baseos                    24 k
    Installing weak dependencies:
     apr-util-bdb                  x86_64             1.6.1-6.el8.1                                         appstream                 23 k
     apr-util-openssl              x86_64             1.6.1-6.el8.1                                         appstream                 26 k
     php-opcache                   x86_64             8.2.0-1.el8.remi                                      remi-modular             633 k
     php-pdo                       x86_64             8.2.0-1.el8.remi                                      remi-modular             166 k
     php-sodium                    x86_64             8.2.0-1.el8.remi                                      remi-modular             105 k
    
    Transaction Summary
    =======================================================================================================================================
    Install  14 Packages
    
    Total download size: 4.8 M
    Installed size: 14 M
    Is this ok [y/N]: y
    
    # php -v
    PHP 8.2.0 (cli) (built: Dec  6 2022 14:26:47) (NTS gcc x86_64)
    Copyright (c) The PHP Group
    Zend Engine v4.2.0, Copyright (c) Zend Technologies
        with Zend OPcache v8.2.0, Copyright (c), by Zend Technologies
    ```
**Hinweis:**
- Ausführliche Anweisungen zur Installation von PHP aus dem REMI-Repository: [rpms.remirepo.net](https://rpms.remirepo.net/)
- Dokumentation zur Kompatibilität von WordPress und PHP: [php-compatibility-and-wordpress-versions](https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/)


### 8.2. Sicherstellen, dass nur die erforderlichen PHP-Erweiterungen für WordPress aktiviert sind
Stellen Sie sicher, dass nur die für Ihre WordPress-Seite erforderlichen PHP-Erweiterungen aktiviert sind. Nicht benötigte Erweiterungen können die Angriffsfläche Ihrer Website vergrößern und WordPress möglicherweise Sicherheitslücken aussetzen.

Indem Sie nur die erforderlichen Erweiterungen aktivieren, können Sie potenzielle Risiken minimieren und die allgemeine Sicherheit verbessern.

Im Folgenden sind die Erweiterungen aufgeführt, die für den ordnungsgemäßen Betrieb einer WordPress-Seite erforderlich sind. **(Keine Liste, die den Sicherheitshärtungszwecken entspricht)**

| Extension | Description                                                                                                                                                                                                                                        |
|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| json      | Wird für die Kommunikation mit anderen Servern und die Verarbeitung von Daten im JSON-Format verwendet.                                                                                                                                                                     |
| mysqli    | Stellt eine Verbindung zu MySQL für Datenbankinteraktionen her.                                                                                                                                                                                                       |
| curl      | Führt Remote-Anfrageoperationen durch.                                                                                                                                                                                                                |
| dom       | Wird zur Validierung von Text-Widget-Inhalten und zur automatischen Konfiguration von IIS7+ verwendet.                                                                                                                                                                     |
| exif      | Arbeitet mit in Bildern gespeicherten Metadaten.                                                                                                                                                                                                              |
| fileinfo  | Wird zur Erkennung des MIME-Typs von Datei-Uploads verwendet.                                                                                                                                                                                                           |
| hash      | Wird für Hashing, einschließlich Passwörtern und Update-Paketen, verwendet.                                                                                                                                                                                         |
| igbinary  | Erhöht die Leistung als Ersatz für den standardmäßigen PHP-Serialisierer.                                                                                                                                                                    |
| imagick   | Bietet eine bessere Bildqualität für Medien-Uploads. Siehe WP_Image_Editor für Details. Intelligentere Bildskalierung (für kleinere Bilder) und PDF-Vorschaubild-Unterstützung, wenn Ghost Script ebenfalls verfügbar ist.                                                      |
| intl      | Ermöglicht lokalisierungsbewusste Operationen, einschließlich, aber nicht beschränkt auf Formatierung, Transliteration, Kodierungsumwandlung, Kalenderoperationen, konforme Sortierung, Lokalisieren von Textgrenzen und Arbeiten mit Gebietsschema-Identifikatoren, Zeitzonen und Graphemen. |
| mbstring  | Wird zur ordnungsgemäßen Verarbeitung von UTF8-Text verwendet.                                                                                                                                                                                                                 |
| openssl   | SSL-basierte Verbindungen zu anderen Hosts.                                                                                                                                                                                                              |
| pcre      | Erhöht die Leistung des Mustervergleichs in Codesuchen.                                                                                                                                                                                        |
| xml       | Wird für XML-Parsing verwendet, z. B. von einer Drittanbieter-Website.                                                                                                                                                                                             |
| zip       | Wird zum Dekomprimieren von Plugins, Themes und WordPress-Update-Paketen verwendet.                                                                                                                                                                             |
| bc        | Für Mathematik mit beliebiger Genauigkeit, die Zahlen jeder Größe und Genauigkeit bis zu 2147483647 Dezimalstellen unterstützt.                                                                                                                                                                                             | 
| filter    | Wird zum sicheren Filtern von Benutzereingaben verwendet.                                                                                                                                                                                                            |
| image     | Wenn Imagick nicht installiert ist, wird die GD Graphics Library als funktional eingeschränkter Fallback für die Bildbearbeitung verwendet.                                                                                                                                                                                                             |
| iconv     | Wird zur Konvertierung zwischen Zeichensätzen verwendet.                                                                                                                                                                                                            |
| shmop     | Shmop ist eine einfach zu verwendende Funktionssammlung, die es PHP ermöglicht, Unix-Shared-Memory-Segmente zu lesen, zu schreiben, zu erstellen und zu löschen.                                                                                                                                                                                            |
| simplexml | Wird für XML-Parsing verwendet.                                                                                                                                                                                                                              |
| sodium    | Validiert Signaturen und stellt sicher zufällige Bytes bereit.                                                                                                                                                                                           |
| xmlreader | Wird für XML-Parsing verwendet.                                                                                                                                                                                                                              |
| zlib      | Gzip-Komprimierung und -Dekomprimierung.                                                                                                                                                                                                                |

Wesentliche Erweiterungen finden Sie hier: [WordPress Hosting Handbook: PHP Extensions](https://make.wordpress.org/hosting/handbook/server-environment/#php-extensions)

**Überprüfung:**
- Überprüfen Sie, dass nur die erforderlichen PHP-Erweiterungen für Ihre WordPress-Seite aktiviert sind.

**Behebung:**
- Entfernen Sie alle unnötigen Erweiterungen. Manchmal werden Erweiterungen zusammen mit Plugins installiert, die für Ihre Seite möglicherweise nicht erforderlich sind.
- Um die derzeit aktivierten PHP-Erweiterungen zu überprüfen, können Sie die Datei **php.ini** überprüfen oder die Funktion **phpinfo()** verwenden, um alle aktiven Erweiterungen aufzulisten.

![8.2!](https://assets.kitploit.com/production/public/readmes/6586/1e270a242227b8dc8fa965765c69b7927b170de108acdbe1fad91455e484e615.png)

- Bestimmte Erweiterungen sollten, wenn nicht benötigt, deaktiviert werden, um potenzielle Sicherheitsprobleme zu vermeiden.
- Zum Beispiel könnten Erweiterungen wie exif, fileinfo, imap, soap, pdo_sqlite und opcache ausgenutzt werden, wenn sie ohne ordnungsgemäße Verwendung aktiviert bleiben.
- Wenn Sie einen Webhosting-Dienst nutzen, bieten viele Anbieter benutzerfreundliche Oberflächen zum Ändern der PHP-Einstellungen, einschließlich des Aktivierens oder Deaktivierens von PHP-Erweiterungen. Mit diesen Funktionen können Sie Erweiterungen effektiv verwalten.


### 8.3. Sicherheit von Plugins mit Datei-Upload-Funktionen gewährleisten
Plugins mit Datei-Upload-Funktionen können ein erhebliches Sicherheitsrisiko darstellen, wenn sie nicht ordnungsgemäß gesichert sind. Schwachstellen in Datei-Upload-Funktionen können es Angreifern ermöglichen, Webshells hochzuladen, was möglicherweise zu einer vollständigen Kompromittierung des Systems führt. Daher ist es entscheidend, sicherzustellen, dass jede Datei-Upload-Funktionalität Validierungs- und Bereinigungsmechanismen enthält.

Warum ist das wichtig?
1. Erweiterungsvalidierung:
   - Der Server sollte Dateierweiterungen anhand einer Whitelist erlaubter Typen validieren, um das Hochladen schädlicher Dateien zu verhindern.

2. MIME-Typ-Prüfung:
   - Der MIME-Typ der Datei sollte überprüft werden, um sicherzustellen, dass er dem erwarteten Typ entspricht, was eine zusätzliche Sicherheitsebene darstellt.

3. Einschränkungen des Upload-Pfads:
   - Stellen Sie sicher, dass keine offengelegten Pfade vorhanden sind, die direkten Zugriff auf hochgeladene Dateien ohne Validierung ermöglichen.

Schwachstellen beim Datei-Upload sind besonders gefährlich, da sie Angreifern einen direkten Weg bieten, ausführbaren Code hochzuladen und beliebige Befehle auszuführen. Schwachstellen beim Datei-Upload sind oft einfacher zu identifizieren und auszunutzen als andere Sicherheitslücken wie SQL-Injection.

**Überprüfung:**
- Identifizieren Sie Plugins mit Datei-Upload-Funktionen auf Ihrer WordPress-Seite.
- Überprüfen Sie, dass diese Plugins ordnungsgemäße Validierungsprüfungen für hochgeladene Dateien durchführen, einschließlich Erweiterungs- und MIME-Typ-Validierung.

**Behebung:**
- Wenn ein Plugin mit Datei-Upload-Funktionen keine ordnungsgemäße Validierung aufweist, verbessern Sie entweder seine Sicherheit oder entfernen Sie das Plugin.
- Im Folgenden finden Sie Beispiele für beliebte WordPress-Plugins mit Datei-Upload-Funktionen und wie sie die Dateivalidierung handhaben.

**Beispiel: Beliebte WordPress-Plugins mit Datei-Upload-Handhabung**

1. Contact Form 7
   - Contact Form 7 ist eines der am häufigsten verwendeten Formular-Plugins in WordPress. Es enthält grundlegende Datei-Upload-Funktionalität mit Erweiterungs- und MIME-Typ-Validierung.**Code für erlaubte Dateierweiterungen und MIME-Typ-Prüfung:**
root@kitploit:~
  function wpcf7_allowed_file_extensions() {
      // Default allowed file extensions
      $allowed_file_extensions = array(
          'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx',
          'xls', 'xlsx', 'txt', 'csv', 'rtf', 'html', 'zip'
      );
      return $allowed_file_extensions;
  }

  function wpcf7_handle_upload( $file ) {
      $allowed_mime_types = wpcf7_allowed_file_extensions();
      $file_type = wp_check_filetype( $file['name'] );

      // Check if the file type is allowed
      if ( ! in_array( $file_type['ext'], $allowed_mime_types ) ) {
          return new WP_Error( 'wpcf7_upload_failed', __( 'File type is not allowed.', 'contact-form-7' ) );
      }

      // Handle the file upload
      $upload = wp_handle_upload( $file, array( 'test_form' => false ) );

      // Check if the upload was successful
      if ( isset( $upload['error'] ) ) {
          return new WP_Error( 'wpcf7_upload_failed', $upload['error'] );
      }

      return $upload;
  }
  ```
  In Contact Form 7 gibt die Funktion `wpcf7_allowed_file_extensions()` eine Liste erlaubter Dateierweiterungen zurück, und die Funktion `wpcf7_handle_upload()` prüft, ob die Dateierweiterung in dieser Liste enthalten ist, bevor der Upload fortgesetzt wird.

2. WPForms

  • WPForms behandelt Datei-Uploads, indem es die erlaubten Dateitypen prüft.

    Beispielcode für WPForms:

    root@kitploit:~
      function wpforms_get_file_types() {
       // Return an array of allowed file types
       return array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
    }
    
    function wpforms_process_file_upload( $file ) {
       $allowed_file_types = wpforms_get_file_types();
       $file_type = wp_check_filetype( $file['name'] );
    
       if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
           return new WP_Error( 'wpforms_upload_failed', __( 'File type is not allowed.', 'wpforms' ) );
       }
    
       $upload = wp_handle_upload( $file, array( 'test_form' => false ) );
    
       if ( isset( $upload['error'] ) ) {
           return new WP_Error( 'wpforms_upload_failed', $upload['error'] );
       }
    
       return $upload;
    }
    
  1. WooCommerce
    • WooCommerce definiert und prüft ebenfalls direkt in seinem Upload-Handling-Code die erlaubten Dateierweiterungen.

      Beispielcode für WooCommerce:

      root@kitploit:~
      function woocommerce_handle_upload( $file ) {
          $allowed_file_types = array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
          $file_type = wp_check_filetype( $file['name'] );
      
          if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
              return new WP_Error( 'woocommerce_upload_failed', __( 'File type is not allowed.', 'woocommerce' ) );
          }
      
          $upload = wp_handle_upload( $file, array( 'test_form' => false ) );
      
          if ( isset( $upload['error'] ) ) {
              return new WP_Error( 'woocommerce_upload_failed', $upload['error'] );
          }
      
          return $upload;
      }
      

Beispiel: Bösartiges Datei-Upload-Plugin

  • Ein bösartiges Plugin könnte harmlos aussehen, aber die fileinfo-Erweiterung ausnutzen, um Sicherheitsprüfungen zu umgehen:
    root@kitploit:~
    <?php
    /*
    Plugin Name: Simple Malicious Upload
    Description: A plugin with hidden malicious file upload capability.
    Version: 1.0
    */
    
    function simple_file_upload_menu() {
        add_menu_page('File Upload', 'File Upload', 'manage_options', 'file-upload', 'simple_file_upload_page');
    }
    
    add_action('admin_menu', 'simple_file_upload_menu');
    
    function simple_file_upload_page() {
        ?>
        <h1>File Upload</h1>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="uploaded_file" />
            <input type="submit" name="upload_file" value="Upload" />
        </form>
        <?php
    
        if (isset($_POST['upload_file'])) {
            simple_handle_file_upload();
        }
    }
    
    function simple_handle_file_upload() {
        if (!empty($_FILES['uploaded_file']['tmp_name'])) {
            $file_tmp = $_FILES['uploaded_file']['tmp_name'];
            $file_name = basename($_FILES['uploaded_file']['name']);
    
            // Using fileinfo to check MIME type
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $mime_type = finfo_file($finfo, $file_tmp);
            finfo_close($finfo);
    
            // Insecure handling: allows any PHP files to be uploaded
            if ($mime_type === 'text/plain' || $mime_type === 'application/x-php') {
                $upload_dir = wp_upload_dir();
                $upload_file = $upload_dir['path'] . '/' . $file_name;
    
                // Move the uploaded file to the uploads directory
                if (move_uploaded_file($file_tmp, $upload_file)) {
                    echo "File uploaded successfully.";
                } else {
                    echo "File upload failed.";
                }
            } else {
                echo "Invalid file type.";
            }
        }
    }
    ?>
    

Erklärung des Exploits:

  • Das bösartige Plugin erlaubt das Hochladen von PHP-Dateien, wenn deren MIME-Typ application/x-php ist.
  • Ein Angreifer kann mit dieser Funktionalität eine PHP-Web-Shell hochladen.
  • Nach dem Hochladen greift der Angreifer auf die URL der Datei zu und kann beliebige Befehle ausführen.

Beispiel: PHP-Web-Shell-Code```

"; system($_GET['cmd']); echo ""; } ?>
root@kitploit:~
**Demonstration des Angriffs**
1. Hochladen der Web-Shell:
   - Der Angreifer lädt webshell.php über das Upload-Formular des Plugins hoch.
2. Zugriff und Nutzung der Web-Shell:
   - Der Angreifer greift auf die Web-Shell unter `http://yourwordpress.com/wp-content/uploads/webshell.php` zu.
   - Durch Navigieren zu `http://yourwordpress.com/wp-content/uploads/webshell.php?cmd=ls` kann der Angreifer beliebige Befehle ausführen.

**Hinweis:**
- Das Beispiel dient der Erklärung, wie das Plugin mit Datei-Upload-Funktionen missbraucht werden kann.
- Eine ordnungsgemäße Validierung und Bereinigung kann potenzielle Ausnutzung verhindern und die Sicherheit Ihrer WordPress-Seite gewährleisten.
- Die obigen Plugin-Codes dienen nur zu Bildungszwecken.


### 8.4. Sicherstellen, dass PHP-Funktionen und -Einstellungen korrekt konfiguriert sind
Die Sicherstellung, dass PHP-Funktionen und -Einstellungen korrekt konfiguriert sind, kann die Sicherheit Ihrer WordPress-Seite erheblich verbessern. Falsch konfigurierte Einstellungen können Ihre Seite verschiedenen Schwachstellen aussetzen, darunter Remote-Code-Ausführung, Offenlegung von Informationen und Session-Hijacking. Es ist entscheidend, PHP zu härten, indem diese Funktionen deaktiviert oder korrekt konfiguriert werden.

Warum ist das wichtig?
1. Remote-Code-Ausführung:
   - Einstellungen wie `allow_url_fopen` und Funktionen wie exec können Remote-Code-Ausführung ermöglichen, was zu einer möglichen Systemkompromittierung führt.

2. Offenlegung von Informationen:
   - Optionen wie `display_errors` und `expose_php` können sensible Informationen über Ihre Serverkonfiguration preisgeben, was Angreifern das Auffinden von Schwachstellen erleichtert.

3. Session-Sicherheit:
   - Ordnungsgemäße Session-Management-Einstellungen wie `session.cookie_secure` und `session.cookie_httponly` schützen Session-Cookies vor dem Zugriff durch clientseitige Skripte oder der Übertragung über unsichere Kanäle.

**Prüfung:**
- Stellen Sie sicher, dass die unten aufgeführten unsicheren PHP-Funktionen und -Einstellungen angemessen konfiguriert und gehärtet sind.

**Abhilfe:**
- Überprüfen Sie die folgenden PHP-Einstellungen und -Funktionen und passen Sie sie an, um sowohl den sicheren Betrieb Ihrer WordPress-Seite als auch deren Funktionalität zu gewährleisten.

1. allow_url_fopen:
   - Ermöglicht Funktionen das Öffnen und Lesen von Dateien über URLs.
   - Wenn aktiviert, können Funktionen wie `file_get_contents(), fopen(), include(), und require()` Daten von entfernten Standorten über FTP oder HTTP abrufen.
   - WordPress und viele WordPress-Plugins benötigen möglicherweise `allow_url_fopen` für verschiedene Funktionen.
   - Es ist jedoch nicht notwendig, diese Einstellung dauerhaft aktiviert zu lassen.
   - Aus Sicherheitsgründen ist es besser, sie nur bei Bedarf zu aktivieren.
        ```
        ; (Optional) Deaktivieren Sie allow_url_fopen, wenn nicht benötigt
     
        allow_url_fopen = Off
        ```

2. display_errors:
   - Bestimmt, ob PHP-Fehler als Teil der Ausgabe auf dem Bildschirm angezeigt werden sollen.
   - Das Anzeigen von Fehlern kann sensible Informationen über Ihre Serverumgebung und Anwendung preisgeben, die von Angreifern zur Ausnutzung von Schwachstellen genutzt werden können.
        ```
        ; Deaktivieren Sie die Anzeige von PHP-Fehlern auf Ihrer WordPress-Website
     
        display_errors = Off
        ```

3. expose_php:
   - Steuert, ob PHP seine Präsenz und Version in HTTP-Headern bekannt gibt.
   - Die Preisgabe dieser Informationen kann Angreifern helfen, anfällige PHP-Versionen zu identifizieren.
        ```
        ; Verhindern Sie die Angabe der PHP-Version in HTTP-Antwort-Headern
     
        expose_php = Off
        session.cookie_secure
        ```

4. session.cookie_secure:
   - Stellt sicher, dass Session-Cookies nur über sichere HTTPS-Verbindungen übertragen werden, und schützt sie vor Abfangen während der Übertragung.
        ```
        ; Stellen Sie sicher, dass Session-Cookies über HTTPS gesendet werden
     
        session.cookie_secure = On
        session.cookie_httponly
        ```

5. session.cookie_httponly:
   - Macht Session-Cookies für JavaScript unzugänglich und mindert das Risiko von Cross-Site-Scripting (XSS)-Angriffen.
        ```
        ; Machen Sie Session-Cookies für JavaScript unzugänglich
     
        session.cookie_httponly = On
        ```

6. open_basedir:
   - Beschränkt den PHP-Zugriff auf Dateien innerhalb angegebener Verzeichnisse.
   - Dies kann verhindern, dass Angreifer auf sensible Dateien auf dem Server zugreifen.
        ```
        ; Beschränken Sie den PHP-Dateizugriff auf das angegebene Verzeichnis
        open_basedir = "/Pfad/zu/Ihrem/Webroot"
        ```
   **Beispiel:**
   - Wenn Ihr Webroot /var/www/html ist, setzen Sie open_basedir wie folgt:
       ```
       open_basedir = "/var/www/html:/tmp"
     
       Diese Konfiguration erlaubt PHP den Zugriff nur auf Dateien im Verzeichnis /var/www/html und das temporäre Verzeichnis /tmp.
       ```

7. disable_functions:
   - PHP-Funktionen, die häufig bei Angriffen ausgenutzt werden.
   - Das Deaktivieren dieser Funktionen kann das Risiko verschiedener Angriffsarten mindern, einschließlich Command Injection und Remote-Code-Ausführung.
        ```
        ; Deaktivieren Sie potenziell gefährliche PHP-Funktionen
     
        disable_functions = "system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail"
        ```
    **Erklärung der deaktivierten Funktionen:**
    - **system, exec, shell_exec, passthru**:
       - Erlauben die Ausführung von Systembefehlen, die für Command-Injection-Angriffe ausgenutzt werden können.
    
    - **mysql_list_dbs**:
       - Ruft eine Liste der Datenbanken von einem MySQL-Server ab, die zur Informationssammlung für weitere Angriffe genutzt werden kann.
    
    - **ini_alter**:
        - Ändert die PHP-Konfiguration zur Laufzeit und kann potenziell die Sicherheitseinstellungen verändern.
    
    - **dl**:
        - Lädt dynamisch eine PHP-Erweiterung, die zur Einführung von schädlichem Code verwendet werden kann.
    
    - **symlink, link**:
        - Erstellen symbolische oder harte Links, die ausgenutzt werden können, um Dateien und Verzeichnisse unangemessen zu manipulieren.
    
    - **chgrp**:
        - Ändert die Gruppenbesitzer einer Datei und kann potenziell Zugriffsberechtigungen verändern.
    
    - **leak**:
        - Wird zum Testen auf Speicherlecks verwendet, kann aber zur Ressourcenauslastung des Servers ausgenutzt werden.
    
    - **popen**:
        - Öffnet eine Pipe zu einem Prozess und kann zur Befehlsausführung ausgenutzt werden.
    
    - **apache_child_terminate**:
        - Beendet einen Apache-Prozess und kann potenziell den Dienst stören.
    
    - **virtual**:
        - Apache-spezifisch und kann zum Einbinden anderer URLs verwendet werden, was ein Sicherheitsrisiko darstellt.
    
    - **mb_send_mail**:
        - Sendet eine E-Mail und kann für Spamming ausgenutzt werden.

**Beispiel: Nachfolgend eine Liste deaktivierter PHP-Funktionen in einer tatsächlichen WordPress-Installation**```
system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, 
link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail

8.5. Sicherstellen, dass der Webserver als ein Nicht-Root-Benutzer läuft - Einzigartiger, unprivilegierter Benutzer und Gruppe für die Serveranwendung

In den meisten Fällen laufen Webserver als Benutzer wie "www-data" (Debian/Ubuntu) oder "apache" (RHEL/CentOS).

Diese Benutzer sind dedizierte Servicekonten ohne besondere Privilegien auf dem Server und werden verwendet, um den Benutzer und die Gruppe zu bestimmen, die die Webserver-Worker-Prozesse annehmen.

Wenn diese Benutzer Systemprivilegien haben oder als Root laufen, müssen sie geändert werden.

Prüfung:

  • Überprüfen Sie den Benutzer, der den Webserver-Prozess ausführt. (Insbesondere handelt es sich um den Webserver-Worker-Prozess.)
  1. Für Apache:

    root@kitploit:~
    # ps -ef | grep httpd
    root     2257     1  0 Apr08 ?        00:00:01 /usr/local/apache/bin/httpd -k start
    apache   5678  1234  0 Apr08 ?        00:00:00 /usr/sbin/httpd -k start
    apache   5679  1234  0 Apr08 ?        00:00:00 /usr/sbin/httpd -k start
    apache   5680  1234  0 Apr08 ?        00:00:00 /usr/sbin/httpd -k start
    apache   5681  1234  0 Apr08 ?        00:00:00 /usr/sbin/httpd -k start
    
  2. Für Nginx:

    root@kitploit:~
    # ps -ef | grep nginx
    root      626653       1  0 Apr08 ?        00:00:00 nginx: master process /usr/sbin/nginx
    nginx     626654  626653  0 Apr08 ?        00:00:00 nginx: worker process
    nginx     626655  626653  0 Apr08 ?        00:00:00 nginx: worker process
    nginx     626656  626653  0 Apr08 ?        00:00:00 nginx: worker process
    nginx     626657  626653  0 Apr08 ?        00:00:00 nginx: worker process
    

Behebung:

  • Der Webserver sollte als ein unprivilegierter, dedizierter Account laufen.
  • In den meisten Fällen wird einer dieser häufig verwendeten Accounts wie "www-data", "apache", "nginx", "nobody" oder "daemon" verwendet.
  1. Für Apache:

    root@kitploit:~
    # vim /etc/httpd/httpd.conf
    ..
    ...
    User www-data
    Group www-data
    ..
    ...
    
  2. Für Nginx:

    root@kitploit:~
    # vim /etc/nginx/nginx.conf
    ..
    ...
    user daemon;
    

Hinweis:

  • Die Prozessbenutzer des Webservers sollten keine Shell-Login-Rechte haben. ```

    cat /etc/passwd | grep -i www-data

    www-data❌33:33:www-data:/var/www:/usr/sbin/nologin
    root@kitploit:~

8.6. Sicherstellen, dass PHP-FPM als Nicht-Root-Benutzer läuft – Eigenständiger, unprivilegierter Benutzer und Gruppe für die Serveranwendung

WordPress ist mit PHP erstellt, daher ist eine korrekte Systemkonfiguration notwendig, um PHP-Code ordnungsgemäß auszuführen.

Die PHP-Codeausführung in WordPress wird von PHP-FPM, einem FastCGI-Prozessmanager, verwaltet. Um den sicheren Betrieb von PHP-FPM zu gewährleisten, sollte es unter einem nicht-privilegierten, dedizierten Dienstkonto laufen.

Allgemein sind das Webserver-Prozesskonto und das PHP-FPM-Konto auf dasselbe Konto gesetzt. Für eine erhöhte Sicherheit ist es jedoch besser, sie unter separaten Konten zu betreiben.

Hierfür gibt es zwei Gründe:

  1. Isolation von Prozessen:

    • Das Ausführen von Webserver und PHP-FPM unter separaten Konten isoliert die Prozesse.
    • Dies verringert das Risiko, dass ein Kompromiss in einem Dienst den anderen beeinträchtigt.
    • Falls ein Angreifer Zugriff auf den Webserver-Prozess erhält, hat er nicht unbedingt Zugriff auf PHP-FPM und umgekehrt.
  2. Prinzip der geringsten Privilegien:

    • Durch die Verwendung dedizierter, nicht privilegierter Konten für jeden Dienst befolgen Sie das Prinzip der geringsten Privilegien.
    • Dies schränkt die Berechtigungen und den Zugriff jedes Dienstes ein und minimiert potenzielle Schäden durch Sicherheitslücken oder -verletzungen.

Prüfung:

  • Überprüfen Sie das Konto, unter dem der PHP-FPM-Prozess läuft.```

ps -ef | grep php-fpm

root 1234 1 0 12:00 ? 00:00:01 php-fpm: master process (/etc/php-fpm.conf) php-fpm 5678 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5679 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5680 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5681 1234 0 12:00 ? 00:00:00 php-fpm: pool www

root@kitploit:~
**Behebung:**
- PHP-FPM sollte als ein nicht privilegiertes, dediziertes Konto ausgeführt werden.
- In den meisten Fällen wird das Konto "php-fpm" verwendet.

**Ändern des Prozesskontos für PHP-FPM:**```
# vim /etc/php-fpm.d/www.conf # Adjust the path based on your PHP version
...
user = php-fpm
group = php-fpm
listen.owner = php-fpm 
listen.group = php-fpm 

Das PHP-FPM-Prozesskonto sollte keine Shell-Login-Berechtigungen haben.```

cat /etc/passwd | grep php-fpm

php-fpm❌999:999:PHP-FPM:/run/php:/usr/sbin/nologin

root@kitploit:~
**Hinweis:**
- Aus Sicherheitssicht ist es vorzuziehen, unterschiedliche Benutzerkonten für die PHP-FPM-Prozesse und die Webserver-Prozesse zu verwenden.
- Auf die Frage, was aus Sicherheitssicht besser ist, sollten diese unterschiedlich sein. Vermeiden Sie es, in diesem Kontext dasselbe Ausführungskonto zu verwenden.

### 8.7. Sichere Konfiguration des WordPress-Home-Verzeichnisses sicherstellen

Für den sicheren Betrieb eines Webservers ist es entscheidend, die Besitzer- und Berechtigungszuweisungen des WordPress-Home-Verzeichnisses korrekt zu konfigurieren.

In den meisten Fällen werden die Besitzer- und Berechtigungszuweisungen der WordPress-Dateien und -Verzeichnisse so festgelegt, dass sie mit dem Prozesskonto des Webservers übereinstimmen.
Diese Konfiguration ermöglicht es dem Webserver, auf Dateien im Webroot zuzugreifen und ohne Fehler zu arbeiten.

Diese Konfiguration ist jedoch unsicher.

Wenn beispielsweise der Webserver-Prozess 'apache' ist und sowohl das Webroot-Verzeichnis als auch die Dateien dem Benutzer 'apache' gehören, kann dies zu schwerwiegenden Schwachstellen führen.
Angreifer könnten diese Schwachstellen ausnutzen, um unbefugten Zugriff auf kritische Dateien und Verzeichnisse innerhalb des WordPress-Home-Verzeichnisses zu erhalten.

**Häufiges Schwachstellenbeispiel:**
- Wenn sowohl das Webserver-Prozesskonto als auch das Home-Verzeichnis (Webroot) und die Dateien im Besitz von 'apache' sind:
- Bei Schwachstellen in der Website und externem Zugriff auf das System (wie Webshell) können Angreifer verschiedene Aktionen im Webroot ausführen:
  1. Dateien oder Verzeichnisse innerhalb des Webroot erstellen, ändern oder löschen.
  2. Webzugriffsprotokolle manipulieren, einschließlich Änderung, Löschung oder Erstellung. (außer in einigen Umgebungen)
  3. Zugriff auf aktive Sitzungs-Cookies von angemeldeten Benutzern erlangen. (in besonders anfälligen Umgebungen)

Um diese Risiken zu mindern, ist es entscheidend, die Besitzer- und Berechtigungszuweisungen des WordPress-Home-Verzeichnisses ordnungsgemäß anzupassen.

**Abhilfe:**
- Setzen Sie den Besitzer des Home-Verzeichnisses (Webroot) und der Dateien auf 'root:root'. (Vermeiden Sie es, es auf dasselbe Konto wie das Webserver-Prozesskonto zu setzen.)
- Die Standard-UMASK für Verzeichnisse und Dateien ist 022. (Verzeichnisse: 755, Dateien: 644)
- Für Verzeichnisse, die Schreibzugriff erfordern, wie z. B. Datei-Upload durch den Webdienst, setzen Sie den Besitzer dieser Verzeichnisse auf das Webserver-Prozesskonto.

**Allgemein erforderliche Schreibberechtigungsverzeichnisse in WordPress:**```
/wp-content/uploads
/wp-content/cache
/wp-content/wflogs (when using security plugins like Wordfence)
/wp-content/upgrade (used during the WordPress upgrade process)

Nachdem die Eigentümerschaft und die Berechtigungen des Home-Verzeichnisses gemäß den obigen Abhilfemaßnahmen konfiguriert wurden, sieht die Ausgabe des WordPress-Home-Verzeichnisses wie folgt aus:

Beispiel: WordPress Home Directory``` drwxr-xr-x 5 root root 4096 May 27 2024 . drwxr-xr-x 3 root root 4096 May 27 2024 .. -rw-r--r-- 1 root root 418 May 27 2024 index.php -rw-r--r-- 1 root root 19935 May 27 2024 license.txt -rw-r--r-- 1 root root 7346 May 27 2024 readme.html -rw-r--r-- 1 root root 7106 May 27 2024 wp-activate.php drwxr-xr-x 9 root root 4096 May 27 2024 wp-admin -rw-r--r-- 1 root root 351 May 27 2024 wp-blog-header.php -rw-r--r-- 1 root root 2328 May 27 2024 wp-comments-post.php -rw-r--r-- 1 root root 4973 May 27 2024 wp-config-sample.php -rw-r--r-- 1 root root 2755 May 27 2024 wp-config.php drwxr-xr-x 8 root root 4096 May 27 2024 wp-content -rw-r--r-- 1 root root 3940 May 27 2024 wp-cron.php drwxr-xr-x 25 root root 12288 May 27 2024 wp-includes -rw-r--r-- 1 root root 2496 May 27 2024 wp-links-opml.php -rw-r--r-- 1 root root 3300 May 27 2024 wp-load.php -rw-r--r-- 1 root root 51556 May 27 2024 wp-login.php -rw-r--r-- 1 root root 8403 May 27 2024 wp-mail.php -rw-r--r-- 1 root root 24568 May 27 2024 wp-settings.php -rw-r--r-- 1 root root 30869 May 27 2024 wp-signup.php -rw-r--r-- 1 root root 4620 May 27 2024 wp-trackback.php -rw-r--r-- 1 root root 3065 May 27 2024 xmlrpc.php

root@kitploit:~
**Falls die Prozesskonten von php-fpm und Webserver unterschiedlich sind (Getrennte Berechtigungen)**

Wenn das Prozesskonto des Webservers "apache" und das php-fpm-Prozesskonto "php-fpm" ist.

Ändern Sie die Berechtigungen der Verzeichnisse, die in WordPress Schreibzugriff benötigen (z. B. /wp-content/uploads).
- Besitzer: php-fpm
- Gruppe: apache
- Verzeichnisberechtigungen: 775 (falls nötig 755)

**Datei- und Verzeichnisstruktur**

Setzen Sie die Schreibberechtigungen für die erforderlichen Verzeichnisse, sodass sowohl die Konten "php-fpm" als auch "apache" schreiben können.```
ex) /service/wordpress/www
├── index.php             (root:root, 644)
├── license.txt           (root:root, 644)
├── readme.html           (root:root, 644)
├── wp-activate.php       (root:root, 644)
├── wp-admin/             (root:root, 755)
├── wp-blog-header.php    (root:root, 644)
├── wp-comments-post.php  (root:root, 644)
├── wp-config-sample.php  (root:root, 644)
├── wp-config.php         (root:root, 644)
├── wp-content/           (root:root, 755)
│   ├── plugins/          (root:root, 755)
│   ├── themes/           (root:root, 755)
│   ├── uploads/          (php-fpm:apache, 775)
│   │   ├── 2024/         (php-fpm:apache, 775)
│   │   └── ...           (php-fpm:apache, 775)
│   └── ...               (root:root, 755)
├── wp-cron.php           (root:root, 644)
├── wp-includes/          (root:root, 755)
├── wp-links-opml.php     (root:root, 644)
├── wp-load.php           (root:root, 644)
├── wp-login.php          (root:root, 644)
├── wp-mail.php           (root:root, 644)
├── wp-settings.php       (root:root, 644)
├── wp-signup.php         (root:root, 644)
├── wp-trackback.php      (root:root, 644)
└── xmlrpc.php            (root:root, 644)

Zusammenfassung

  1. Konto des Webserver-Worker-Prozesses: "www-data" oder "apache" oder "nginx"
  2. PHP-FPM-Prozess-Konto: "php-fpm"
  3. WordPress-Verzeichniseinstellungen:
    • Stammverzeichnis:
      • Besitzer: root:root
      • Verzeichnisberechtigungen 755
      • Dateiberechtigungen 644
    • Schreibberechtigte Verzeichnisse
      • Besitzer: "php-fpm:www-data"
      • Verzeichnisberechtigungen 775 (oder 755 falls erforderlich)

Durch diese Einrichtung können Sie die Berechtigungen des Webservers und von PHP-FPM trennen, die Besitzer- und Berechtigungseinstellungen des Stammverzeichnisses korrekt anwenden und die Sicherheit erhöhen.

Diese Methode gilt nicht nur für WordPress, sondern für jede Webserver-Struktur, die Webinhalte bereitstellt.

8.8. Sicherstellen, dass die PHP-Ausführung in beschreibbaren Verzeichnissen deaktiviert ist

Sicherzustellen, dass die PHP-Ausführung in Verzeichnissen, in die Dateien hochgeladen werden können, deaktiviert ist, ist entscheidend für die Aufrechterhaltung einer sicheren Umgebung.

Upload-Verzeichnisse mit Schreibberechtigungen sind potenzielle Ziele für Angreifer, um bösartige Skripte wie Webshells hochzuladen, die ausgeführt werden können, um den Server zu gefährden.

Warum ist das wichtig?

  1. Web-Shell-Angriffe abschwächen:

    • Indem die Ausführung von PHP-Skripten in Upload-Verzeichnissen verhindert wird, wird das Risiko von Webshell-Angriffen gemindert, die zu einer vollständigen Kompromittierung des Servers führen können.
  2. Angriffsfläche reduzieren:

    • Die Deaktivierung der PHP-Ausführung in Verzeichnissen, in die Dateien geschrieben werden können, verringert die Angriffsfläche und erschwert es Angreifern, Schwachstellen auszunutzen.
  3. Einhaltung von Sicherheitsbest Practices:

    • Die Sicherstellung korrekter Berechtigungen und Ausführungseinstellungen entspricht den Sicherheitsbest Practices und bietet eine zusätzliche Verteidigungsebene.

Prüfung:

  • Überprüfen Sie, ob beschreibbare Verzeichnisse (z. B. Upload-Verzeichnisse) so konfiguriert sind, dass die PHP-Ausführung verhindert wird.

Behebung:

  • Konfigurieren Sie Ihren Webserver (Apache oder Nginx), um die PHP-Ausführung in Verzeichnissen mit Schreibberechtigungen wie dem Verzeichnis /wp-content/uploads zu deaktivieren.

Konfigurationsschritte

  1. Dateien in Upload-Verzeichnissen zum Herunterladen einstellen
    • Für Apache:
      root@kitploit:~
      <Location "/wp-content/uploads">
          SetHandler application/octet-stream
      </Location>
      
    • Für Nginx:
      root@kitploit:~
      location /wp-content/uploads {
          default_type application/octet-stream;
      }
      
  2. PHP-Ausführung in Upload-Verzeichnissen deaktivieren
    • Für Apache:
      root@kitploit:~
      <Location "/wp-content/uploads">
          php_flag engine off
          # or alternatively
          php_value engine 0
      </Location>
      
       <Location "/wp-content/uploads">
           <FilesMatch "\.php$">
               SetHandler none
               Require all denied
           </FilesMatch>
       </Location>
       
       <Directory "/var/www/html/yourwordpress/wp-content/uploads">
           # Disable PHP execution
           <FilesMatch "\.php$">
               SetHandler none
               Require all denied
           </FilesMatch>
       </Directory>
      
    • Für Nginx:
      root@kitploit:~
      location /wp-content/uploads {
          location ~ \.php$ {
              fastcgi_pass off;
          }
      }
      
       location /wp-content/uploads {
           location ~ \.php$ {
               deny all;
           }
       }
      

Diese Konfigurationen stellen sicher, dass selbst wenn eine PHP-Datei in das Verzeichnis /wp-content/uploads hochgeladen wird, sie nicht ausgeführt werden kann, wodurch potenzielle Angriffe verhindert werden.

Erklärung der Konfigurationsanweisungen

  1. SetHandler application/octet-stream:

    • Erzwingt, dass Dateien als binäre Streams behandelt werden, was Downloads statt Ausführung auslöst.
  2. php_flag engine off / php_value engine 0:

    • Deaktiviert die PHP-Engine für das angegebene Verzeichnis und verhindert die Ausführung von PHP-Skripten.
  3. SetHandler none:

    • Entfernt den Handler für passende Dateien und stellt sicher, dass sie nicht als PHP verarbeitet werden.

Hinweis:

  • Die obigen Einstellungen beeinflussen die Anzeige von Bilddateien nicht.
  • Zum Beispiel ist eine Bilddatei im Verzeichnis /wp-content/uploads weiterhin zugänglich und wird mit einem -Tag korrekt angezeigt:``` Example Image
root@kitploit:~
Durch die Anwendung dieser Konfigurationen schützen Sie das Upload-Verzeichnis erheblich vor potenziellen Schwachstellen bei der Skriptausführung.


### 8.9. Sicherstellen, dass der Webserver nur auf Domain-basierte Host-Header antwortet
Um Ihren Webserver zu sichern, ist es wichtig, sicherzustellen, dass er nur auf Anfragen antwortet, die an Ihren Domainnamen gerichtet sind, und nicht auf Anfragen, die direkt an die IP-Adresse des Servers gestellt werden.

Dies kann durch eine ordnungsgemäße Konfiguration der VirtualHost-Direktiven erreicht werden.

In den meisten Fällen werden Webdienste über einen Domainnamen wie `https://yourwordpress.com` aufgerufen. Der Webserver empfängt diese Anfrage und liefert den entsprechenden Inhalt aus. Um dieses Verhalten zu erzwingen, müssen wir den Webserver so konfigurieren, dass er nur auf Anfragen mit dem korrekten Host-Header antwortet.

**Potenzielle Sicherheitsrisiken der IP-basierten Zugriffserlaubnis**
1. Dienstaufzählung:
   - Angreifer können IP-Adressen nutzen, um laufende Dienste auf dem Server zu enumerieren, was das Risiko erhöht, Schwachstellen zu entdecken und auszunutzen.
2. Offenlegung sensibler Informationen:
   - Fehlkonfigurierte Server könnten bei IP-basiertem Zugriff Verzeichnisse, Dateien oder andere sensible Informationen preisgeben, die nicht öffentlich zugänglich sein sollten.
3. Umgehung von Sicherheitskontrollen:
   - Der IP-basierte Zugriff könnte Sicherheitsmaßnahmen umgehen, die nur für den domainbasierten Zugriff gelten, was möglicherweise zu unbefugtem Zugriff führt.

**Prüfung:**
- Stellen Sie sicher, dass der Webserver so konfiguriert ist, dass er nur auf domainbasierte Anfragen antwortet und nicht auf direkten IP-Adresszugriff.

**Behebung:**
- Konfigurieren Sie den Webserver so, dass er Anfragen nur basierend auf der angegebenen Domain bearbeitet und andere Anfragen entsprechend ablehnt oder umleitet.

**Konfigurationsschritte**
1. Standard-VirtualHost-Konfiguration
   - Erstellen Sie einen Standard-VirtualHost, der alle nicht spezifizierten Anfragen abfängt und einen 403 Forbidden zurückgibt oder sie umleitet.

       **Für Apache:**
       ```
        <VirtualHost _default_:80>
            DocumentRoot /var/www/html/yourwordpress
            ...
            <Location />
                Require all denied
            </Location>
    
        <VirtualHost _default_:443>
            DocumentRoot /var/www/html/yourwordpress
            ...
            SSLEngine on
            SSLCertificateFile /path/to/ssl/certificate.crt;
            SSLCertificateKeyFile /path/to/ssl/private.key;
            ...
            <Location />
                Require all denied
            </Location>
        </VirtualHost>     
       ```
       **Für Nginx:**
       ```
       server {
           listen 80 default_server;
           return 403;
       }
    
       server {
           listen 443 ssl default_server;
           ...
           ssl_certificate /path/to/ssl/certificate.crt;
           ssl_certificate_key /path/to/ssl/private.key;
           ...
           return 403;
       }
       ```

2. Domainbasierte VirtualHost-Konfiguration
   - Stellen Sie sicher, dass ein VirtualHost für Ihre Domain konfiguriert ist.
   
    **Für Apache:**
    ```
    <VirtualHost *:80>
        ServerName yourwordpress.com
        ...
        Redirect permanent / https://yourwordpress.com/
    </VirtualHost> 
   
    <VirtualHost *:443>
        ServerName yourwordpress.com
        DocumentRoot /var/www/html/yourwordpress
        ...
        SSLEngine on
        SSLCertificateFile /etc/httpd/to/ssl/certificate.crt;
        SSLCertificateKeyFile /etc/httpd/to/ssl/private.key;
        ...
    </VirtualHost>    
    ```
    **Für Nginx:**
    ```
    server {
        listen       443 ssl;
        server_name  yourwordpress.com;
        root         /var/www/html/wordpress;
        ...
        ssl_certificate /path/to/ssl/certificate.crt;
        ssl_certificate_key /path/to/ssl/private.key;
        ... 
    ```

3. Testen
   - Hier wird die Erstellung des Standard-VirtualHost und des domainbasierten VirtualHost für `yourwordpress.com` gezeigt.
   - Nach der Erstellung des Standard-VirtualHost und des domainbasierten VirtualHost für `yourwordpress.com` wird der Zugriff für nicht domainbasierte Anfragen (https://ip) verweigert (403-Fehler), was zu einem 403-Fehlerbildschirm führt.
  

    ```
     $ curl -i -k http(s)://10.10.66.88
       
     HTTP/1.1 403 Forbidden
     Server: nginx
     Date: Mon, 03 Jun 2024 23:23:13 GMT
     Content-Type: text/html
     Content-Length: 162
     Connection: keep-alive
        
     <html>
     <head><title>403 Forbidden</title></head>
     <body bgcolor="white">
     <center><h1>403 Forbidden</h1></center>
     <hr><center>nginx</center>
     </body>
     </html>
    
       
     $ curl -i -k https://yourwordpress.com
     HTTP/1.1 200 OK
     Server: nginx
     Date: Mon, 03 Jun 2024 23:32:12 GMT
     Content-Type: text/html; charset=utf-8
     Content-Length: 9
     Connection: keep-alive
        
     Hello, yourwordpress.com
    ```

   - Falls eine Kommunikation zwischen Servern oder innerhalb desselben IP-Subnetzes erforderlich ist, können Sie den Standard-VirtualHost so konfigurieren, dass er Zugriff von bestimmten IP-Adressen erlaubt.

Durch die Implementierung dieser Konfigurationen antwortet der Webserver nur auf Anfragen, die an Ihre Domain gerichtet sind.


### 8.10. Abgeschlossene Webserver-Konfiguration
Hier ist ein Beispiel für eine abgeschlossene Webserver-Konfiguration, die die Sicherheitsrichtlinien enthält. Passen Sie diese Konfiguration entsprechend Ihrer WordPress-Webserver-Umgebung an und verwenden Sie sie.

1. Apache
    ```
    <VirtualHost _default_:80>
        DocumentRoot /var/www/html/yourwordpress
   
        ErrorLog /var/log/httpd/http.ip.error.log
        CustomLog /var/log/httpd/http.ip.access.log combined
   
        <Location />
            Require all denied
        </Location>

    <VirtualHost _default_:443>
        DocumentRoot /var/www/html/current/public
   
        ErrorLog /var/log/httpd/https.ip.error.log
        CustomLog /var/log/httpd/https.ip.access.log combined
   
        # SSL Configuration
        SSLEngine on
        SSLCertificateFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.crt
        SSLCertificateKeyFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.key
        SSLSessionTimeout 1d
        SSLSessionCache shared:MozSSL:10m
        SSLSessionTickets off
    
        SSLProtocol TLSv1.2 TLSv1.3
        SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
        SSLHonorCipherOrder off
   
        <Location />
            Require all denied
        </Location>
    </VirtualHost>    
   
    <VirtualHost *:80>
        ServerName yourwordpress.com
        Redirect permanent / https://yourwordpress.com/
    </VirtualHost> 
    
    <VirtualHost *:443>
        ServerName yourwordpress.com
        Protocols h2 http/1.1
        DocumentRoot /var/www/html/current/public
   
        ErrorLog /var/log/httpd/https.yourwordpress.com.error.log
        CustomLog /var/log/httpd/https.yourwordpress.com.access.log combined
    
        # SSL Configuration
        SSLEngine on
        SSLCertificateFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.crt
        SSLCertificateKeyFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.key
        SSLSessionTimeout 1d
        SSLSessionCache shared:MozSSL:10m
        SSLSessionTickets off
    
        SSLProtocol TLSv1.2 TLSv1.3
        SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
        SSLHonorCipherOrder off
    
        <Directory /var/www/html/current/public>
            Options -Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

        # Deny PHP execution in uploads directory
        <Directory "/var/www/html/current/public/wp-content/uploads">
            <FilesMatch "\.php$">
                SetHandler none
                Require all denied
            </FilesMatch>
        </Directory>
   
        # PHP Serving 
        ProxyPassMatch ^/(?!wp-content/uploads/.*\.php$)(.*\.php(/.*)?)$ unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost/var/www/html/current/public
        #ProxyPassMatch ^/(?!wp-content/uploads/.*\.php$)(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/current/public
    
        # Favicon
        <Location "/favicon.ico">
            ErrorDocument 404 "Not Found"
            SetEnvIf Request_URI "^/favicon\.ico$" no_log
        </Location>
    
        # Robots.txt
        <Location "/robots.txt">
            Require all granted
            SetEnvIf Request_URI "^/robots\.txt$" no_log
        </Location>
    
        # Restrict access to wp-cron.php
        <Files "wp-cron.php">
            Require all denied
            Require ip 127.0.0.1
        </Files>
    
        # Restrict access to wp-json
        <Location "/wp-json/">
            Require all denied
            Require ip 127.0.0.1 
            Require ip 10.10.77.49
            Require ip 10.10.71.20
        </Location>
    
        # Restrict access to wp-admin
        <Location "/wp-admin">
            Require all denied
            Require ip 10.10.77.49
            Require ip 10.10.71.20
        </Location>
    
        <Files "wp-login.php">
            Require all denied
            Require ip 10.10.77.49
            Require ip 10.10.71.20
        </Files>
    
        # Deny access to hidden files
        <FilesMatch "^\.">
            Require all denied
        </FilesMatch>
    </VirtualHost>
    ```
2. Nginx
    ```
    server {
        listen       80 default_server;
        listen       443 default_server ssl http2;
    
        error_log    /var/log/nginx/http.ip.error.log;
        access_log   /var/log/nginx/http.ip.access.log  main;
    
        ssl_certificate /etc/nginx/conf.d/cert/yourwordpress.com_ssl.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/yourwordpress.com_ssl.key;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
        ssl_session_tickets off;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
        ssl_prefer_server_ciphers off;
    
        location / {
             deny all;
        }
    }
    
    server {
        listen       443 ssl http2;
        server_name  yourwordpress.com;
        root         /var/www/html/wordpress;
    
        error_log    /var/log/nginx/https.yourwordpress.com.error.log;
        access_log   /var/log/nginx/https.yourwordpress.com.access.log  main;
    
        ssl_certificate /etc/nginx/conf.d/cert/yourwordpress.com_ssl.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/yourwordpress.com_ssl.key;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
        ssl_session_tickets off;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
        ssl_prefer_server_ciphers off;
    
    
        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
    
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        # Restrict to access Wordpress Cron
        location = /wp-cron.php {
            allow 127.0.0.1;
            deny all;
            access_log off;
            log_not_found off;
        }
    
       # Restrict to access json rest-api
       location ~ ^/wp-json/ {
            allow 127.0.0.1;    		# Allow localhost
            allow 10.10.77.49;		    # Allow myip
            allow 10.10.71.20;       # Allow myip
            deny all;
            access_log off;
            log_not_found off;
        }

        # Restrict to access Wordpress Admin
        location = /wp-admin {
            allow 10.10.77.49;		    # Allow myip
            allow 10.10.71.20;       # Allow myip
            deny all;
        }
        
        location ~* \wp-login.php {
            allow 10.10.77.49;		    # Allow myip
            allow 10.10.71.20;       # Allow myip
            deny all;
        }
    
        # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
        # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
        location ~ /\. {
            deny all;
        }
    
        # Deny access to any files with a .php extension in the uploads directory
        location /wp-content/uploads {  
            location ~ \.php$ {
                deny all;
            }
        }
        # Other example
        # location ~* /(?:uploads|files)/.*\.php$ {
        # 		deny all;
        # }
    
        # Rewrite rules, sends everything through index.php and keeps the appended query string intact
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        # Serving PHP
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\\.php)(/.+)$;
            # fastcgi_pass   127.0.0.1:9000; 					 # With php-cgi (or other tcp sockets):
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;   # With php-fpm (or other unix sockets):
            fastcgi_index index.php;
            include /etc/nginx/fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires max;
            log_not_found off;
        }
    
    }
    ```


## 9. Sicherstellen von WordPress-Sicherheitsupdates
WordPress behebt Sicherheitslücken, indem es neue Versionsupdates veröffentlicht, sobald Schwachstellen entdeckt werden.

Wenn beispielsweise eine Sicherheitslücke in WordPress 6.5.2 gefunden wird, wird sie in Version 6.5.3 behoben und verteilt.

Da Sicherheitsupdates nicht version-by-version verwaltet werden, sind regelmäßige Versionsupdates erforderlich, um Sicherheitslücken zu beheben.

Informationen zu Updates finden Sie in den offiziellen WordPress-Release-Informationen: [WordPress Releases](https://wordpress.org/download/releases/)

**Behebung:**
- Aktualisieren Sie WordPress regelmäßig.
- WordPress verwaltet Updates (einschließlich Sicherheitsupdates) nicht version-by-version.
- Stand 20. Mai 2024 ist nur Version 6.5 im Wartungsmodus.

**Hinweis:**
- Beta-, Nightly-Builds und andere Subversion-Checkouts werden nicht unterstützt.
- Vermeiden Sie die Verwendung von Fork-Produkten oder Versionen, die keine offiziellen WordPress-Veröffentlichungen sind.
- Dokumentation für unterstützte Versionen: [Supported Versions](https://wordpress.org/documentation/article/supported-versions/) 


## 10. Regelmäßige Überprüfung auf Sicherheitslücken für WordPress sicherstellen

WordPress ist eine Content-Management-System (CMS)-Software. 
Da es sich um eine Paketsoftware handelt, treten Sicherheitslücken hauptsächlich in seinen Komponenten (Kern-Dateien, Plugins, Themes usw.) auf.

Im Gegensatz zu individuell entwickelten Webanwendungen, die auf spezifische Anforderungen zugeschnitten sind, müssen Sicherheitslücken mit Methoden identifiziert und behoben werden, die für WordPress geeignet sind.

Wenn eine mit WordPress erstellte Website nicht umfangreich angepasst wurde und den Charakter von WordPress beibehält, können Sicherheitslücken einfach mit WPScan überprüft werden.

WPScan ist teilweise kostenpflichtig, aber die grundlegende kostenlose Stufe hat keine funktionalen Einschränkungen. Es ermöglicht regelmäßige Überprüfungen und Reaktionen auf WordPress-Sicherheitslücken.

**Behebung:**
- Führen Sie regelmäßige Schwachstellenüberprüfungen mit WPScan (oder ähnlichen Tools, die WordPress scannen können) durch.
- Wenn Schwachstellen gefunden werden, überprüfen und führen Sie die erforderlichen Maßnahmen durch, um sie zu beseitigen. In den meisten Fällen wird dies durch Updates gelöst.
- Siehe die [WPScan-Benutzerdokumentation](https://github.com/wpscanteam/wpscan/wiki/WPScan-User-Documentation).
- Weitere Informationen zu häufigen Schwachstellen in WordPress: [Extending WordPress Common Security Vulnerabilities](https://learn.wordpress.org/tutorial/extending-wordpress-common-security-vulnerabilities/)

**WPScan:**```
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.22
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[+] URL: https://yourwordpress.com/ [192.168.10.100]
[+] Started: Fri May 24 14:39:06 2024

Interesting Finding(s):

[+] Headers
..
...
 |  - content-security-policy: upgrade-insecure-requests
 | Found By: Headers (Passive Detection)
 | Confidence: 100%

..
...
[+] XML-RPC seems to be enabled: https://yourwordpress.com/xmlrpc.php
 | Found By: Link Tag (Passive Detection)
 | Confidence: 30%
 | References:
 |  - http://codex.wordpress.org/XML-RPC_Pingback_API
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner/
 |  - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos/
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login/
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access/

..
...

[+] Finished: Fri May 24 14:39:48 2024
[+] Requests Done: 187
[+] Cached Requests: 7
[+] Data Sent: 56.32 KB
[+] Data Received: 605.595 KB
[+] Memory used: 276.602 MB
[+] Elapsed time: 00:00:42

Weiterlesen

  • Squid-Proxy mit Sicherheitsbest Practices einrichten
Tool herunterladen
Nr.RolleBeschreibungVerwaltungspersonal
1AdministratorHat vollen Zugriff auf alle WordPress-Funktionen und kann alle Inhalte der Website verwalten.Systemadministratoren
2EditorKann Beiträge anderer Benutzer verwalten und veröffentlichen sowie Inhalte bearbeiten und veröffentlichen.Betriebliche Dienstleister, Interne Content-Ersteller
3AutorKann eigene Beiträge schreiben und veröffentlichen und hat die Berechtigung, eigene Beiträge zu bearbeiten.Interne Content-Ersteller
4MitwirkenderKann Inhalte schreiben, aber nicht veröffentlichen. Beiträge werden von einem Administrator überprüft und veröffentlicht.Interne Content-Ersteller
5AbonnentKann sich auf der Website anmelden und ihr persönliches Profil verwalten, aber keine Inhalte schreiben oder bearbeiten.Interne Content-Ersteller