NFsec Logo

Dlaczego należy unikać Multiviews i mod_negotiation w serwerze Apache?

30/01/2011 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 302, ilość słów: 587)

O

pcja Multiviews w serwerze Apache jest ustawiana dla każdego katalogu z osobna. Oznacza to, że może zostać ustawiona za pomocą dyrektywy Options wewnątrz takich sekcji jak <Directory>, <Location> oraz <Files> w plikach konfiguracyjnych serwera (i hostów wirtualnych) lub w plikach .htaccess (jeśli AllowOverride zostało poprawnie ustawione). Warto mieć na uwadze, że ustawienie Options All, nie aktywuje opcji Multiviews; należy wywołać ją z osobna.

Za co odpowiedzialna jest ta opcja? Na przykład: Jeśli w serwerze Apache jest włączony moduł negotiation i aktywna opcja MultiViews dla katalogu /var/www, a serwer otrzyma żądanie dla obiektu /var/www/foo, który rzeczywiście nie istnieje – serwer rozpocznie przeszukiwanie katalogu /var/www w celu znalezienia plików według wzoru foo.*. Po wyszukaniu odpowiednich wzorców – ich typ (.php, .gif, .html itd.) zostanie sztucznie zamapowany z zachowaniem tych samych typów mediów i treści kodowania, jakby miało to miejsce w przypadku bezpośredniego ich wywołania (np. /var/www/foo.png). Następnie zostanie wybrana treść najlepiej pasująca do “wymagań” jakie zostały przesłane przez klienta zgłaszającego żądanie do serwera WWW.

Jakie jest najlepsze dopasowanie treści do wymagań klienta według serwera Apache? Zależy to od kilku nagłówków Accept* (dokładniej: Accept, Accept-Language oraz Accept-Encoding) w żądaniu HTTP klienta. Załóżmy, że dla katalogu /var/www jest włączona opcja Multiviews, a pracujący nad aplikacją PHP programiści przed wprowadzeniem ulepszeń zapisują kopie plików xxx.php, jako xxx.bak. W tym samym czasie na nasz serwer trafia atakujący, który przeprowadza rekonesans poprzez wysłanie żądania o obiekt “index” bez żadnego rozszerzenia:

GET /index HTTP/1.1
Host: www.nfsec.pl
Accept: */*

Serwer odpowiada następującym nagłówkiem:

HTTP/1.1 200 OK
Date: Sun, 30 Jan 2011 10:57:29 GMT
Server: Apache
Content-Location: index.php
Vary: negotiate,Accept-Encoding
TCN: choice
Content-Length: 57022
Content-Type: text/html; charset=utf-8
[...]
Skompilowana zawartość index.php

Dla atakującego jest to informacja, że zarówno moduł negotiation, jak i opcja MultiViews jest aktywna dla głównego katalogu strony. Postanawia więc przekonać się, czy nie istnieją inne wersje pliku security.php, którego nazwę zauważył przy sprawdzaniu poprawności formularzy:

telnet www.nfsec.pl 80
Trying 12.23.34.56...
Connected to nfsec.pl.
Escape character is '^]'.
GET /security HTTP/1.1
Host: www.nfsec.pl
Accept: application/fuzzer; q=1.0

HTTP/1.1 406 Not Acceptable
Date: Sun, 30 Jan 2011 19:43:17 GMT
Server: Apache
Alternates: {"security.old" 1 {type application/x-trash} {length 1076}},
{"security.php" 1 {type application/x-httpd-php}}
Vary: negotiate,accept,Accept-Encoding
TCN: list
Content-Length: 446
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /security could not be found on
this server.</p>
Available variants:
<ul>
<li><a href="security.old">security.old</a> , type application/x-trash</li>
<li><a href="security.php">security.php , type application/x-httpd-php</li>
</ul>
</body></html>
Connection closed by foreign host.

Jak widzimy – serwer dla atakującego był na tyle uprzejmy, że wypisał wszystkie dostępne rozszerzenia tego pliku. Ostatnią czynnością jest po prostu wywołanie pliku security.old w adresie URL w celu jego pobrania i przejrzenia czystego kodu źródłowego lub – ze względu na to, że litera “b” jest wcześniej w alfabecie od litery “p” – wywołać poprzednią metodę, aby serwer sam wylistował nam zawartość pliku:

telnet www.nfsec.pl 80
Trying 12.23.34.56...
Connected to nfsec.pl.
Escape character is '^]'
GET /security HTTP/1.1
Host: www.nfsec.pl
Accept: */*

HTTP/1.1 200 OK
Date: Sun, 30 Jan 2011 19:56:56 GMT
Server: Apache
Content-Location: security.old
Vary: negotiate,accept
TCN: choice
Last-Modified: Wed, 05 Jan 2011 20:29:29 GMT
Accept-Ranges: bytes
Content-Length: 1076
Content-Type: application/x-trash

<?php
Tutaj kod źródłowy
?>
Connection closed by foreign host.

Pocieszający jest fakt, że metoda ta działa jedynie na rozszerzeniach zdefiniowanych w pliku /etc/mime.types (Internet media type). Oznacza to, że jeśli w katalogu znajduje się plik o nazwie security.xyx – nie zostanie on uwzględniony przez serwer Apache. Wówczas atakujący musi wykonać atak bruteforce w celu odgadnięcia możliwości innych rozszerzeń. Tyczy się to również nierozłączalności opcji MultiViews oraz modułu negotiation. W przypadku braku aktywności modułu lub opcji – zwracany jest kod 302 Found kierujący do dokumentu z kodem 404.

Więcej informacji: Multiviews Apache, mod_negotiation metasploit, Grudge match

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.