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í (13.6.2018 - 14.6.2018, Praha).

Jakub Vrána, Výuka, 22.9.2006, diskuse: 6 (nové: 0)

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=123456

HTTP/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.

ikona dgx:

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?

ikona dgx:

Jaké další ještě znáš? (které by mohly následovat po znacích konce řádku)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.