WordPress unter Druck. Schützen Sie durch Ihre eigenen Hände

36

WordPress – eine bequeme Plattform für die Veröffentlichung von Artikeln und Verwaltung, die auf einer Vielzahl verschiedener Websites basiert. Aufgrund seiner Verbreitung war dieses CMS lange Zeit ein Leckerbissen für Hacker.

Leider bieten die Grundeinstellungen keinen ausreichenden Schutz, so dass viele Kreditlöcher offen bleiben. In diesem Artikel gehen wir eine typische „Modell”-Hacking-Site auf WordPress durch und zeigen, wie identifizierte Schwachstellen behoben werden können.

Heute ist das Content-Management-System WordPress das beliebteste. Ihr Anteil beträgt 60,4 % der Gesamtzahl der Websites, die CMS-Engines verwenden. Davon basieren laut Statistik 67,3 % der Seiten auf der neusten Version der Software. Inzwischen wurden in den zwölf Jahren der Web-Engine 242 Schwachstellen unterschiedlicher Art gefunden (ohne Schwachstellen, die in Plug-Ins und Themes von Drittanbietern gefunden wurden). Eine Add-On-Statistik von Drittanbietern ist noch trauriger. So führte das Unternehmen eine Analyse in 2350 Revisi-Russified-Templates für WordPress durch, die aus verschiedenen Quellen stammen. Als Ergebnis fanden sie heraus, dass mehr als die Hälfte (54 %) von infizierten Web Shells, Backdoors, Blackhat-SEO-Links („Spam”) und Skripts kritische Sicherheitslücken enthielten. Also lehn dich zurück, Jetzt werden wir verstehen, wie man ein Audit auf der WordPress-Site durchführt und die gefundenen Mängel beseitigt. Verwendung wird Version 4 sein.

Indexierungsseite

Der erste Schritt bei jedem Test besteht normalerweise darin, Informationen über das Ziel zu sammeln. Und dann hilft sehr oft eine Fehlkonfiguration Indexing-Site, die es unbefugten Benutzern ermöglicht, die Inhalte bestimmter Bereiche der Site einzusehen und beispielsweise Informationen über installierte Plug-Ins und Themes sowie Zugriff auf vertrauliche Daten oder Backups von Datenbanken zu erhalten. Um zu prüfen, welche Verzeichnisse von außen sichtbar sind, nutzt Google am einfachsten die Vorteile. Es reicht aus, eine Abfrage vom Typ Google Dorks auszuführen site: example.com intitle: «index of» inurl: / wp-content /. Der Operator inurl: Sie können folgende Verzeichnisse angeben:

/wp-content/
/wp-content/languages/plugins
/wp-content/languages/themes
/wp-content/plugins/
/wp-content/themes/
/wp-content/uploads/

Wenn Sie den /wp-content/plugins/ anzeigen können, wird das Sammeln von Informationen über installierte Plug-ins und deren Versionen im nächsten Schritt erheblich vereinfacht. Natürlich können Sie die Indizierung über die Datei robots.txt verhindern. Daher ist es standardmäßig nicht im Installationspaket von WordPress enthalten, es ist notwendig, es zu erstellen und sich in das Stammverzeichnis der Website zu werfen. Anleitungen zum Erstellen und Arbeiten mit der robots.txt-Datei sind ziemlich viele, also lassen Sie dieses Thema für sich. Um nur eine der möglichen Optionen zu nennen:

User-Agent: *
Disallow: /cgi-bin
Disallow: /wp-login.php
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/
Disallow: /wp-content/plugins/
Disallow: /wp-content/themes/
Disallow: /?author=*
Allow: /

Wenn es sich bei den in einem Ordner gespeicherten Dateien um vertrauliche Informationen handelt, fügen Sie diese Listenzeile hinzu: Disallow: /wp-content/uploads/. Andererseits wird die robots.txt-Datei nicht empfohlen, um Links zu Verzeichnissen zu platzieren, die speziell für die Speicherung sensibler Informationen erstellt wurden. Ansonsten erleichtert man dem Angreifer damit die Arbeit, denn das ist die erste Stelle, an der normalerweise alle auf der Suche nach „Yammy” suchen.

Sicherheits-Plugins für WordPress
.htaccess verbinden

Um den Zugriff auf vertrauliche Informationen einzuschränken, ist es besser, die Datei .htaccess zu verwenden – es ist eine Konfigurationsdatei, die von Apache Web Server verwendet wird. Betrachten Sie die Möglichkeit der Datei vom Standpunkt der Sicherheit. Damit können Sie: den Zugriff auf Verzeichnisse und Dateien verweigern, verschiedene SQL-Injektionen und schädliche Skripte sperren. Für diese Standard-.htaccess-Datei für CMS WordPress 4.1 müssen Sie etwas erweitern. Um die Liste der Dateien und Ordner zu schließen, fügen Sie Folgendes hinzu:

Options +FollowSymLinks -Indexes
 
RewriteCond %{QUERY_STRING} base64_encode[^(]*([^)]*) [OR]

Blockreferenzen, die die Codierung Base64 enthalten. Entfernen Sie Links, die das Tag enthalten <script>:

RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]

Um Skripten entgegenzuwirken, die versuchen, globale Variablen zu setzen oder _REQUESTVariablen per URL zu ändern:

RewriteCond %{QUERY_STRING} GLOBALS (=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST (=|[|%[0-9A-Z]{0,2})

Um SQL-Injection-Blockierungsanforderungen an die URL entgegenzuwirken, die bestimmte Schlüsselwörter enthalten:

RewriteCond %{query_string} concat.*( [NC,OR]
RewriteCond %{query_string} union.*select.*( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]

Um das Leben gängiger Hacking-Tools zu verderben, filtern Sie bestimmte User-Agents:

SetEnvIf user-agent «Indy Library» stayout=1
SetEnvIf user-agent «libwww-perl» stayout=1
SetEnvIf user-agent «Wget» stayout=1
deny from env=stayout
Schützt Dateien

Es wäre schön, den Zugriff auf kritische Dateien zu beschränken, die die Konfiguration speichern oder einem Angreifer nur einige Informationen geben können. Sie können folgende Kandidaten auswählen:

  • Wp-config.php, enthält einen Datenbanknamen, einen Benutzernamen, ein Passwort und ein Tabellenpräfix;
  • .htaccess;
  • Readme.html und ru_RU.po, die eine Version von WordPress enthalten;
  • Install.php.

Dies geschieht wie folgt:

<Files file_name>
Order Allow,Deny
Deny from all
</Files>

Die Datei .htaccess, die diese Zeilen enthält, sollte sich im selben Verzeichnis befinden, in dem die Datei geschützt ist. Erlauben Sie dann keine Auflistung von Benutzern (erinnern Sie sich, dass wir etwas weiter oben darüber gesprochen haben, wie einfach es ist, eine Liste von Benutzern zu erhalten?):

RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]

Also, was sonst? Sie können den Zugang nur von bestimmten IP-Adressen erlauben. Erstellen Sie dazu in Ihrem wp-admin eine .htaccess-Datei mit folgenden Regeln:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Access Control"
AuthType Basic
order deny,allow
deny from all
allow from 178.178.178.178  # IP Home computer
allow from 248.248.248.248  # IP Work computer

Das Verfahren ist nicht sehr flexibel und nur anwendbar, wenn Sie mit einer begrenzten Anzahl fester IP-Adressen arbeiten. Andernfalls wird empfohlen, ein Passwort für den Ordner wp-admin panel über das Hosting festzulegen (falls diese Funktionalität vorhanden ist).

WWW

Eine Reihe von Regeln 5G Blacklist und 6G Blacklist Beta von Perishable Press, mit denen Sie mit weit verbreiteten böswilligen URL-Anfragen für WordPress umgehen können.

Zusätzliche Maßnahmen

Neben dem oben Gesagten können die folgenden Empfehlungen hinzugefügt werden. Verwenden Sie zunächst nur die neuesten Versionen von WordPress und seinen Komponenten – dadurch werden bekannte Schwachstellen beseitigt. Zweitens entfernen Sie die Plugins und Themen, die auch proekspluatirovat sein können. Laden Sie drittens die WordPress-Designs und -Plugins aus zuverlässigen Quellen herunter, wie z. B. den Websites von Entwicklern und der offiziellen Website von WordPress. Neben dem Heim-PC müssen Sie regelmäßig Ihre Webressource Web Antivirus überprüfen, z. B. AI-Bolit. Wenn Sie Zugriff auf den Webserver haben, stimmen die Zugriffsrechte auf Dateien und Verzeichnisse überein. Typischerweise setzt WordPress in der Installationsphase volle Rechte, bei Bedarf kann chmod aber auch manuell gesetzt werden. Für Verzeichnis – chmod 755 für Dateien – chmod 644. Stellen Sie sicher, dass die Rechte von 777 nur denjenigen Einrichtungen zugewiesen werden, die sie benötigen (manchmal ist es für den normalen Betrieb einiger Plug-Ins erforderlich). Wenn WordPress nicht mehr normal funktioniert, experimentieren Sie mit den Zugriffsrechten: Versuchen Sie zuerst 755, dann 766 und schließlich 777. Damit alle htaccess-Dateien verfügbar sind, chmod 444 (nur lesen). Wenn die Site nicht mehr funktioniert, versuchen Sie, mit Werten von 400, 440, 444, 600, 640, 644 zu experimentieren.

Verschieben Sie die Datei wp-config.php. Diese Datei enthält Informationen zu den Einstellungen, MySQL, dem Tabellenpräfix, geheimen Schlüsseln und mehr. Daher ist es notwendig, die Datei zu übertragen, die nicht aus dem Internet verfügbar war. Wenn sich die Seite nicht im Ordner public_html befindet, dann ziehe die Datei wp-config.php in die Ordnerebene darüber, und WordPress findet sie automatisch im Stammverzeichnis (gilt, wenn es nur eine Hosting-Seite dieses CMS gibt).

Um die Casting-Shell zu verkomplizieren, deaktivieren Sie die Möglichkeit, Threads in der WordPress-Konsole zu bearbeiten. Fügen Sie dazu in der Datei wp-config.php folgende Zeile ein:

define ('DISALLOW_FILE_EDIT', true) ;

Eine weitere Schwachstelle – die Datei install.php (im Ordner wp-admin). Daher ist es besser, sie zu entfernen, zu blockieren oder zu ändern. Führen Sie einen der folgenden Schritte aus:

  1. Löschen Sie diese Datei einfach – nach der Installation wird sie nicht mehr benötigt.
  2. Verweigern Sie den Zugriff auf die Datei über .htaccess.
  3. Benennen Sie die Originaldatei install.php um (z. B. install.php.old) und erstellen Sie eine neue Datei install.php mit folgendem Inhalt:
<?php header("HTTP/1.1 503 Service Temporarily Unavailable"); ?>
<?php header("Status 503 Service Temporarily Unavailable"); ?>
<?php header("Retry-After 3600"); // 60 minutes ?>
<?php mail("[email protected]", "Database Error", "There is a problem with teh database!"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en"xmlns="http://www.w3.org/1999/xhtml"lang="en">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=utf-8" />
<title>Error Establishing Database Connection</title>
</head>
<body>
<h1>Error Establishing Database Connection</h1>
<p>We are currently experiencing database issues. Please check back shortly. Thank you.</p>
</body>
</html>

Neben der Benachrichtigung der Besucher der Website führt dieses Skript Folgendes aus:

  • sendet dem Kunden und den Suchmaschinen den Statuscode 503 („Dienst nicht verfügbar”);
  • Gibt das Zeitintervall an, in dem Kunden und die Suchmaschinen auf die Website zurückkehren können (einstellbarer Parameter);
  • Benachrichtigen Sie per E-Mail über ein Problem mit der Datenbank, um entsprechende Maßnahmen zu ergreifen.

Die Tatsache, dass in früheren WordPress-Versionen (<= 2.7.1) mit Fehlern MySQL (z. B. DDoS-Attacke) CMS neu installiert werden kann. Außerdem kann es vorkommen, dass einer der WordPress-Tabellen gestört/beschädigt wird. Insbesondere ist der Angriff bei beschädigten Tabellen ks29so_options (in WordPress 2.6.2) oder ks29so_users (in WordPress 2.0.3 und 2.0.11) möglich. Das heißt, in verschiedenen Versionen von WP verschiedene Tabellen bei der Hauptprüfung im Installer – es kann entweder die Tabelle ks29so_options oder ks29so_users sein.

Trennen Sie abschließend die Registrierung neuer Benutzer, falls dies nicht erforderlich ist. Wenn Sie jedoch eine Online-Registrierung vorsehen, achten Sie darauf, dass neue Benutzer nach der Registrierung minimale Privilegien erhalten.

Nützliche Links
Schließen

WordPress – ein ziemlich großes und komplexes Produkt mit seinen Vor- und Nachteilen. Leider ist die Sicherheit in der Standardkonfiguration fraglich, da selbst in Gegenwart normaler skriptkidis gerade Hand und Internet den Schutz durchbrechen können. Daher empfehlen wir dringend, die Ressource auf die gleiche Weise wie im Artikel zu überprüfen. Und wenn Sie Fehler finden, beheben Sie diese, um die Wahrscheinlichkeit zu verringern, dass ein Angreifer eine Ressource kompromittiert.

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen