Na navigaci | Klávesové zkratky

Jak penetrují mladí chlapci?

Mladí chlapci se musejí vymezovat proti autoritám. Mají to v popisu práce. V diskusi neváhají nedostatek zkušeností nahradit sebejistotou a drzostí. Fakt hloupé to začíná být ve chvíli, kdy vlastně jen nahrazují.

Marian Koubala alias Emco se poměrně ostře pustil do Jakuba Vrány pod článkem o bezpečnostním auditu serveru Na volné noze. Na věci je pikantní, že Marian Koubala je Jakubův konkurent, neboť provozuje službu komerčně nabízející bezpečnostní audity webových aplikací.

Obdivuju Jakuba, s jakou trpělivostí se nechal penetrovat mladistvým script kiddie, já bych ho asi smazal hned v zárodku. Jakub je v tomto směru až hyperkorektní a jsem přesvědčen, že si tak poškozuje své jméno. Když totiž diskusi přečte neodborník, nemusí mu být úplně zřejmé, kdo je tady vlastně za diletanta. Čtenář potřebuje vodítko a proto vznikl tento článek.

Takže vězte: Marian Koubala alias Emco je úplně mimo. Patří do sorty tzv. „bezpečnostních odborníků“, kteří tohoto sice hodně načetli, jenže při čtení vůbec nepřemýšleli. Vědí o spoustě útoků, ale nemají páru o technickém pozadí a neví, jak jim skutečně čelit. Na argumenty nejsou schopni reagovat jinak, než odkazováním na (dle jejich názoru) autoritativní zdroje, tedy v tom lepším případě, v tom horším se uchylují k osobním útokům. Dokážou však udělat výborný první dojem a ohromit množstvím znalostí. Že jsou jejich rady kontraproduktivní, se nemusí hned zjistit.

Emco script

Ale zpět k diskusi. Emco upozorňuje na útok upload null byte, který prý souvisí s nastavením direktivy magic_quotes_gpc a prý znemožňuje kontrolu nahraného obrázku na základě jeho přípony. Diskuse poté kráčí ve výše popsaných šlépějích, takže o upload null byte útoku nebo direktivě magic_quotes_gpc se od něj nedozvíme vůbec nic, zato se dočteme, že Jakub je blázen, stahovačný (sic!), líný hlupák a tak vůbec ;)

V jedné chvíli však Emco neprozřetelně utrousí moudra a podělí se o kus PHP kódu. Ten by měl demostrovat zmíněný null byte útok, vtipné však je, že prakticky na každém řádku je nějaká chyba. Od méně závažných po naprosto fatální bezpečnostní díru:

if (strtolower(substr($HTTP_POST_FILES['obrazek']['name'], -4, 4)) == ".jpg") {
	$path= "upload/".urldecode($HTTP_POST_FILES['obrazek']['name']);
	if($ufile != none) {
		if(move_uploaded_file($HTTP_POST_FILES['obrazek']['tmp_name'], $path))
			echo "Obrazek byl uspesne nahran na server";
		else
			echo "Obrazek se nepodarilo nahrat na server";
	}
} else
	echo "Neplatny format obrazku";

Jen bodově:

  • pole $HTTP_POST_FILES bylo zavrženo už v roce 2001, jeho použití mě docela překvapilo
  • neověřuje existenci prvku $HTTP_POST_FILES['obrazek']['name'] a může tak generovat neošetřené E_NOTICE
  • neověřuje, že prvek $HTTP_POST_FILES['obrazek']['name'] je řetězec a může tak generovat neošetřené E_NOTICE (viz <input type="file" name="obrazek[]">)
  • urldecode() nemá v kódu co dělat. Pokud budete uploadovat soubor nazvaný třeba 70%absinth.jpg, na straně serveru byste dostali 70«sinth.jpg
  • urldecode() je místo, kde se zcela uměle vytváří díra „upload null byte“
  • podmínka if($ufile != none) pracuje s nedefinovanou proměnnou $ufile a nedefinovanou konstantou none
  • kód neřeší situaci, kdy $ufile == none, ať už je tím myšleno cokoliv
  • ke složce upload přistupuje relativně, takže se může chovat velmi nepředvídatelně
  • ale hlavně: dovoluje přepsat jakýkoliv jpg na webovém serveru, tedy i mimo adresář pro upload! (např. %2e%2e%2fobr.jpg)
  • kvůli uměle vytvořené „upload null byte“ díře dovoluje přepsat jakýkoliv soubor na webu (např. .htaccess%00.jpg)

Všechny tři řádky obsahující konstrukci echo se zdají být bez problému. Gratulujeme!

Na závěr bych Marianovi vzkázal jeho vlastní slova: chtel bych videt hlupaky, co ti za to tvoje bezpecnostni skoleni plati bezmala 5 000,– Kc. venuj se dal php a neprodavej lidem falesny pocit bezpeci v podobe amaterskych bezpecnostnich auditu… A firmám, které uvádí ve svých referencích doporučuji, aby si nechaly udělat audit také jinde.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.