47
Webműves Kele Webműves Kele avagy mi kell a avagy mi kell a Buherátor Buherátor, , B B emen tanácsai, emen tanácsai, a PHP falába? a PHP falába? BuheraBlog BuheraBlog

Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Embed Size (px)

DESCRIPTION

Tanácsok programozóknak, és üzemeltetőknek arról, hogy hogyan ne szúrjunk ki egymással és saját magunkkal.

Citation preview

Page 1: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Webműves Kelemen tanácsai, Webműves Kelemen tanácsai,

avagy mi kell a PHP falába?avagy mi kell a PHP falába?BuherátorBuherátor, , BuheraBlogBuheraBlog

Webműves Kelemen tanácsai, Webműves Kelemen tanácsai,

avagy mi kell a PHP falába?avagy mi kell a PHP falába?BuheraBlogBuheraBlog

Page 2: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

BevezetőBevezető

•• “0% ****, 100% tapasztalat” “0% ****, 100% tapasztalat” •• …és néhány technikai finomság…és néhány technikai finomság

•• A webalkalmazások a vállalati infrastruktúra tipikus A webalkalmazások a vállalati infrastruktúra tipikus gyenge pontjaigyenge pontjaigyenge pontjaigyenge pontjai•• Egyedi alkalmazásEgyedi alkalmazás•• Nem nyúlunk hozzá, ameddig műNem nyúlunk hozzá, ameddig mű

•• A PHP remek állatorvosi lóA PHP remek állatorvosi ló•• Jól ismert, jól olvasható, egyszerűJól ismert, jól olvasható, egyszerű•• Hírhedten bugos kódok (vagy csak rossz PR?)Hírhedten bugos kódok (vagy csak rossz PR?)

“0% ****, 100% tapasztalat” “0% ****, 100% tapasztalat” ☺☺…és néhány technikai finomság…és néhány technikai finomság

A webalkalmazások a vállalati infrastruktúra tipikus A webalkalmazások a vállalati infrastruktúra tipikus

Nem nyúlunk hozzá, ameddig működikNem nyúlunk hozzá, ameddig működikA PHP remek állatorvosi lóA PHP remek állatorvosi ló

Jól ismert, jól olvasható, egyszerűJól ismert, jól olvasható, egyszerűHírhedten bugos kódok (vagy csak rossz PR?)Hírhedten bugos kódok (vagy csak rossz PR?)

Page 3: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

PHP PHP –– Miért szeretjük?Miért szeretjük?�� Könnyen tanulható, gyorsan fejleszthetőKönnyen tanulható, gyorsan fejleszthető

�� CC--like syntaxlike syntax

�� Dynamic TypingDynamic Typing

�� A Webre szántákA Webre szánták

Könnyen telepíthetőKönnyen telepíthető�� Könnyen telepíthetőKönnyen telepíthető

�� Felmásolom, megyFelmásolom, megy

�� Könnyű konfiguráció, akár futásidőKönnyű konfiguráció, akár futásidő

�� Jó platform támogatottságJó platform támogatottság

�� Jó dokumentáció, széles felhasználói bázisJó dokumentáció, széles felhasználói bázis

�� OOP (>=PHP5)OOP (>=PHP5)

�� GPL licenszGPL licensz

Miért szeretjük?Miért szeretjük?Könnyen tanulható, gyorsan fejleszthetőKönnyen tanulható, gyorsan fejleszthető

ű konfiguráció, akár futásidőbenű konfiguráció, akár futásidőben

Jó dokumentáció, széles felhasználói bázisJó dokumentáció, széles felhasználói bázis

Page 4: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

PHP PHP –– Miért nem szeretjükMiért nem szeretjük�� Lásd az előző diát :)Lásd az előző diát :)�� Kóder Pisti kedvenc nyelveKóder Pisti kedvenc nyelve�� Beépített függvényBeépített függvény--vízfejvízfej

�� Következetlen elnevezések, függvényKövetkezetlen elnevezések, függvény−− strlen(), str_split()strlen(), str_split()

�� A bőség zavaraA bőség zavara−− mysql_escape_string(), mysql_escape_string(),

mysql_real_escape_string(), addslashes() …mysql_real_escape_string(), addslashes() …�� Biztonság...?Biztonság...?

�� Y U No Unicode?Y U No Unicode?

Miért nem szeretjükMiért nem szeretjük

Kóder Pisti kedvenc nyelveKóder Pisti kedvenc nyelve

Következetlen elnevezések, függvényKövetkezetlen elnevezések, függvény--szignatúrákszignatúrák

mysql_escape_string(), mysql_escape_string(), mysql_real_escape_string(), addslashes() …mysql_real_escape_string(), addslashes() …

Page 5: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Lehet jól is csinálniLehet jól is csinálniLehet jól is csinálniLehet jól is csinálni

Page 6: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

PHP biztonság PHP biztonság

�� A webszerver korlátozott jogokkal fut, ugye?A webszerver korlátozott jogokkal fut, ugye?

�� A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?

�� URLURL--eketeket nemnem lehetlehet megnyitnimegnyitni

�� A felhasználók nem látják a hibaüzeneteket, ugye?A felhasználók nem látják a hibaüzeneteket, ugye?

PHP biztonság PHP biztonság -- óvodaóvoda

A webszerver korlátozott jogokkal fut, ugye?A webszerver korlátozott jogokkal fut, ugye?

A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?A register_globals ki van kapcsolva, ugye?

megnyitnimegnyitni, , ugyeugye??

A felhasználók nem látják a hibaüzeneteket, ugye?A felhasználók nem látják a hibaüzeneteket, ugye?

Page 7: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

A PHPA PHP--s s típushibatípushiba

•• File Include hibákFile Include hibák

•• Azonnali kódfuttatásAzonnali kódfuttatás•• Azonnali kódfuttatásAzonnali kódfuttatás

•• Helyi forrásbólHelyi forrásból

•• Távoli forrásbólTávoli forrásból

•• Egy kis emlékeztető…Egy kis emlékeztető…

típushibatípushiba

Page 8: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Local File IncludeLocal File Include

•• <?include(“files/”.$_GET[‘inc’]);?><?include(“files/”.$_GET[‘inc’]);?>

•• MitMit futtathatunkfuttathatunk??

AlkalmazásonAlkalmazáson keresztülkeresztül•• AlkalmazásonAlkalmazáson keresztülkeresztül

•• IdeiglenesIdeiglenes fájlokfájlok

•• NaplófájlokNaplófájlok (pl. PHP (pl. PHP kódkód

•• AzAz alkalmazásalkalmazás sajátsaját fájljaitfájljaitolvaolva igenigen hasznoshasznos hibaüzenetekhibaüzenetek

Local File IncludeLocal File Include

<?include(“files/”.$_GET[‘inc’]);?><?include(“files/”.$_GET[‘inc’]);?>

feltöltöttfeltöltött fájlokfájlokfeltöltöttfeltöltött fájlokfájlok

kódkód a User a User AgentbenAgentben))

fájljaitfájljait rosszrossz helyenhelyen includeinclude--hibaüzenetekhibaüzenetek kaphatóakkaphatóak

Page 9: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Remote File IncludeRemote File Include

•• <?include($_GET[‘inc’].”.php”);?><?include($_GET[‘inc’].”.php”);?>

•• allow_url_fopen=Trueallow_url_fopen=True

Mit futtathatunk?Mit futtathatunk?•• Mit futtathatunk?Mit futtathatunk?

•• Távoli webkiszolgálón elhelyezett tetszőTávoli webkiszolgálón elhelyezett tetszőkódot!kódot!

•• Legtöbbször egyben LFI is…Legtöbbször egyben LFI is…

Remote File IncludeRemote File Include

<?include($_GET[‘inc’].”.php”);?><?include($_GET[‘inc’].”.php”);?>

Távoli webkiszolgálón elhelyezett tetszőleges Távoli webkiszolgálón elhelyezett tetszőleges

Legtöbbször egyben LFI is…Legtöbbször egyben LFI is…

Page 10: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

BBasedirasedir restrictionrestriction

�� Minden fájlkezelő funkcióban ellenőMinden fájlkezelő funkcióban ellenő

�� És minden felhasznált C könyvtárban is…És minden felhasznált C könyvtárban is…

�� 5.2.9, 5.2.12, 5.3.0, 5.3.1 … mind megkerülhető5.2.9, 5.2.12, 5.3.0, 5.3.1 … mind megkerülhető

�� MOPB: „not simple safe_mode, open_basedir bypass MOPB: „not simple safe_mode, open_basedir bypass vulnerabilities”vulnerabilities”

�� TudtaTudta--e Ön, hogy 5.2.16 ill. 5.3.4 előe Ön, hogy 5.2.16 ill. 5.3.4 előcsak prefixek, nem konkrét könyvtárak voltak?csak prefixek, nem konkrét könyvtárak voltak?

�� /home/b => /home/b/ , /home/bizalmas//home/b => /home/b/ , /home/bizalmas/

restrictionrestriction

ő funkcióban ellenőrizni kellene a beállítástő funkcióban ellenőrizni kellene a beállítást

És minden felhasznált C könyvtárban is…És minden felhasznált C könyvtárban is…

5.2.9, 5.2.12, 5.3.0, 5.3.1 … mind megkerülhető5.2.9, 5.2.12, 5.3.0, 5.3.1 … mind megkerülhető

MOPB: „not simple safe_mode, open_basedir bypass MOPB: „not simple safe_mode, open_basedir bypass

e Ön, hogy 5.2.16 ill. 5.3.4 előtt az itt megadott értékek, e Ön, hogy 5.2.16 ill. 5.3.4 előtt az itt megadott értékek, csak prefixek, nem konkrét könyvtárak voltak?csak prefixek, nem konkrét könyvtárak voltak?

/home/b => /home/b/ , /home/bizalmas//home/b => /home/b/ , /home/bizalmas/

Page 11: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Safe ModeSafe Mode�� Egy próbálkozás a veszélyes függvények letiltására / Egy próbálkozás a veszélyes függvények letiltására /

korlátozásárakorlátozására

�� Minden érintett funkcióban ellenőMinden érintett funkcióban ellenő

�� Az eredmény: hamis biztonságérzetAz eredmény: hamis biztonságérzet

„safe mode is an attempt to solve the shared„safe mode is an attempt to solve the shared�� „safe mode is an attempt to solve the shared„safe mode is an attempt to solve the sharedarchitecturally incorrect to try to solve this problem at the PHP level, but architecturally incorrect to try to solve this problem at the PHP level, but since the alternatives at the web server and OS levels aren't very realistic, since the alternatives at the web server and OS levels aren't very realistic, many people, especially ISP's, use safe mode for now”many people, especially ISP's, use safe mode for now”

�� „This is a still probably incomplete and possibly incorrect listing of the „This is a still probably incomplete and possibly incorrect listing of the functions limited by safe mode. ”functions limited by safe mode. ”

�� 5.3.0 óta deprecated, 65.3.0 óta deprecated, 6--ban nincsban nincs

Egy próbálkozás a veszélyes függvények letiltására / Egy próbálkozás a veszélyes függvények letiltására /

Minden érintett funkcióban ellenőrizni kellene a beállítástMinden érintett funkcióban ellenőrizni kellene a beállítást

Az eredmény: hamis biztonságérzetAz eredmény: hamis biztonságérzet

„safe mode is an attempt to solve the shared„safe mode is an attempt to solve the shared--server security problem. It is server security problem. It is „safe mode is an attempt to solve the shared„safe mode is an attempt to solve the shared--server security problem. It is server security problem. It is architecturally incorrect to try to solve this problem at the PHP level, but architecturally incorrect to try to solve this problem at the PHP level, but since the alternatives at the web server and OS levels aren't very realistic, since the alternatives at the web server and OS levels aren't very realistic, many people, especially ISP's, use safe mode for now”many people, especially ISP's, use safe mode for now”

„This is a still probably incomplete and possibly incorrect listing of the „This is a still probably incomplete and possibly incorrect listing of the

ban nincsban nincs

Page 12: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Veszélyes függvényekVeszélyes függvények

Melyek ezek?Melyek ezek?

Veszélyes függvényekVeszélyes függvények

Melyek ezek?Melyek ezek?

Page 13: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Veszélyes függvények Veszélyes függvények ParancsfuttatásParancsfuttatás�� passthrupassthru�� execexec�� pnctl_execpnctl_exec�� proc_openproc_open�� popenpopen�� popenpopen�� systemsystem�� shell_execshell_exec�� register_shutdown_functionregister_shutdown_function�� register_tick_functionregister_tick_function�� dldl�� eevalval�� preg_replace [!]preg_replace [!]

�� ......

Veszélyes függvények Veszélyes függvények --ParancsfuttatásParancsfuttatás

�� apache_child_terminateapache_child_terminate�� chownchown�� chgrpchgrp�� linklink�� symlinksymlink�� posix_killposix_kill�� posix_killposix_kill�� posix_mkfifoposix_mkfifo�� posix_setpgidposix_setpgid�� posix_setsidposix_setsid�� posix_setuidposix_setuid�� proc_closeproc_close�� proc_get_statusproc_get_status�� proc_niceproc_nice�� proc_terminateproc_terminate�� PutenvPutenv�� TouchTouch�� ......

Page 14: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Veszélyes függvények Veszélyes függvények HálózatHálózat�� ftp_connectftp_connect�� ftp_ssl_connectftp_ssl_connect�� fsockopenfsockopen�� pfsockopenpfsockopen�� socket_bindsocket_bind�� socket_bindsocket_bind�� socket_connectsocket_connect�� socket_listensocket_listen�� socket_create_listensocket_create_listen�� socket_acceptsocket_accept�� socket_getpeernamesocket_getpeername�� socket_sendsocket_send�� ......

Veszélyes függvények Veszélyes függvények ––

Page 15: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Veszélyes függvényekVeszélyes függvények�� A listának még koránt sincs végeA listának még koránt sincs vége

�� A modulok nagy részét még nem is láttuk!A modulok nagy részét még nem is láttuk!

�� Folyamatosan bővülő gyűjtemény:Folyamatosan bővülő gyűjtemény:https://github.com/vhttps://github.com/v--pp--b/DangerousPHPFunctionsb/DangerousPHPFunctions

�� Erre írjon valaki IDS szabályt, logelemzőErre írjon valaki IDS szabályt, logelemző

�� Az eval()Az eval()--t le sem lehet tiltanit le sem lehet tiltani

�� A disable_functions legalább jól kezelhetőA disable_functions legalább jól kezelhető

�� Szintén hasznos INI paraméterek: Szintén hasznos INI paraméterek: extension_dir, enable_dlextension_dir, enable_dl

Veszélyes függvényekVeszélyes függvényekA listának még koránt sincs végeA listának még koránt sincs vége

A modulok nagy részét még nem is láttuk!A modulok nagy részét még nem is láttuk!

ő ő űjtemény:ő ő űjtemény:b/DangerousPHPFunctionsb/DangerousPHPFunctions

Erre írjon valaki IDS szabályt, logelemzőt, stb.!Erre írjon valaki IDS szabályt, logelemzőt, stb.!

t le sem lehet tiltanit le sem lehet tiltani

A disable_functions legalább jól kezelhetőA disable_functions legalább jól kezelhető

Szintén hasznos INI paraméterek: Szintén hasznos INI paraméterek:

Page 16: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájl felöltésFájl felöltés

�� Kedvencünk, tipikus gyenge pontKedvencünk, tipikus gyenge pont

�� Sok helyen előfordulSok helyen előfordul

Legalább 80% sebezhetőLegalább 80% sebezhető�� Legalább 80% sebezhetőLegalább 80% sebezhető

�� Legtöbb esetben azonnal kódot futtathatunkLegtöbb esetben azonnal kódot futtathatunk

�� Alattomos hibalehetőségekAlattomos hibalehetőségek

Kedvencünk, tipikus gyenge pontKedvencünk, tipikus gyenge pont

Legtöbb esetben azonnal kódot futtathatunkLegtöbb esetben azonnal kódot futtathatunk

őségekőségek

Page 17: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájl feltöltés Fájl feltöltés --ÖkölszabályokÖkölszabályok�� Fehérlistás szűrés kiterjesztésekreFehérlistás szűrés kiterjesztésekre

�� De: Egy JPGDe: Egy JPG--t is lehet futtatni include() hibával!t is lehet futtatni include() hibával!

�� Nevezzük át a feltöltött fájlt!Nevezzük át a feltöltött fájlt!

�� A fájlnév is tartalmazhat shell, PHP utasításokat!A fájlnév is tartalmazhat shell, PHP utasításokat!�� A fájlnév is tartalmazhat shell, PHP utasításokat!A fájlnév is tartalmazhat shell, PHP utasításokat!

�� Ha JPGHa JPG--re számítunk, legyen ez az új kiterjesztés!re számítunk, legyen ez az új kiterjesztés!

�� Ha nem muszáj, ne a webroot alá töltsünk fel!Ha nem muszáj, ne a webroot alá töltsünk fel!

�� Egy diszpécser szkript jogosultságot ellenőEgy diszpécser szkript jogosultságot ellenőtípust állíthat stb.típust állíthat stb.

�� A képeket transzformáljuk!A képeket transzformáljuk!

�� A dupla kiterjesztéseket kerüljük!A dupla kiterjesztéseket kerüljük!

ÖkölszabályokÖkölszabályokűrés kiterjesztésekreűrés kiterjesztésekre

t is lehet futtatni include() hibával!t is lehet futtatni include() hibával!

A fájlnév is tartalmazhat shell, PHP utasításokat!A fájlnév is tartalmazhat shell, PHP utasításokat!A fájlnév is tartalmazhat shell, PHP utasításokat!A fájlnév is tartalmazhat shell, PHP utasításokat!

re számítunk, legyen ez az új kiterjesztés!re számítunk, legyen ez az új kiterjesztés!

Ha nem muszáj, ne a webroot alá töltsünk fel!Ha nem muszáj, ne a webroot alá töltsünk fel!

Egy diszpécser szkript jogosultságot ellenőrizhet, MIME Egy diszpécser szkript jogosultságot ellenőrizhet, MIME

A dupla kiterjesztéseket kerüljük!A dupla kiterjesztéseket kerüljük!

Page 18: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés –– Az Apache Az Apache trükktrükk�� Fehérlistával szűrünk kiterjesztéseketFehérlistával szűrünk kiterjesztéseket

�� $allowed=array(„.avi”,”.mov”,”.qt”);$allowed=array(„.avi”,”.mov”,”.qt”);

�� if (inarray(strrchr($name,'.'),$allowed)) return ACCEPT;if (inarray(strrchr($name,'.'),$allowed)) return ACCEPT;

Feltöltök egy shell.php.qt nevűFeltöltök egy shell.php.qt nevű�� Feltöltök egy shell.php.qt nevűFeltöltök egy shell.php.qt nevű

�� A kiterjesztés megfelelőA kiterjesztés megfelelő

�� Az Apache viszont nem ismeri a .qt kiterjesztést, ezért Az Apache viszont nem ismeri a .qt kiterjesztést, ezért a következőt veszi figyelembe kiszolgáláskor!a következőt veszi figyelembe kiszolgáláskor!

�� Van egy PHP shellünk...Van egy PHP shellünk...

Az Apache Az Apache

űrünk kiterjesztéseketűrünk kiterjesztéseket

$allowed=array(„.avi”,”.mov”,”.qt”);$allowed=array(„.avi”,”.mov”,”.qt”);

if (inarray(strrchr($name,'.'),$allowed)) return ACCEPT;if (inarray(strrchr($name,'.'),$allowed)) return ACCEPT;

Feltöltök egy shell.php.qt nevű fájltFeltöltök egy shell.php.qt nevű fájltFeltöltök egy shell.php.qt nevű fájltFeltöltök egy shell.php.qt nevű fájlt

Az Apache viszont nem ismeri a .qt kiterjesztést, ezért Az Apache viszont nem ismeri a .qt kiterjesztést, ezért őt veszi figyelembe kiszolgáláskor!őt veszi figyelembe kiszolgáláskor!

Page 19: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés –– IISIISugyanezugyanez

�� <= IIS 6<= IIS 6

�� evil.asp;.jpg vagy evil.asp:.jpgevil.asp;.jpg vagy evil.asp:.jpg

�� A ; ill. : utáni részeket a kiszolgáló nem veszi A ; ill. : utáni részeket a kiszolgáló nem veszi figyelembefigyelembe

IISIIS--en en

evil.asp;.jpg vagy evil.asp:.jpgevil.asp;.jpg vagy evil.asp:.jpg

A ; ill. : utáni részeket a kiszolgáló nem veszi A ; ill. : utáni részeket a kiszolgáló nem veszi

Page 20: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- FormátumellenőFormátumellenőFormátumellenőrzésFormátumellenőrzés

Page 21: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- FormátumellenőFormátumellenőFormátumellenőrzésFormátumellenőrzés

Page 22: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

KépekKépek átméretezéseátméretezése

•• image_resize.php?widthimage_resize.php?width=100&height=100=100&height=100

•• ““ÖrömÖröm, , bódottábódottá””

•• image_resize.php?widthimage_resize.php?width=10000&height=10000=10000&height=10000

•• DoSDoS, , nemörömnemöröm

•• NemNem csakcsak a a webeswebes hibákrahibákra

•• “A “A támadásoktámadások sohasoha nemnem

átméretezéseátméretezése

=100&height=100=100&height=100

=10000&height=10000=10000&height=10000

hibákrahibákra kellkell figyelnifigyelni!!

nemnem leszneklesznek rosszabbakrosszabbak””

Page 23: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867

�� Gynvael Coldwind, 2011Gynvael Coldwind, 2011

�� Nem jellemző, de nagyon szép :)Nem jellemző, de nagyon szép :)Nem jellemző, de nagyon szép :)Nem jellemző, de nagyon szép :)

�� Feltételezzük, hogy már van egy helyi include hibaFeltételezzük, hogy már van egy helyi include hiba

�� Linuxon általában ez sem elégLinuxon általában ez sem elég

�� Nagyrészt Windows lehetőNagyrészt Windows lehető

RFC1867RFC1867

ő, de nagyon szép :)ő, de nagyon szép :)ő, de nagyon szép :)ő, de nagyon szép :)

Feltételezzük, hogy már van egy helyi include hibaFeltételezzük, hogy már van egy helyi include hiba

Linuxon általában ez sem elégLinuxon általában ez sem elég

Nagyrészt Windows lehetőségNagyrészt Windows lehetőség

Page 24: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867RFC1867RFC1867

Page 25: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867RFC1867RFC1867

Page 26: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867�� A feltöltött fájlok véletlenszerűA feltöltött fájlok véletlenszerű

ellenőrzés előttellenőrzés előtt

�� A könyvtár általában defaultA könyvtár általában default

Windowson 16Windowson 16--bit véletlen bit véletlen �� Windowson 16Windowson 16--bit véletlen bit véletlen

�� De a Windows értelmezi a wildcardokat !(!!De a Windows értelmezi a wildcardokat !(!!

�� << Tetszőleges karakterlánc<< Tetszőleges karakterlánc

�� < Tetszőleges karakter< Tetszőleges karakter

�� Első egyezés kiválasztásaElső egyezés kiválasztása

RFC1867RFC1867A feltöltött fájlok véletlenszerű nevet kapnak A feltöltött fájlok véletlenszerű nevet kapnak

A könyvtár általában defaultA könyvtár általában default

bit véletlen bit véletlen –– nem túl soknem túl sokbit véletlen bit véletlen –– nem túl soknem túl sok

De a Windows értelmezi a wildcardokat !(!!De a Windows értelmezi a wildcardokat !(!!11))

őleges karakterláncőleges karakterlánc

ő egyezés kiválasztásaő egyezés kiválasztása

Page 27: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérés

•• AzAz SQL injection SQL injection rosszrossz, , értemértem

•• UgyeUgye mindenkimindenki tudjatudja mi mi •• UgyeUgye mindenkimindenki tudjatudja mi mi

•• MySQLMySQL--hezhez van van remekremek escape escape

•• mysql_escape_stringmysql_escape_string()()

•• AzazAzaz mégsemmégsem olyanolyan jójó……

eléréselérés

értemértem??

mi mi azaz azaz SQL injection…?SQL injection…?mi mi azaz azaz SQL injection…?SQL injection…?

escape escape függvényfüggvény!!

Page 28: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérésSmugglingSmuggling•• A DBMS okosan az érvényes locale szerint próbálja A DBMS okosan az érvényes locale szerint próbálja

átalakítani a spéci karaktereketátalakítani a spéci karaktereket•• Á Á --> A, Í> A, Í-->I, Ű>I, Ű-->U …>U …A mysql_escape_string() nem veszi figyelembe az A mysql_escape_string() nem veszi figyelembe az •• A mysql_escape_string() nem veszi figyelembe az A mysql_escape_string() nem veszi figyelembe az adatbázis localeadatbázis locale--tt

•• Az PHP escape és a DBMS konverzió után újra Az PHP escape és a DBMS konverzió után újra injectionre alkalmas karakterlánc állhat előinjectionre alkalmas karakterlánc állhat elő•• http://wechall.net/challenge/addslashes/index.phphttp://wechall.net/challenge/addslashes/index.php•• Élőben még nem láttam ilyet, de …Élőben még nem láttam ilyet, de …

eléréselérés –– SQL SQL

A DBMS okosan az érvényes locale szerint próbálja A DBMS okosan az érvényes locale szerint próbálja átalakítani a spéci karaktereketátalakítani a spéci karaktereket

A mysql_escape_string() nem veszi figyelembe az A mysql_escape_string() nem veszi figyelembe az A mysql_escape_string() nem veszi figyelembe az A mysql_escape_string() nem veszi figyelembe az

Az PHP escape és a DBMS konverzió után újra Az PHP escape és a DBMS konverzió után újra injectionre alkalmas karakterlánc állhat előinjectionre alkalmas karakterlánc állhat elő

http://wechall.net/challenge/addslashes/index.phphttp://wechall.net/challenge/addslashes/index.phpőben még nem láttam ilyet, de …őben még nem láttam ilyet, de …

Page 29: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérés

Ugye senki sem karakterláncként pakolja össze a Ugye senki sem karakterláncként pakolja össze a lekérdezéseit?lekérdezéseit?

eléréselérés

Ugye senki sem karakterláncként pakolja össze a Ugye senki sem karakterláncként pakolja össze a lekérdezéseit?lekérdezéseit?

Page 30: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérés --Prepared statementsPrepared statements

•• HatékonyHatékony!!•• FeldolgozásFeldolgozás, , fordításfordítás, , tervezéstervezés

•• BiztonságosBiztonságos!!AdatAdat ésés SQL SQL elválasztvaelválasztva•• AdatAdat ésés SQL SQL elválasztvaelválasztva

•• TípusegyeztetésTípusegyeztetés•• PHPPHP--ban ban tipikusantipikusan valamilyenvalamilyen

keresztülkeresztül•• PDOPDO•• ODBCODBC•• ……

--Prepared statementsPrepared statements

tervezéstervezés, , stbstb. . csakcsak egyszeregyszer! !

valamilyenvalamilyen absztrakciósabsztrakciós rétegenrétegen

Page 31: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérés

•• Object Relational MappingObject Relational Mapping•• DB DB entitásentitás --> > ObjektumObjektum

•• A A legtöbblegtöbb keretrendszerkeretrendszer tudjatudjaSzinténSzintén biztonságosbiztonságos•• SzinténSzintén biztonságosbiztonságos•• Ha a Ha a keretrendszerbenkeretrendszerben nemnem

•• NagyonNagyon kényelmeskényelmes•• PHP PHP ésés SQL SQL elválasztvaelválasztva

•• SokszorSokszor nemnem hatékonyhatékony•• NemNem mindenminden querytqueryt lehetlehet

eléréselérés -- ORMORM

Object Relational MappingObject Relational Mapping

tudjatudja

nemnem szúrtakszúrtak el el valamitvalamit……

elválasztvaelválasztva

megfogalmaznimegfogalmazni

Page 32: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

Adatbázis Adatbázis eléréselérés

•• A “fogalmazási” problémákat sokszor a subqueryA “fogalmazási” problémákat sokszor a subqueryokozzákokozzák

•• JOINJOIN--olj okosan, subqueryolj okosan, subquery•• JOINJOIN--olj okosan, subqueryolj okosan, subqueryfeleslegesek!feleslegesek!

•• Használjunk VIEWHasználjunk VIEW--kat!kat!

•• Használjunk tárolt eljárásokat!Használjunk tárolt eljárásokat!

•• Melyekben figyelünk az SQL injectionre :PMelyekben figyelünk az SQL injectionre :P

eléréselérés -- ORMORM

A “fogalmazási” problémákat sokszor a subqueryA “fogalmazási” problémákat sokszor a subquery--k k

olj okosan, subqueryolj okosan, subquery--k általában k általában olj okosan, subqueryolj okosan, subquery--k általában k általában

Használjunk tárolt eljárásokat!Használjunk tárolt eljárásokat!

Melyekben figyelünk az SQL injectionre :PMelyekben figyelünk az SQL injectionre :P

Page 33: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

SütiSüti attributumokattributumok•• Tankönyvi XSS példa: Tankönyvi XSS példa:

<script>alert(document.cookie)</script><script>alert(document.cookie)</script>

•• HttpOnly: Kliens oldali szkriptek nem férhetnek hozzá HttpOnly: Kliens oldali szkriptek nem férhetnek hozzá a sütihez!a sütihez!a sütihez!a sütihez!

•• Böngésző feature, nem biztos, hogy mindenhol Böngésző feature, nem biztos, hogy mindenhol implementálták!implementálták!

•• Ettől a XSS még veszélyes marad!Ettől a XSS még veszélyes marad!

•• Teljes kontroll a felhasználó jogosultságaival!Teljes kontroll a felhasználó jogosultságaival!

attributumokattributumok -- HttpOnlyHttpOnly

<script>alert(document.cookie)</script><script>alert(document.cookie)</script>

HttpOnly: Kliens oldali szkriptek nem férhetnek hozzá HttpOnly: Kliens oldali szkriptek nem férhetnek hozzá

ő feature, nem biztos, hogy mindenhol ő feature, nem biztos, hogy mindenhol

ől a XSS még veszélyes marad!ől a XSS még veszélyes marad!

Teljes kontroll a felhasználó jogosultságaival!Teljes kontroll a felhasználó jogosultságaival!

Page 34: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

SütiSüti attributumokattributumok

•• PHPPHP--ban alapértelmezetten nincs beállítva a flag a ban alapértelmezetten nincs beállítva a flag a sessionsession--ökreökre

•• php.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=On

•• PHP 5.2.0PHP 5.2.0--tőltől

•• session_set_cookie_params()session_set_cookie_params()

•• Más sütiknél: setcookie() utolsó paramétereMás sütiknél: setcookie() utolsó paramétere

attributumokattributumok -- HttpOnlyHttpOnly

ban alapértelmezetten nincs beállítva a flag a ban alapértelmezetten nincs beállítva a flag a

php.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=Onphp.ini: session.cookie_httponly=On

session_set_cookie_params()session_set_cookie_params()

Más sütiknél: setcookie() utolsó paramétereMás sütiknél: setcookie() utolsó paramétere

Page 35: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

SütiSüti attributumokattributumok•• Kapkodjuk el a hálózaton röpködőKapkodjuk el a hálózaton röpködő

jelentkezzünk be velükjelentkezzünk be velük•• https://github.com/asciimoo/wholhttps://github.com/asciimoo/whol•• Firesheep (esélyes Most Overhyped Extension)Firesheep (esélyes Most Overhyped Extension)•• Firesheep (esélyes Most Overhyped Extension)Firesheep (esélyes Most Overhyped Extension)

•• Bár a kommunikáció HTTPSBár a kommunikáció HTTPSkikényszeríthető a süti titkosítatlan küldésekikényszeríthető a süti titkosítatlan küldése•• <img src=“<img src=“httphttp://bank.com/logo.png”/>://bank.com/logo.png”/>

•• Secure: A süti csak titkosított csatornán továbbítható!Secure: A süti csak titkosított csatornán továbbítható!•• Böngésző feature, nem biztos, hogy mindenhol Böngésző feature, nem biztos, hogy mindenhol

implementálták!implementálták!

attributumokattributumok -- SecureSecureKapkodjuk el a hálózaton röpködő sütiket, és Kapkodjuk el a hálózaton röpködő sütiket, és

https://github.com/asciimoo/wholhttps://github.com/asciimoo/wholFiresheep (esélyes Most Overhyped Extension)Firesheep (esélyes Most Overhyped Extension)Firesheep (esélyes Most Overhyped Extension)Firesheep (esélyes Most Overhyped Extension)

Bár a kommunikáció HTTPSBár a kommunikáció HTTPS--en zajlik, en zajlik, ő a süti titkosítatlan küldéseő a süti titkosítatlan küldése

://bank.com/logo.png”/>://bank.com/logo.png”/>Secure: A süti csak titkosított csatornán továbbítható!Secure: A süti csak titkosított csatornán továbbítható!

ő feature, nem biztos, hogy mindenhol ő feature, nem biztos, hogy mindenhol

Page 36: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

SütiSüti attributumokattributumok

•• PHPPHP--ban alapértelmezetten nincs beállítva a flag a ban alapértelmezetten nincs beállítva a flag a sessionsession--ökreökre

•• php.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=On

•• PHP 4.0.4PHP 4.0.4--tőltől

•• session_set_cookie_params()session_set_cookie_params()

•• Más sütiknél: setcookie() utolsó előMás sütiknél: setcookie() utolsó elő

attributumokattributumok -- SecureSecure

ban alapértelmezetten nincs beállítva a flag a ban alapértelmezetten nincs beállítva a flag a

php.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=Onphp.ini: session.cookie_secure=On

session_set_cookie_params()session_set_cookie_params()

Más sütiknél: setcookie() utolsó előtti paramétereMás sütiknél: setcookie() utolsó előtti paramétere

Page 37: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

CSRFCSRF•• Az XSS meg az SQLi lejárt lemezAz XSS meg az SQLi lejárt lemez

•• Mindenki ismeriMindenki ismeri

•• Mindenhol működik…Mindenhol működik…

•• A CrossA Cross--Site Request Forgery is lejárt lemez, de alig Site Request Forgery is lejárt lemez, de alig ismerikismerik

•• “Miért kellene nekem ilyesmivel foglalkoznom?”“Miért kellene nekem ilyesmivel foglalkoznom?”

•• Jogos kérdés!Jogos kérdés!

Az XSS meg az SQLi lejárt lemezAz XSS meg az SQLi lejárt lemez

Site Request Forgery is lejárt lemez, de alig Site Request Forgery is lejárt lemez, de alig

“Miért kellene nekem ilyesmivel foglalkoznom?”“Miért kellene nekem ilyesmivel foglalkoznom?”

Page 38: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

CSRFCSRF

•• Autentikáció általában sütikkelAutentikáció általában sütikkel

•• A böngésző egy sütitárat használA böngésző egy sütitárat használ

•• A felhasználó több lapon böngészikA felhasználó több lapon böngészik

•• Ha egy idegen oldalon elhelyezett form küld adatot Ha egy idegen oldalon elhelyezett form küld adatot egy másik oldalra, ahová a felhasználó be van egy másik oldalra, ahová a felhasználó be van jelentkezve, a böngésző automatikusan küldi az jelentkezve, a böngésző automatikusan küldi az érvényes sütitérvényes sütit

Autentikáció általában sütikkelAutentikáció általában sütikkel

ő egy sütitárat használő egy sütitárat használ

A felhasználó több lapon böngészikA felhasználó több lapon böngészik

Ha egy idegen oldalon elhelyezett form küld adatot Ha egy idegen oldalon elhelyezett form küld adatot egy másik oldalra, ahová a felhasználó be van egy másik oldalra, ahová a felhasználó be van

ő automatikusan küldi az ő automatikusan küldi az

Page 39: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

CSRFCSRF

Page 40: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

CSRFCSRF•• Használjunk véletlen adatokat tartalmazó mezőHasználjunk véletlen adatokat tartalmazó mező

minden formonminden formon

•• Ez a token…Ez a token…

•• ennek a felhasználónak…ennek a felhasználónak…

•• erre az űrlapra lett kiadvaerre az űrlapra lett kiadva

•• Referer validációReferer validáció

•• Az áldozat nem fogja meghamisítani a saját Az áldozat nem fogja meghamisítani a saját RefererReferer--étét

•• Ha titkosítatlan a csatorna, akkor már úgyis Ha titkosítatlan a csatorna, akkor már úgyis mindegymindegy

Használjunk véletlen adatokat tartalmazó mezőket Használjunk véletlen adatokat tartalmazó mezőket

ennek a felhasználónak…ennek a felhasználónak…

űrlapra lett kiadvaűrlapra lett kiadva

Az áldozat nem fogja meghamisítani a saját Az áldozat nem fogja meghamisítani a saját

Ha titkosítatlan a csatorna, akkor már úgyis Ha titkosítatlan a csatorna, akkor már úgyis

Page 41: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

VédelemVédelem -- WAFWAF

•• Web Application FirewallWeb Application Firewall

•• Layer7Layer7

•• Komoly helyen alapkellékKomoly helyen alapkellék

•• KiddieKiddie--k és tömeges, automatizált támadások ellen k és tömeges, automatizált támadások ellen kiválókiváló

•• Aki át akar menni rajta, az előAki át akar menni rajta, az elő

WAFWAF

k és tömeges, automatizált támadások ellen k és tömeges, automatizált támadások ellen

Aki át akar menni rajta, az előbbAki át akar menni rajta, az előbb--utóbb át fog menni.utóbb át fog menni.

Page 42: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

VédelemVédelem -- PHPIDSPHPIDS

•• include()include()--dal behúzható PHP könyvtárdal behúzható PHP könyvtár

•• Modulként elérhező több CMSModulként elérhező több CMS•• Modulként elérhező több CMSModulként elérhező több CMS

•• Impresszív szabálykészletImpresszív szabálykészlet

•• Jól karbantartottJól karbantartott

•• De hol használják? De hol használják?

PHPIDSPHPIDS

dal behúzható PHP könyvtárdal behúzható PHP könyvtár

ő több CMSő több CMS--hezhező több CMSő több CMS--hezhez

Impresszív szabálykészletImpresszív szabálykészlet

Page 43: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

VédelemVédelem -- SuhosinSuhosin•• PatchPatch

•• BoFBoF védelemvédelem•• Format String Format String védelemvédelem•• LáncoltLáncolt listáklisták, hash, hash--tábláktáblák•• FreeBSD FreeBSD realpathrealpath()()•• FreeBSD FreeBSD realpathrealpath()()•• ……

•• ExtensionExtension•• MegregulázottMegregulázott preg_replacepreg_replace•• TitkosítottTitkosított sütiksütik•• VégtelenVégtelen rekurziókrekurziók megállításamegállítása•• ……

•• És És mégmég rengetegrengeteg hasznoshasznos

SuhosinSuhosin

tábláktáblák védelmevédelme

preg_replacepreg_replace()()

megállításamegállítása

funkciófunkció

Page 44: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

VédelemVédelem –– KódKód

•• KöltséghatékonyKöltséghatékony, , testreszabhatótestreszabható

•• grepgrep ‘‘mysql_querymysql_query’’

•• grepgrep ‘SELECT’‘SELECT’•• grepgrep ‘SELECT’‘SELECT’

•• grepgrep ‘$_GET’‘$_GET’

•• grepgrep ‘‘evaleval(’(’

•• grepgrep ‘‘print_rprint_r(’(’

•• CsakCsak a a fantáziafantázia szabszab határthatárt

KódKód reviewreview

testreszabhatótestreszabható megoldásmegoldás: : grepgrep

határthatárt! ! ☺☺

Page 45: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

EmlékeztetőEmlékeztető

•• Webalkalmazás nem létezik önállóanWebalkalmazás nem létezik önállóan

•• HTTP szerverHTTP szerver

•• BöngészőBöngésző

•• DBMSDBMS

•• Távoli szolgáltatásokTávoli szolgáltatások

•• ??????

•• Egy jó fejlesztőnek ismernie kell az általa fejlesztett Egy jó fejlesztőnek ismernie kell az általa fejlesztett alkalmazás környezetét is!alkalmazás környezetét is!

•• A webes támadások általában nem technológiaA webes támadások általában nem technológia

Webalkalmazás nem létezik önállóanWebalkalmazás nem létezik önállóan

őnek ismernie kell az általa fejlesztett őnek ismernie kell az általa fejlesztett

A webes támadások általában nem technológiaA webes támadások általában nem technológia--specifikusakspecifikusak

Page 46: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

KöszönömKöszönöm a a a a figyelmetfigyelmet!!

Page 47: Webműves Kelemen tanácsai, avagy mi kell a PHP falába?

LinkekLinkek•• http://www.owasp.orghttp://www.owasp.org

•• http://www.hardenedhttp://www.hardened--php.net/php.net/

•• http://www.exploithttp://www.exploit--db.com/download_pdf/17010db.com/download_pdf/17010

•• http://www.exploithttp://www.exploit--db.com/download_pdf/15955db.com/download_pdf/15955

•• http://shiflett.org/blog/2006/jan/addslasheshttp://shiflett.org/blog/2006/jan/addslasheshttp://shiflett.org/blog/2006/jan/addslasheshttp://shiflett.org/blog/2006/jan/addslashesescapeescape--stringstring

•• http://blog.mindedsecurity.com/2009/05/httphttp://blog.mindedsecurity.com/2009/05/httppollutionpollution--newnew--webweb--attack.htmlattack.html

•• http://blog.mindedsecurity.com/2009/05/clienthttp://blog.mindedsecurity.com/2009/05/clientparameterparameter--pollution.htmlpollution.html

•• http://resources.infosecinstitute.com/findinghttp://resources.infosecinstitute.com/findingusingusing--grep/grep/

•• http://buhera.blog.huhttp://buhera.blog.hu ;);)

db.com/download_pdf/17010db.com/download_pdf/17010

db.com/download_pdf/15955db.com/download_pdf/15955

http://shiflett.org/blog/2006/jan/addslasheshttp://shiflett.org/blog/2006/jan/addslashes--versusversus--mysqlmysql--realreal--http://shiflett.org/blog/2006/jan/addslasheshttp://shiflett.org/blog/2006/jan/addslashes--versusversus--mysqlmysql--realreal--

http://blog.mindedsecurity.com/2009/05/httphttp://blog.mindedsecurity.com/2009/05/http--parameterparameter--

http://blog.mindedsecurity.com/2009/05/clienthttp://blog.mindedsecurity.com/2009/05/client--sideside--httphttp--

http://resources.infosecinstitute.com/findinghttp://resources.infosecinstitute.com/finding--bugsbugs--inin--phpphp--