HTTP response splitting
HTTP response splitting je v informatice druh zranitelnosti webové aplikace spočívající v nesprávné kontrole vstupů od uživatele. Cílem útočníka je předat webové aplikaci takové vstupy, aby došlo k rozdělení původní odpovědi serveru na více odpovědí, které může následně využít k vykonání dalších útoků (např. Cross-User Defacement, Cache poisoning, Cross-site scripting či Page Hijacking).
Popis zranitelnosti
editovatZranitelnost spočívá v tom, že útočník vkládá do webové aplikace společně se vstupem také neočekávaný řetězec. Předpokládejme, že cílová aplikace nefiltruje ze vstupů znaky CR a LF. Pomocí těchto znaků útočník manipulovat s odpovědí a dává mu tak fakticky nástroj k ovlivnění zbytku nejen hlavičky a těla zprávy, ale také k vytvoření dalších odpovědí zcela pod jeho kontrolou. Je však důležité dodržet strukturu http odpovědi. Tedy dodržet prázdné řádky (znaky CR a LF zakódované jako %0d%0a
), kterými je oddělena hlavička od těla. A dále také mezery zakódované jako %20
. Požadavky na aplikaci k úspěšnému provedení útoku jsou dva:
- musí docházet k přesměrování zdrojů
- aplikace nesmí filtrovat ze vstupu znaky CR a LF
Příklad zranitelné aplikace
editovatV tomto příkladu programátor aplikace chce přesměrovat uživatele na stránku podle hodnoty vstupní proměnné strana. Ta může být nastavena například pomocí kliknutí na odkaz, čímž se zavolá redirect.php?strana=neco.php
.
Při tomto volání dojde k vygenerování dvou odpovědí. První je odpověď se stavovým kódem 302 Moved Temporarily a
druhá již má obsah stránky foobar.php
a stavový kód 200 OK.
<?php
header ("Location: " . $_GET['strana']);
?>
Analýza webové aplikace
editovatPředpokladem je, že aplikace přebírá jeden vstupní parametr a přesměrovává požadavek na jiný zdroj.
- Nastavení proxy serveru, např. WebScarab od organizace OWASP, na zachytávání požadavků i odpovědí. Případně lze využít plugin pro úpravu dat přenášených protokolem HTTP (např. Tamper Data), avšak v tomto případě nelze zachytávat i odpovědi.
- Odeslání nějaké hodnoty. V proxy lze zjistit, že je odeslán požadavek, aplikace zdroj přesměruje (http stavový kód 302) a nakonec přichází odpověď (http stavový kód 200).
- Pokud je jako parametr odeslán
foobar%0d%0a
(cílová platforma je Microsoft Windows), tak server vrátí též dvě odpovědi. První se stavovým kódem 302 Moved Moved Temporarily (předpoklad) a druhou se stavovým kódem 200 OK, která obsahuje dokument.
Nedochází tedy k žádné změně oproti validnímu požadavku a s nejvyšší pravděpodobností nejsou v aplikaci mechanismy k filtrování vstupů. Pokud cílová aplikace běží na operačních systémech na bázi Unixu, tak je nutné nahradit znaky %0d%0a
za znak %0a
.
Obrana
editovatAby byla webová aplikace zabezpečena před útoky postavenými na HTTP Response Splitting je nutné ze všech uživatelských vstupů filtrovat znaky CR, LF a to v různých formách kódování před tím, než jsou použity při jakémkoliv generování hlaviček.
Související články
editovatExterní odkazy
editovat- http://deadlytechnology.com/web-development/http-attack/ Archivováno 21. 11. 2010 na Wayback Machine. – HTTP Cache Poisoning on Deadly Technology (anglicky)
- http://www.owasp.org/index.php/HTTP_Response_Splitting] – HTTP Response Splitting na OWASP (anglicky)
- http://www.owasp.org/index.php/Cache_Poisoning – Cache Poisoning na OWASP (anglicky)
- http://yehg.net/lab/pr0js/training/webgoat.php – Řešení lekcí WebGoat (anglicky)