Häufiger Fehler: Unsicherer htaccess-Schutz



Um Verzeichnisse vor unbefugtem Zugriff zu schützen, nutzen Webmaster häufig HTTP-Authentifizierungen.

Bei einem Apache Server wird dazu eine Datei mit dem Namen .htaccess verwendet. Diese beinhaltet unter anderem den Pfad zur Passwortdatei namens .htpasswd, welche den Benutzernamen sowie das verschlüsselte Passwort (DES oder MD5) enthält.

Solche Authentifizierungen gelten allgemein als sicher, solange ein sicheres Passwort gewählt wurde, um Brute-Force oder Dictionary-Attacken zu verhindern.

Einige Webmaster machen jedoch einen gravierenden Fehler, der es Angreifern ermöglicht, solche Authentifizierungen ohne großen Aufwand zu umgehen.

Vorsicht bei der Verwendung der <Limit>-Direktive

Mit der Direktive <Limit> wird in einer htaccess-Datei angegeben, über welche HTTP-Methode die Dateien bzw. Seiten im angegebenen Verzeichnis geschützt werden sollen.

Wird ein geschütztes Verzeichnis über den Browser aufgerufen, sendet der Browser ein GET-Request an den Webserver. Ist in der <Limit>-Direktive GET als HTTP-Methode angegeben, wird der Zugriff verweigert und man wird zur Eingabe der Logindaten aufgefordert. Manchmal soll auch das Absenden von Formularen nur bestimmten Usern vorbehalten werden – in solchen Fällen würde hier POST als HTTP-Methode angegeben werden.

Häufig wird in der <Limit>-Direktive nur GET oder GET und POST angegeben. Was passiert aber, wenn Dateien im geschützten Verzeichnis mit einer anderen HTTP-Methode aufgerufen werden?

Folgende HTTP-Methoden sind im RFC 2616 (HTTP 1.1) spezifiziert:

Die HTTP-Methode OPTIONS liefert je nach Serverkonfiguration eine Liste von Methoden, die vom Server unterstützt werden. HTTP-Methoden in HTTP-Requests kann man mit diversen Browser-Addons ändern oder per Telnet bzw. SSH-Verbindung selbst festlegen.

In dem folgenden Beispiel wird das Firefox-Addon Live HTTP Headers verwendet, um die HTTP-Methode zu ändern.

HTTP-Methoden

Angreifer können diese Methode (aus)nutzen, um mit einer anderen HTTP-Methode auf Dateien in einem htaccess-geschützten Verzeichnis zuzugreifen, wenn dieses nur für GET- oder POST-Requests geschützt ist.

Proof-Of-Concept

Hier nun ein Praxisbeispiel.

Das zu schützende Verzeichnis „secret“ befindet sich in diesem Beispiel unter /home/www/secret/

In diesem Verzeichnis liegen sensible Dateien: Eine geheime Textdatei „geheim.txt“, welche Passwörter enthält und eine PHP-Datei „backup.php“, mit der ein vollständiges Datenbank-Backup heruntergeladen werden kann. Und natürlich die htaccess-Dateien zur Authentifizierung:

.htaccess

AuthType Basic
AuthName "No Access"
AuthUserFile /home/www/secret/.htpasswd
<Limit GET>
require valid-user
</Limit>

.htpasswd

Admin:eI0E7d3r2XVWU

Ruft man das Verzeichnis „secret“ per URL im Browser auf, wird man aufgefordert die Logindaten einzugeben.

Da in der <Limit>-Direktive nur GET angegeben wurde, können Angreifer die Authentifizierung umgehen, indem sie die HTTP-Methode beispielsweise in POST ändern.

Im folgenden Beispiel wird die Datei „secret.txt“ per POST-Methode aufgerufen. Der Inhalt der Datei wird vom Server bei einem POST-Request freundlicherweise zurückgeliefert.

htaccess Bypass via POST-Methode

Würde man das gleiche nun mit der „backup.php“ machen, könnte ein vollständiges Backup der Datenbank heruntergeladen werden.

In diesem Beispiel wurde das Verzeichnis „secret“ nur für den Zugriff per GET-Methode geschützt. Durch Änderung der HTTP-Methode in POST konnte somit die Authentifizierung umgangen werden. Falls Verzeichnisse für GET- und POST-Requests geschützt werden, könnten Angreifer beispielsweise die HTTP-Methode HEAD verwenden. Bei einem HEAD-Request werden zwar Datei-Inhalte nicht direkt zurückgegeben, aber Dateien können immer noch aufgerufen und ausgeführt werden. Das könnte unter anderem CSRF-Angriffe ermöglichen.

Gegenmaßnahmen

Der beste Schutz gegen diese Sicherheitslücke ist ganz einfach: Die <Limit>-Direktive nicht verwenden.

Falls man doch mal, aus welchen Gründen auch immer, ein Zugriff über eine bestimmte HTTP-Methode zulassen will, sollte man zu der <LimitExcept>-Direktive zurückgreifen. Hier wird für jede HTTP-Methode der Zugriff verweigert, außer für die angegebene.

Diesen Beitrag weiterempfehlen: