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řeba70%absinth.jpg
, na straně serveru byste dostali70«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 konstantounone
- 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.