Upload
open-academy
View
1.249
Download
1
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
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
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?)
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
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() …
Lehet jól is csinálniLehet jól is csinálniLehet jól is csinálniLehet jól is csinálni
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?
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
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
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…
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/
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
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?
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�� ......
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 ––
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:
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
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!
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!
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
Fájlfeltöltés Fájlfeltöltés -- FormátumellenőFormátumellenőFormátumellenőrzésFormátumellenőrzés
Fájlfeltöltés Fájlfeltöltés -- FormátumellenőFormátumellenőFormátumellenőrzésFormátumellenőrzés
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””
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
Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867RFC1867RFC1867
Fájlfeltöltés Fájlfeltöltés -- RFC1867RFC1867RFC1867RFC1867
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
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!!
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 …
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?
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
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
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
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!
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
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
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
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?”
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
CSRFCSRF
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
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.
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
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ó
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! ! ☺☺
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
KöszönömKöszönöm a a a a figyelmetfigyelmet!!
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--