Funktioniert diese .htaccess-Sicherheitseinstellung wirklich?

7

Was macht dieser .htaccess?

Habe ich Recht, wenn ich denke, dass alles, was es tut, automatische Brute-Force-Angriffe verhindert?

Um auf die Datei wp-login.php zuzugreifen, müssen Sie die URL der Domain manuell eingeben, damit alle Bots, die nach wp-login.php suchen, negiert werden

Hab ich recht?

Hier ist die .htaccess-Regel:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^https://(.*)?my-domain.com [NC]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteRule ^(.*)$ - [F]
</IfModule>
Henry
quelle

Antworten:

9

Es scheint POST-Anfragen an wp-login.php zu verhindern, die nicht von einer Seite auf my-domain.com stammen.

Wenn der Browser eine POST-Anfrage sendet, beispielsweise nach dem Absenden eines Formulars, enthält er einen HTTP-Referrer-Header, der dem Server mitteilt, woher die Anfrage stammt.

Dies verhindert theoretisch, dass Bots POST-Anfragen im Rahmen eines Brute-Force-Angriffs direkt an wp-login.php senden, aber der HTTP-Referrer ist trivial zu fälschen, daher ist er eigentlich gar nicht so hilfreich.

Jacob Peattie
quelle
6

Was dies nicht verhindert: Brute Force

Alles, was es tut, ist automatische Brute-Force-Angriffe zu verhindern?

Nein, dies verhindert keine Brute-Force-Angriffe.

Bei einem Brute-Force-Angriff hat ein Angreifer die Kontrolle über alle Parameter der HTTP-Anforderung. Dies schließt den Referer ein. Da der Angreifer beliebige Verweise senden kann, werden Brute-Force-Angriffe nicht verhindert. (Fast) alle Brute-Force-Tools ermöglichen die Einstellung eines Referers, und die Einstellung der Site selbst als Referer ist ziemlich Standard.

Mechanismen, die vor roher Gewalt schützen, sind das Verbot oder Drosseln auf IP- oder Benutzername-Basis sowie Captchas.

Was dies verhindern könnte: CSRF

Dieser Code wurde möglicherweise eingerückt, um allen POST-Anforderungen im Administratorbereich eine Verweisprüfung hinzuzufügen. Wenn der Referer nicht gültig ist, wird die Anfrage abgelehnt.

Bei einem CSRF-Angriff zwingt ein Angreifer ein Opfer, eine POST-Anforderung zum Ändern des Status auszuführen. Dies kann beispielsweise durch das Posten von HTML- und Javascript-Code auf attacker.com geschehen, der dann automatisch eine Anfrage an opfer.com sendet, sobald ein authentifiziertes Opfer die Website besucht.

Referer Checks sind ein Mechanismus zum Schutz vor CSRF. Da nur Opfer.com als gültiger Verweis akzeptiert wird, kann ein Angreifer das Opfer nicht zwingen, eine Anfrage von seiner eigenen Domain zu senden.

Natürlich hat WordPress einen eigenen CSRF-Schutz (über Anti-CSRF-Nonces). Möglicherweise werden jedoch nicht alle Fälle erfasst, und die Sicherheit von Plugins hängt stark vom Plugin-Entwickler ab.

Eine zusätzliche Referer-Prüfung kann dazu beitragen, zu verhindern, dass CSRF-Schwachstellen im WP-Kern und insbesondere in Plugins ausgenutzt werden können.

Wenn dies beabsichtigt war, ist der Code natürlich fehlerhaft. Das $In RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$verhindert die Prüfung für die meisten Anfragen.

Die Prüfung kann auch leicht umgangen werden. Die folgenden Referenten würden akzeptiert:

Referer: http://example.com.org
Referer: http://not-example.com
Referer: http://notexample.com
Referer: http://attacker.com/example.com
[...]

Um die Sicherheit der Site zu erhöhen, müssten diese beiden Probleme zuerst behoben werden. Der Code könnte auch weiter verbessert werden, indem er nicht auf POST-Anforderungen beschränkt ist (in schlecht geschriebenen Anwendungen können GET-Anforderungen auch den Serverstatus ändern oder POST-Anforderungen können in GET-Anforderungen umgewandelt werden). Da die Prüfung nur für Administratoren gilt, sollte dies die Benutzerfreundlichkeit nicht einschränken.

tim
quelle
4

Sie sind teilweise richtig

Ihr oben Code hilft schützt Ihre Wordpress - Website nur um Login - Anfragen erlaubt , die direkt aus Ihrer Domain kommen.

Die meisten Brute-Force-Angriffe senden POST-Anforderungen direkt an Ihr Skript wp-login.php. Wenn Sie also eine POST-Anfrage benötigen, um Ihre Domain als Referrer zu haben, können Sie diese Bots stoppen.

Wenn Sie eine statische IP-Adresse haben, können Sie mit dem folgenden Code noch einen Schritt weiter gehen:

RewriteEngine on 
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR}!^111\.111\.111\.111$
RewriteRule ^(.*)$ - [R=403,L]

* Ersetzen Sie durch Ihre statische IP-Adresse.

* Funktioniert möglicherweise nicht, wenn sich Ihre Site hinter einem DNS-Dienst wie CloudFlare befindet.

Invariante Veränderung
quelle