Zpět na seznam článků     Číst komentáře (1)     Verze pro tisk

Apache, MultiViews a jeden bezpečnostní problém

Autor: .cCuMiNn.   
7.3.2017

Znáte to… Přijde požadavek na rychlou změnu informací na homepage Vašeho webu, a vás nenapadne nic lepšího, než provést tuto změnu přímo v produkčním prostředí. Co když se ale něco zvrtne a web pak nebude fungovat tak, jak má?


MultiViewsRaději si tedy pro jistotu vytvoříte zálohu upravované stránky, kterou pojmenujete například index.bak, protože mít možnost vrátit v případě problémů provedené změny rychle zpět je k nezaplacení. Mnoho vývojářů si řekne, že zálohy ponechá na severu pouze pár dní, a pokud nebudou žádné problémy, že je smaže. Ovšem ruku na srdce: Kdo si za pár dní na nějaké zálohy ještě vzpomene? Téměř nikdo a záložní soubory se tak na webech běžně povalují až do chvíle, než dojde k jejich zneužití. Němým svědkem této skutečnosti budiž Google, který Vám existenci záložních souborů rád prozradí, pokud se mu podařilo je zaindexovat:

https://www.google.cz/#q=filetype:bak+password

Asi není potřeba zdůrazňovat, že provádět změny přímo v produkčním prostředí a ukládat zálohy ve veřejném prostoru serveru není v žádném případě správný přístup. Vždyť každému, kdo záložní soubor na serveru odhalí a přistoupí k němu, bude zobrazen zdrojový kód, což může mít v případě souboru index.bak fatální následky. Často v něm jsou totiž uvedeny mimo jiné i přístupové údaje k databázi.

Otázkou ovšem zůstává, jak podobné záložní soubory na serveru najít. Google toho ví sice hodně, ale pokud na tyto zdroje nevedou žádné odkazy a není povolen výpis adresářů, bude na jejich odhalení i on krátký. Můžete vyzkoušet útok hrubou silou nebo pomocí slovníku, kdy budete zkoušet přistoupit k souboru index se všemi možnými i nemožnými příponami. Hrubou silou si test přípon v případě malé abecedy a čísel vyžádá 36^3 = 46 656 pokusů na jeden soubor. Lepší by tedy určitě bylo, kdyby nám server sám sdělil, zda se na něm nějaké ty záložní soubory nachází. Co říkáte?

V případě serveru IIS od Microsoftu nám existenci záložních souborů dokáže prozradit útok IIS tilde enumeration, o kterém jsme nedávno psaly ve článku Enumerace souborů s krátkým názvem na IIS. V případě nasazení webového serveru Apache se podobnou skulinou může stát MultiViews, který je dostupný prostřednictvím modulu mod_negotiation.

HTTP hlavička Accept-Language

Nejprve se ale pojďme podívat, k čemu je MultiViews dobré, a na co jej vývojáři legitimně využívají.

Představte si situaci, že budete chtít udělat vícejazyčné webové stránky tak, aby se každému návštěvníku zobrazila správná jazyková mutace na základě jím preferovaného jazyka. Pořadí těchto uživatelem preferovaných jazyků je možné snadno nastavit ve webovém prohlížeči. Ve Firefoxu se k tomuto nastavení dostanete prostřednictvím menu Nástroje / Možnosti / Obsah / Vybrat jazyky, viz screenshot

Nastavení jazykových preferencí ve Firefoxu

Takto nastavené jazykové preference se následně předávají serveru prostřednictvím HTTP request hlavičky Accept-Language, která může mít následující obsah:

Příklad použití HTTP hlavičky Accept-Language
Accept-Language: cs,en-US;q=0.7,en;q=0.3

Uvedená HTTP hlavička informuje webový server o tom, že preferujeme vrácení webové stránky v české případně americké mutaci (těmto jazykům nastavuje obsah hlavičky preferenci 0,7). Dále hlavička serveru sděluje, že v případě, kdy tyto jazykové mutace nejsou dostupné, neopovrhneme ani anglickou verzí (která má nastavenu prioritu 0,3).

Existuje množství různých postupů, jak může vývojář aplikace vyhovět tomuto uživatelskému požadavku, a vrátit mu konkrétní preferovanou verzi stránek. Jedním z těchto postupů je přitom právě MultiViews.

Jak již bylo uvedeno, MultiViews je volbou dostupnou v modulu Apache mod_negotiation, kterou můžete zapnout například následujícím nastavením v konfiguračním souboru Apache httpd.conf

Zapnutí MultiViews v httpd.conf
<Directory />
  Options FollowSymLinks MultiViews
  AllowOverride None
  Order deny,allow
  Deny from all
</Directory>

MultiViews lze ale zapnout také na úrovni adresáře direktivou Options v souboru .htaccess. V konfiguračním souboru httpd.conf musí být ovšem v takovém případě povoleno přepisování nastavení obsahem AllowOverride nastaveným na All.

Zapnutí MultiViews v souboru .htaccess
Options +MultiViews

Ve chvíli, kdy je MultiViews zapnuto, může správce ovlivnit také to, které jazyky budou podporovány, jaká bude jejich preference, nepřijde-li tento údaj od uživatele, a který jazyk bude defaultní. Obsah souboru .htaccess by pak mohl být následující:

Konfigurace jazyků v souboru .htaccess
Options +MultiViews
     
AddLanguage cs .cs
AddLanguage en .en
AddLanguage de .de
AddLanguage fr .fr
     
LanguagePriority cs en de fr
     
DefaultLanguage cs

Nyní, když je vše připraveno, může vývojář do adresáře s webovou aplikací uložit webové stránky v jednotlivých jazykových mutacích, například:

Seznam souborů s jazykovými mutacemi
index.php.cs
index.php.en
index.php.de
index.php.fr

Když následně uživatel navštíví některý z následujících odkazů, bude mu díky HTTP hlavičce Accept-Language zobrazena stránka index.php v jím preferovaném jazyce.

http://www.soom.cz/data/PoC/MultiViews/index.php
http://www.soom.cz/data/PoC/MultiViews/index
http://www.soom.cz/data/PoC/MultiViews/

Vše si můžete na uvedených odkazech rovnou vyzkoušet. Stačí měnit v nastavení prohlížeče preferovaný jazyk, nebo měnit hodnotu odesílané hlavičky Accept-Language prostřednictvím doplňku pro změnu obsahu HTTP hlaviček, jako je Modify Headers, nebo pomocí nástrojů umožňujících maniplaci s requesty. Takovým nástrojem je například Burp Suite.

Jak ale zjistíte, zda je na webovém serveru uloženo více jazykových verzí stránek, a jak se vlastně jmenuje soubor, který Vám server vrátil? Stačí, když se podíváte na HTTP response hlavičky vrácené serverem na Váš požadavek. Najdete v nich mimo jiné následující obsah, jenž prozrazuje celý originální název vráceného souboru index.php.cs a použití MultiViews.

HTTP response hlavičky
Content-Location: index.php.cs
Vary: negotiate,accept-language
TCN: choice

Testujete-li aplikaci, je vhodné zjistit mimo jiné také to, zda je MultiViews zapnuto. A to i v případě, kdy server uvedenou funkčnost pro výběr jazykových verzí vůbec nepoužívá. MultiViews totiž může být, jak posléze uvidíte, bezpečnostní slabinou. Jeho zapnutí přitom zjistíte velice snadno. Stačí, když budete znát jeden konkrétní soubor, který se nachází v testovaném adresáři. V případě našeho PoC si můžete všimnout například vloženého obrázku, který se jmenuje logo.jpg. Pokud navštívíte odkaz http://www.soom.cz/data/PoC/MultiViews/logo.jpg, bude Vám vrácen a zobrazen daný obrázek a hlavičky v odpovědi serveru budou vypadat následovně:

Běžná reakce serveru
HTTP/1.1 200 OK
Date: Mon, 06 Mar 2017 22:41:52 GMT
Server: Apache
Accept-Ranges: bytes
Content-Length: 25602
Connection: close
Content-Type: image/jpeg
Content-Language: cs
 

Vyzkoušejte nyní navštívit stejný odkaz bez uvedení přípony souboru: http://www.soom.cz/data/PoC/MultiViews/logo

Pokud by MultiViews v daném adresáři zapnuto nebylo, dostali byste pravděpodobně odpověď v podobě chybové stránky se status kódem 404. Naopak, pokud MultiViews zapnuto je, vrátí se Vám obrázek stejně, jako byste příponu v adrese explicitně uvedli. Odpověď serveru bude v tomto případě obsahovat následující hlavičky. O některých z nich již víme, že použití MultiViews bezpečně prozrazují.

Reakce serveru s použitým MultiViews
HTTP/1.1 200 OK
Date: Mon, 06 Mar 2017 22:43:32 GMT
Server: Apache
Content-Location: logo.jpg
Vary: negotiate
TCN: choice
Accept-Ranges: bytes
Content-Length: 25602
Connection: close
Content-Type: image/jpeg
Content-Language: cs
 

HTTP hlavička Accept

V případě zapnutého MultiViews se ale Apache při výběru vhodného obsahu neřídí pouze obdrženou HTTP hlavičkou Accept-Language. Zřetel bere i na obsah dalších hlaviček, mezi které patří například HTTP request hlavička Accept:

HTTP response hlavička Accept
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Podobně, jako tomu bylo v případě volby jazyka, sděluje tímto uživatel serveru, jaký je preferovaný typ souboru, o který žádá. Pokud se na serveru nachází více souborů se stejnými názvy, ale s jinými příponami, bude se server rozhodovat o vráceném souboru právě na základě preferovaného typu. Řekněme, že se na serveru nachází soubor test.php a test.jpg

http://www.soom.cz/data/PoC/MultiViews/test.php
http://www.soom.cz/data/PoC/MultiViews/test.jpg

Pokud v takovém případě navštívíte webovou stránku http://www.soom.cz/data/PoC/MultiViews/test rozhodne se server o souboru, který Vám vrátí, právě na základě Vašich preferencí uvedených v HTTP hlavičce Accept.

MultiViews a záložní soubory

No a to už jsme se oklikou pomalu dostali k samotnému jádru pudla. Pokud totiž víte, že se na serveru nachází například soubor index.php nebo test.php, proč by se na serveru nemohl vyskytovat například také soubor index.bak, index.php.bak, nebo třeba index.old? Jak jsem psal již v samotném úvodu tohoto článku, můžete existenci těchto souborů otestovat například hrubou silou. S využitím MultiViews se ale můžete serveru také přímo zeptat, čímž si ušetříte spousty času. Zkuste schválně serveru odeslat požadavek na soubor index bez uvedení přípony a hlavičkou Accept mu současně předejte informaci o tom, že akceptujete pouze neexistující MIME type xyz/xyz.

Vynucení seznamu dostupných souborů
Accept: xyz/xyz;q=0.9

Vzhledem k tomu, že se na webovém serveru žádný soubor s daným MIME typem nenachází, nabídne Vám server některý z ostatních dostupných souborů se shodným názvem, viz screenshot a zdroj vrácené odpovědi:

Reakce serveru s nabídkou alernativních souborů
HTTP/1.1 406 Not Acceptable
Date: Mon, 06 Mar 2017 22:33:16 GMT
Server: Apache
Alternates: {"index.bak" 1 {type application/x-trash} {language cs} {length 144}}, {"index.php.cs" 1 {type text/html} {language cs} {length 359}}, {"index.php.de" 1 {type text/html} {language de} {length 364}}, {"index.php.en" 1 {type text/html} {language en} {length 358}}, {"index.php.fr" 1 {type text/html} {language fr} {length 358}}
Vary: negotiate,accept,accept-language,Accept-Encoding
TCN: list
Content-Length: 825
Connection: close
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 /data/PoC/MultiViews/index could not be found on this server.</p>
Available variants:
<ul>
<li><a href="index.bak">index.bak</a> , type application/x-trash, language cs</li>
<li><a href="index.php.cs">index.php.cs</a> , type text/html, language cs</li>
<li><a href="index.php.de">index.php.de</a> , type text/html, language de</li>
<li><a href="index.php.en">index.php.en</a> , type text/html, language en</li>
<li><a href="index.php.fr">index.php.fr</a> , type text/html, language fr</li>
</ul>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

Information Leakage s využitím MultiViews

Vidíte, že jsme tímto způsobem poměrně snadno odhalili další verze souboru index, které by nám jinak mohly zůstat utajeny. Konkrétně se jedná o soubor index.bak. Pokud jste ale nabyli dojmu, že takto odhalíte skutečně všechny dostupné varianty souboru index, tedy například i soubor index.foo, který se na serveru rovněž nachází, asi Vás v tuto chvíli zklamu. Apache Vám totiž nabídne pouze ty soubory, u kterých dokáže jeho příponu přiřadit konkrétnímu MIME typu. To, které přípony Apache rozpoznává, je uvedeno mimo jiné v konfiguračním souboru /etc/mime.types. Soubory, jejichž koncovka není v tomto konfiguračním souboru uvedena, Vám Apache v dostupných variantách nenabídne, přestože se tyto na serveru ve skutečnosti opravdu nachází.


Pár poznámek závěrem

Automatická enumerace

Pro automatickou enumeraci souborů zneužitím MultiViews je k dispozici například modul mod_negotiation_brute nástroje Metasploit, nebo plugin pro bezpečnostní scanner w3af.

XSS a HTTP Response Splitting

V případě, že je MultiViews v aplikaci zapnuto a útočník má možnost uploadovat na server soubor s vhodně připraveným názvem, trpí starší verze Apache také následujícími zranitelnostmi.


1) Stránka s výčtem dostupných alternativ neošetřovala výstup názvů souborů a bylo tak možné na této stránce spustit kód Javascriptu (XSS).

Seznam postižených verzí
2.4.2, 2.4.1 2.2.22, 2.2.21, 2.2.20, 2.2.19, 2.2.18, 2.2.17, 2.2.16, 2.2.15, 2.2.14, 2.2.13, 2.2.12, 2.2.11, 2.2.10, 2.2.9, 2.2.8, 2.2.6, 2.2.5, 2.2.4, 2.2.3, 2.2.2, 2.2.0

2) Obsah hlavičky Content-Location nebyl při výstupu ošetřen na výskyt bílých znaků v názvu souboru, čímž umožňoval provedení útoků HTTP Response Splitting

Seznam postižených verzí
2.2.11, 2.2.10, 2.2.9, 2.2.8, 2.2.6, 2.2.5, 2.2.4, 2.2.3, 2.2.2, 2.2.0


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.11/18

1  2  3  4  5    
(známkování jako ve škole)