HowTo Guides

HTTP Methoden deaktivieren

Damit ein Browser mit einem Webserver kommunizieren kann, stellt der Webdienst HTTP Methoden zur Verfügung. Zu den gebräuchlichsten in modernen Web-Anwendungen gehören GET, POST, PATCH und DELETE. Das HTTP Protokoll kennt eine Reihe weiterer Methoden (verbs), welche seltener gebraucht werden, jedoch für Angreifer nützlich sind. Diese sollten daher deaktiviert werden.

Konfiguration

So deaktivieren Sie HTTP Methoden unter Apache und nginx.

Hintergrund

Ein Webserver kann folgende HTTP Methoden bereit stellen:

  • GET - mit dieser Methode werden vom Client Ressourcen unter einer definierten URL vom Webserver angefordert.
  • POST - sendet Daten vom Client an den Server. Die Daten befinden sich im body des Requests.
  • HEAD - der Server sendet dem Client den gleichen Header wie bei einem GET Request, jedoch ohne den Body (Inhalt) mit zu senden.
  • PUT - erlaubt dem Client eine Ressource an eine URI hoch zu laden.
  • PATCH - Partieller Update einer Ressource.
  • DELETE - löscht eine Ressource auf dem Server.
  • TRACE - der Server liefert eine Client Anfrage so zurück, wie er sie erhalten hat. Dies kann hilfreich sein beim Debugging.
  • OPTIONS - liefert eine Liste mit allen vom Server unterstützten Methoden zurück. Wird oft auch für Preflight Requests verwendet und sollte aktiviert bleiben.
  • CONNECT - wird von HTTP Proxies unterstützt, um einen Tunnel aufzubauen.

Die obige Liste ist nicht abschliessend. Nicht verwendete Methoden werden bei der Systemhärtung deaktiviert, um die Angriffsfläche zu reduzieren.

Weiter kann es Sinn machen, die Grösse von Requests zu limitieren, um grössere Datenmengen für bestimmte Angriffe zu verhindern.

Das Unterbinden der TRACE Methode verhindert, dass ein Angreifer via Webserver die lokale Topologie ausspionieren könnte.

Um nun einen Server manuell auf die zur Verfügung gestellten Methoden zu testen, kann zum Beispiel netcat verwendet werden:

echo -e "OPTIONS / HTTP/1.0\n" | nc example.com 80
HTTP/1.1 200 OK
Date: Sun, 28 Apr 2013 08:32:16 GMT
Server: Zope/(Zope 2.10.12-final, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.5
DAV: 1,2
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK
Cache-control: private
Content-Length: 0
X-Varnish: 1049029877
Age: 0
Via: 1.1 varnish
Set-Cookie: serverid=p0102; path=/
Connection: close
Content-Type: text/plain; charset=UTF-8

Und um verifizieren zu können, dass eine HTTP Methode vom Webserver aufgrund der (korrekten) Konfiguration abgelehnt wird, sollte eine Ausgabe von netcat ungefähr so aussehen:

echo -e "OPTIONS / HTTP/1.0\n" | nc google.com 80
HTTP/1.0 405 Method Not Allowed Content-Type: text/html; charset=UTF-8 Content-Length...