
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.
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.
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:
Behebung:
Hinweis:
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:
Behebung:
Hinweis:
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:
Mit einem Webbrowser

Mit curl
(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
**Behebung:**
- Wenn die Benutzerregistrierung aktiviert ist, deaktivieren Sie sie.
- Deaktivieren Sie die Option „Jeder kann sich registrieren“

## 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:
Plugin "Disable REST API" installieren und aktivieren:
IP-Zugriffsbeschränkung für die JSON-REST-API:
<Location "/wp-json">
Require ip 10.10.77.49 # Replace with your IP address
</Location>
location ~ ^/wp-json/ {
allow 10.10.77.49; # Replace with your allowed IP address
deny all;
}
Ä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:
Denial-of-Service-Angriffe über Pingback:
Wenn XML-RPC aktiviert ist, kann es immer noch für solche Angriffe ausgenutzt werden.
Prüfung:
(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.
**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:
Schritte zum Deaktivieren von WP-Cron:
/* That’s all, stop editing! Happy publishing. */define('DISABLE_WP_CRON', true);# 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>
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":
/* That’s all, stop editing! Happy publishing. */define( 'ALTERNATE_WP_CRON', true );# 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>
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
Beispiel: Verwendung von System-Cron (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
*/10 * * * * cd /var/www/example.com/htdocs; wp cron event run --due-now > /dev/null 2>&1
**Ü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


## 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.

- 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:**
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:
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;
}
WooCommerce definiert und prüft ebenfalls direkt in seinem Upload-Handling-Code die erlaubten Dateierweiterungen.
Beispielcode für WooCommerce:
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
<?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:
application/x-php ist.Beispiel: PHP-Web-Shell-Code```
"; system($_GET['cmd']); echo ""; } ?>**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
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:
Für Apache:
# 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
Für Nginx:
# 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:
Für Apache:
# vim /etc/httpd/httpd.conf
..
...
User www-data
Group www-data
..
...
Für Nginx:
# vim /etc/nginx/nginx.conf
..
...
user daemon;
Hinweis:
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:
Isolation von Prozessen:
Prinzip der geringsten Privilegien:
Prüfung:
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
**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.```
php-fpm❌999:999:PHP-FPM:/run/php:/usr/sbin/nologin
**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
**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
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.
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?
Web-Shell-Angriffe abschwächen:
Angriffsfläche reduzieren:
Einhaltung von Sicherheitsbest Practices:
Prüfung:
Behebung:
/wp-content/uploads zu deaktivieren.Konfigurationsschritte
<Location "/wp-content/uploads">
SetHandler application/octet-stream
</Location>
location /wp-content/uploads {
default_type application/octet-stream;
}
<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>
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
SetHandler application/octet-stream:
php_flag engine off / php_value engine 0:
SetHandler none:
Hinweis:
/wp-content/uploads weiterhin zugänglich und wird mit einem -Tag korrekt angezeigt:```
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
| Nr. | Rolle | Beschreibung | Verwaltungspersonal |
|---|
| 1 | Administrator | Hat vollen Zugriff auf alle WordPress-Funktionen und kann alle Inhalte der Website verwalten. | Systemadministratoren |
| 2 | Editor | Kann Beiträge anderer Benutzer verwalten und veröffentlichen sowie Inhalte bearbeiten und veröffentlichen. | Betriebliche Dienstleister, Interne Content-Ersteller |
| 3 | Autor | Kann eigene Beiträge schreiben und veröffentlichen und hat die Berechtigung, eigene Beiträge zu bearbeiten. | Interne Content-Ersteller |
| 4 | Mitwirkender | Kann Inhalte schreiben, aber nicht veröffentlichen. Beiträge werden von einem Administrator überprüft und veröffentlicht. | Interne Content-Ersteller |
| 5 | Abonnent | Kann sich auf der Website anmelden und ihr persönliches Profil verwalten, aber keine Inhalte schreiben oder bearbeiten. | Interne Content-Ersteller |