HTTP Response Splitting
Školení, která pořádám
V souvislosti s e-maily už jsem psal o technice, kdy útočník podstrčením víceřádkové hlavičky nastaví také další hlavičky, případně i tělo zprávy. Protokol HTTP vypadá podobně – nejprve se odesílají hlavičky a po prázdném řádku samotný dokument – a dotýká se ho tedy stejný problém. Takže pokud se ve funkci header používá nedůvěryhodná hodnota získaná od uživatele, je potřeba ověřit, zda neobsahuje znak konce řádku. Jinak se vystavujeme riziku, že na naší adrese útočník zobrazí svůj vlastní dokument (využitelný třeba k phishingu) nebo uživateli nastaví cookie (což se dá zneužít pro Session Fixation).
Funkce setcookie, která v důsledku také posílá hlavičku, se tento problém částečně také týká, protože v hodnotě se znaky sice náležitě zakódují a ve jméně nejsou vůbec povolené, ale v cestě a doméně se nijak nekontrolují.
Dobrá zpráva je, že PHP od verzí 4.4.2 a 5.1.2 u obou funkcí kontroluje, zda v hlavičce znak konce řádku není, za nás.
Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací.
Diskuse
v6ak:
Nešlo by to považovat za bezpečnostní chybu PHP?
K sušenkám: jak to lze zneužít? Stylem CSRF to nepůjde, protože to prohlížeč nedovolí, a upravené hlavičky můžu poslat jen od sebe, což mi je na nic...
Martin Straka:
No dneska to Jakub vzal trochu hopem, žádné příklady:)
Příklad špatného kódu:
redirect.php
<?php
Header("Location: ".$_GET['url']);
?>
který je zamýšlen pro volání například:
redirect.php?url=
http://php.vrana.cz/což ve výsledku znamená tyto hlavičky:
HTTP/1.1 302 Found
Location:
http://php.vrana.cz/a při zneužití pro nastavení cookie:
redirect.php?url=
http://www.example.com/%0ASet-Cookie:%20PHPSESSID=123456HTTP/1.1 302 Found
Location:
http://php.vrana.cz/Set-Cookie: PHPSESSID=123456
Výsledek pokud není pro zabezpečení session podniknuto nic dalšího je v PHP session fixation. Možný scénář útoku: poslat tenhle odkaz oběti (docílit toho, že prohlížeč oběti na něj přistoupí) a pak jenom čekat, než se například přihlásí a se stejným obsahem session cookie přistoupit.
Neřekl bych, že je to příma chyba PHP, je to chyba špatně napsané PHP aplikace.
Omlouvám se, jestli tu mám nějaký překlep a nechám se překvapit, jak se to naformátuje:)
v6ak:
K sušenkám: já jsem myslel zneužití setcookie, to asi nepůjde, protože doménu stylem CSRF nepodvrhnu. BTW: Sušenky lze, myslím, nastavit komukoli, jen je nelze číst.
Znak(y) konce řádků by neměly v hlavičce vadit, pokud jsou následované mezerou nebo tabulátorem. To respektuje i kontrolní mechanismus ve funkci header().
3wl4k:
tab a medzera, alebo akykolvek whitespace znak?
Jaké další ještě znáš? (které by mohly následovat po znacích konce řádku)
Diskuse je zrušena z důvodu spamu.