Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?       Buherátor,       Buherátor, BuheraBlog
Bevezető•   “0% ****, 100% tapasztalat” ☺    • …és néhány technikai finomság•   A webalkalmazások a vállalati infrastruktú...
PHP – Miért szeretjük? Könnyen tanulható, gyorsan fejleszthető    C-like syntax    Dynamic Typing A Webre szánták Könnyen ...
PHP – Miért nem szeretjük Lásd az előző diát :) Kóder Pisti kedvenc nyelve Beépített függvény-vízfej           függvény-  ...
Lehet jól is csinálni
PHP biztonság - óvoda A webszerver korlátozott jogokkal fut, ugye? A register_globals ki van kapcsolva, ugye? URL- URL-eke...
A PHP-s típushiba  PHP-•   File Include hibák    •   Azonnali kódfuttatás    •   Helyi forrásból    •   Távoli forrásból  ...
Local File Include•   <?include(“files/”.$_GET[‘inc’]);?>•   Mit futtathatunk?        futtathatunk?    •   Alkalmazáson ke...
Remote File Include•   <?include($_GET[‘inc’].”.php”);?>•   allow_url_fopen=True•   Mit futtathatunk?    •   Távoli webkis...
Basedir restriction                 ő Minden fájlkezelő funkcióban ellenő                              ellenőrizni kellene...
Safe Mode Egy próbálkozás a veszélyes függvények letiltására / korlátozására Minden érintett funkcióban ellenő            ...
Veszélyes függvények        Melyek ezek?
Veszélyes függvények -Parancsfuttatás passthru                     apache_child_terminate exec                         cho...
Veszélyes függvények –Hálózat ftp_connect ftp_ssl_connect fsockopen pfsockopen socket_bind socket_connect socket_listen so...
Veszélyes függvények A listának még koránt sincs vége    A modulok nagy részét még nem is láttuk!                     ő ő ...
Fájl felöltés Kedvencünk, tipikus gyenge pont Sok helyen előfordul Legalább 80% sebezhető Legtöbb esetben azonnal kódot fu...
Fájl feltöltés -Ökölszabályok                 űrés Fehérlistás szűrés kiterjesztésekre   De: Egy JPG-t is lehet futtatni i...
Fájlfeltöltés – Az Apachetrükk                 űrünk Fehérlistával szűrünk kiterjesztéseket   $allowed=array(„.avi”,”.mov”...
Fájlfeltöltés – IIS-en                IIS-ugyanez <= IIS 6 evil.asp;.jpg vagy evil.asp:.jpg A ; ill. : utáni részeket a ki...
Fájlfeltöltés - Formátumellenő                Formátumellenőrzés
Fájlfeltöltés - Formátumellenő                Formátumellenőrzés
Képek átméretezése•   image_resize.php?width=100&height=100    image_resize.php?width=100&height=100    •   “Öröm, bódottá...
Fájlfeltöltés - RFC1867 Gynvael Coldwind, 2011            ő, Nem jellemző, de nagyon szép :) Feltételezzük, hogy már van e...
Fájlfeltöltés - RFC1867
Fájlfeltöltés - RFC1867
Fájlfeltöltés - RFC1867 A feltöltött fájlok véletlenszerű nevet kapnak ellenőrzés előtt   A könyvtár általában default   W...
Adatbázis elérés•   Az SQL injection rossz, értem?                     rossz, értem?    •   Ugye mindenki tudja mi az az S...
Adatbázis elérés – SQLSmuggling•   A DBMS okosan az érvényes locale szerint próbálja    átalakítani a spéci karaktereket  ...
Adatbázis elérés Ugye senki sem karakterláncként pakolja össze a                  lekérdezéseit?
Adatbázis elérés -    Prepared statements•   Hatékony!    Hatékony!    • Feldolgozás, fordítás, tervezés, stb.      Feldol...
Adatbázis elérés - ORM•   Object Relational Mapping    • DB entitás -> Objektum•   A legtöbb keretrendszer tudja•   Szinté...
Adatbázis elérés - ORM•   A “fogalmazási” problémákat sokszor a subquery-k                                          subque...
Süti attributumok - HttpOnly•   Tankönyvi XSS példa:    <script>alert(document.cookie)</script>•   HttpOnly: Kliens oldali...
Süti attributumok - HttpOnly•   PHP-    PHP-ban alapértelmezetten nincs beállítva a flag a    session-    session-ökre•   ...
Süti attributumok - Secure•   Kapkodjuk el a hálózaton röpködő sütiket, és    jelentkezzünk be velük    • https://github.c...
Süti attributumok - Secure•   PHP-    PHP-ban alapértelmezetten nincs beállítva a flag a    session-    session-ökre•   ph...
CSRF•   Az XSS meg az SQLi lejárt lemez    •   Mindenki ismeri    •   Mindenhol működik…•   A Cross-Site Request Forgery i...
CSRF•   Autentikáció általában sütikkel•            ő    A böngésző egy sütitárat használ•   A felhasználó több lapon böng...
CSRF
CSRF•   Használjunk véletlen adatokat tartalmazó mező                                             mezőket    minden formon...
Védelem - WAF•   Web Application Firewall    •   Layer7•   Komoly helyen alapkellék•   Kiddie-    Kiddie-k és tömeges, aut...
Védelem - PHPIDS•   include()-    include()-dal behúzható PHP könyvtár    •                    ő        Modulként elérhező...
Védelem - Suhosin•   Patch    • BoF védelem    • Format String védelem    • Láncolt listák, hash-táblák védelme           ...
Védelem – Kód review•   Költséghatékony,    Költséghatékony, testreszabható megoldás: grep                                ...
Emlékeztető•   Webalkalmazás nem létezik önállóan    • HTTP szerver    • Böngésző    • DBMS    • Távoli szolgáltatások    ...
Köszönöm a figyelmet!           figyelmet!
Linkek•   http://www.owasp.org•   http://www.hardened-    http://www.hardened-php.net/•   http://www.exploit-    http://ww...
Upcoming SlideShare
Loading in …5
×

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

1,635 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Webműves Kelemen tanácsai, avagy mi kell a PHP falába? Buherátor, Buherátor, BuheraBlog
  2. 2. Bevezető• “0% ****, 100% tapasztalat” ☺ • …és néhány technikai finomság• A webalkalmazások a vállalati infrastruktúra tipikus gyenge pontjai • Egyedi alkalmazás • Nem nyúlunk hozzá, ameddig mű működik• A PHP remek állatorvosi ló • Jól ismert, jól olvasható, egyszerű • Hírhedten bugos kódok (vagy csak rossz PR?)
  3. 3. PHP – Miért szeretjük? Könnyen tanulható, gyorsan fejleszthető C-like syntax Dynamic Typing A Webre szánták Könnyen telepíthető Felmásolom, megy ű Könnyű konfiguráció, akár futásidőben futásidő Jó platform támogatottság Jó dokumentáció, széles felhasználói bázis OOP (>=PHP5) GPL licensz
  4. 4. PHP – Miért nem szeretjük Lásd az előző diát :) Kóder Pisti kedvenc nyelve Beépített függvény-vízfej függvény- Következetlen elnevezések, függvény-szignatúrák függvény- − strlen(), str_split() A bőség zavara − mysql_escape_string(), mysql_real_escape_string(), addslashes() … Biztonság...? Y U No Unicode?
  5. 5. Lehet jól is csinálni
  6. 6. PHP biztonság - óvoda A webszerver korlátozott jogokkal fut, ugye? A register_globals ki van kapcsolva, ugye? URL- URL-eket nem lehet megnyitni, ugye? megnyitni, ugye? A felhasználók nem látják a hibaüzeneteket, ugye?
  7. 7. A PHP-s típushiba PHP-• File Include hibák • Azonnali kódfuttatás • Helyi forrásból • Távoli forrásból • Egy kis emlékeztető…
  8. 8. Local File Include• <?include(“files/”.$_GET[‘inc’]);?>• Mit futtathatunk? futtathatunk? • Alkalmazáson keresztül feltöltött fájlok • Ideiglenes fájlok • Naplófájlok (pl. PHP kód a User Agentben) Agentben) • Az alkalmazás saját fájljait rossz helyen include- include- olva igen hasznos hibaüzenetek kaphatóak
  9. 9. Remote File Include• <?include($_GET[‘inc’].”.php”);?>• allow_url_fopen=True• Mit futtathatunk? • Távoli webkiszolgálón elhelyezett tetsző tetszőleges kódot! • Legtöbbször egyben LFI is…
  10. 10. Basedir restriction ő Minden fájlkezelő funkcióban ellenő ellenőrizni kellene a beállítást És minden felhasznált C könyvtárban is… 5.2.9, 5.2.12, 5.3.0, 5.3.1 … mind megkerülhető MOPB: „not simple safe_mode, open_basedir bypass vulnerabilities” Tudta- Tudta-e Ön, hogy 5.2.16 ill. 5.3.4 előtt az itt megadott értékek, elő csak prefixek, nem konkrét könyvtárak voltak? /home/b => /home/b/ , /home/bizalmas/
  11. 11. Safe Mode Egy próbálkozás a veszélyes függvények letiltására / korlátozására Minden érintett funkcióban ellenő ellenőrizni kellene a beállítást Az eredmény: hamis biztonságérzet „safe mode is an attempt to solve the shared-server security problem. It is shared- architecturally incorrect to try to solve this problem at the PHP level, but since the alternatives at the web server and OS levels arent very realistic, many people, especially ISPs, use safe mode for now” „This is a still probably incomplete and possibly incorrect listing of the functions limited by safe mode. ” 5.3.0 óta deprecated, 6-ban nincs 6-
  12. 12. Veszélyes függvények Melyek ezek?
  13. 13. Veszélyes függvények -Parancsfuttatás passthru apache_child_terminate exec chown chgrp pnctl_exec link proc_open symlink popen posix_kill system posix_mkfifo shell_exec posix_setpgid posix_setsid register_shutdown_function posix_setuid register_tick_function proc_close dl proc_get_status eval proc_nice preg_replace [!] proc_terminate Putenv ... Touch ...
  14. 14. Veszélyes függvények –Hálózat ftp_connect ftp_ssl_connect fsockopen pfsockopen socket_bind socket_connect socket_listen socket_create_listen socket_accept socket_getpeername socket_send ...
  15. 15. Veszélyes függvények A listának még koránt sincs vége A modulok nagy részét még nem is láttuk! ő ő űjtemény: Folyamatosan bővülő gyűjtemény: https://github.com/v- https://github.com/v-p-b/DangerousPHPFunctions Erre írjon valaki IDS szabályt, logelemző stb.! logelemzőt, Az eval()-t le sem lehet tiltani eval()- A disable_functions legalább jól kezelhető Szintén hasznos INI paraméterek: extension_dir, enable_dl
  16. 16. Fájl felöltés Kedvencünk, tipikus gyenge pont Sok helyen előfordul Legalább 80% sebezhető Legtöbb esetben azonnal kódot futtathatunk őségek Alattomos hibalehetőségek
  17. 17. Fájl feltöltés -Ökölszabályok űrés Fehérlistás szűrés kiterjesztésekre De: Egy JPG-t is lehet futtatni include() hibával! JPG- Nevezzük át a feltöltött fájlt! A fájlnév is tartalmazhat shell, PHP utasításokat! Ha JPG-re számítunk, legyen ez az új kiterjesztés! JPG- Ha nem muszáj, ne a webroot alá töltsünk fel! Egy diszpécser szkript jogosultságot ellenő ellenőrizhet, MIME típust állíthat stb. A képeket transzformáljuk! A dupla kiterjesztéseket kerüljük!
  18. 18. Fájlfeltöltés – Az Apachetrükk űrünk Fehérlistával szűrünk kiterjesztéseket $allowed=array(„.avi”,”.mov”,”.qt”); if (inarray(strrchr($name,.),$allowed)) return ACCEPT; Feltöltök egy shell.php.qt nevű fájlt A kiterjesztés megfelelő Az Apache viszont nem ismeri a .qt kiterjesztést, ezért a következőt veszi figyelembe kiszolgáláskor! őt Van egy PHP shellünk...
  19. 19. Fájlfeltöltés – IIS-en IIS-ugyanez <= IIS 6 evil.asp;.jpg vagy evil.asp:.jpg A ; ill. : utáni részeket a kiszolgáló nem veszi figyelembe
  20. 20. Fájlfeltöltés - Formátumellenő Formátumellenőrzés
  21. 21. Fájlfeltöltés - Formátumellenő Formátumellenőrzés
  22. 22. Képek átméretezése• image_resize.php?width=100&height=100 image_resize.php?width=100&height=100 • “Öröm, bódottá” Öröm, bódottᔕ image_resize.php?width=10000&height=10000 image_resize.php?width=10000&height=10000 • DoS, DoS, nemöröm• Nem csak a webes hibákra kell figyelni! figyelni! • “A támadások soha nem lesznek rosszabbak” rosszabbak”
  23. 23. Fájlfeltöltés - RFC1867 Gynvael Coldwind, 2011 ő, Nem jellemző, de nagyon szép :) Feltételezzük, hogy már van egy helyi include hiba Linuxon általában ez sem elég Nagyrészt Windows lehető lehetőség
  24. 24. Fájlfeltöltés - RFC1867
  25. 25. Fájlfeltöltés - RFC1867
  26. 26. Fájlfeltöltés - RFC1867 A feltöltött fájlok véletlenszerű nevet kapnak ellenőrzés előtt A könyvtár általában default Windowson 16-bit véletlen – nem túl sok 16- De a Windows értelmezi a wildcardokat !(!!1) !(!!1 őleges << Tetszőleges karakterlánc < Tetszőleges karakter ő Első egyezés kiválasztása
  27. 27. Adatbázis elérés• Az SQL injection rossz, értem? rossz, értem? • Ugye mindenki tudja mi az az SQL injection…?• MySQL- MySQL-hez van remek escape függvény! függvény! • mysql_escape_string() mysql_escape_string()• Azaz mégsem olyan jó… jó…
  28. 28. Adatbázis elérés – SQLSmuggling• A DBMS okosan az érvényes locale szerint próbálja átalakítani a spéci karaktereket • Á -> A, Í->I, Ű->U … Í - Ű-• A mysql_escape_string() nem veszi figyelembe az adatbázis locale-t locale-• Az PHP escape és a DBMS konverzió után újra injectionre alkalmas karakterlánc állhat elő • http://wechall.net/challenge/addslashes/index.php • őben Élőben még nem láttam ilyet, de …
  29. 29. Adatbázis elérés Ugye senki sem karakterláncként pakolja össze a lekérdezéseit?
  30. 30. Adatbázis elérés - Prepared statements• Hatékony! Hatékony! • Feldolgozás, fordítás, tervezés, stb. Feldolgozás, fordítás, tervezés, stb. csak egyszer! egyszer!• Biztonságos! Biztonságos! • Adat és SQL elválasztva • Típusegyeztetés• PHP- PHP-ban tipikusan valamilyen absztrakciós rétegen keresztül • PDO • ODBC • …
  31. 31. Adatbázis elérés - ORM• Object Relational Mapping • DB entitás -> Objektum• A legtöbb keretrendszer tudja• Szintén biztonságos • Ha a keretrendszerben nem szúrtak el valamit… valamit…• Nagyon kényelmes • PHP és SQL elválasztva• Sokszor nem hatékony• Nem minden queryt lehet megfogalmazni
  32. 32. Adatbázis elérés - ORM• A “fogalmazási” problémákat sokszor a subquery-k subquery- okozzák • JOIN- JOIN-olj okosan, subquery-k általában subquery- feleslegesek!• Használjunk VIEW-kat! VIEW-• Használjunk tárolt eljárásokat! • Melyekben figyelünk az SQL injectionre :P
  33. 33. Süti attributumok - HttpOnly• Tankönyvi XSS példa: <script>alert(document.cookie)</script>• HttpOnly: Kliens oldali szkriptek nem férhetnek hozzá a sütihez!• ő Böngésző feature, nem biztos, hogy mindenhol implementálták!• ől Ettől a XSS még veszélyes marad! • Teljes kontroll a felhasználó jogosultságaival!
  34. 34. Süti attributumok - HttpOnly• PHP- PHP-ban alapértelmezetten nincs beállítva a flag a session- session-ökre• php.ini: session.cookie_httponly=On • PHP 5.2.0-től 5.2.0-• session_set_cookie_params()• Más sütiknél: setcookie() utolsó paramétere
  35. 35. Süti attributumok - Secure• Kapkodjuk el a hálózaton röpködő sütiket, és jelentkezzünk be velük • https://github.com/asciimoo/whol • Firesheep (esélyes Most Overhyped Extension)• Bár a kommunikáció HTTPS-en zajlik, HTTPS- ő kikényszeríthető a süti titkosítatlan küldése • <img src=“http://bank.com/logo.png”/> src=“http://bank.com/logo.png”/>• Secure: A süti csak titkosított csatornán továbbítható!• ő Böngésző feature, nem biztos, hogy mindenhol implementálták!
  36. 36. Süti attributumok - Secure• PHP- PHP-ban alapértelmezetten nincs beállítva a flag a session- session-ökre• php.ini: session.cookie_secure=On • PHP 4.0.4-től 4.0.4-• session_set_cookie_params()• Más sütiknél: setcookie() utolsó elő paramétere előtti
  37. 37. CSRF• Az XSS meg az SQLi lejárt lemez • Mindenki ismeri • Mindenhol működik…• A Cross-Site Request Forgery is lejárt lemez, de alig Cross- ismerik• “Miért kellene nekem ilyesmivel foglalkoznom?” • Jogos kérdés!
  38. 38. CSRF• Autentikáció általában sütikkel• ő A böngésző egy sütitárat használ• A felhasználó több lapon böngészik• Ha egy idegen oldalon elhelyezett form küld adatot egy másik oldalra, ahová a felhasználó be van ő jelentkezve, a böngésző automatikusan küldi az érvényes sütit
  39. 39. CSRF
  40. 40. CSRF• Használjunk véletlen adatokat tartalmazó mező mezőket minden formon • Ez a token… • ennek a felhasználónak… • erre az űrlapra lett kiadva• Referer validáció • Az áldozat nem fogja meghamisítani a saját Referer- Referer-ét • Ha titkosítatlan a csatorna, akkor már úgyis mindegy
  41. 41. Védelem - WAF• Web Application Firewall • Layer7• Komoly helyen alapkellék• Kiddie- Kiddie-k és tömeges, automatizált támadások ellen kiváló• Aki át akar menni rajta, az elő -utóbb át fog menni. előbb előbb-
  42. 42. Védelem - PHPIDS• include()- include()-dal behúzható PHP könyvtár • ő Modulként elérhező több CMS-hez CMS-• Impresszív szabálykészlet• Jól karbantartott• De hol használják?
  43. 43. Védelem - Suhosin• Patch • BoF védelem • Format String védelem • Láncolt listák, hash-táblák védelme listák, hash- • FreeBSD realpath() realpath() • …• Extension • Megregulázott preg_replace() preg_replace() • Titkosított sütik • Végtelen rekurziók megállítása • …• És még rengeteg hasznos funkció
  44. 44. Védelem – Kód review• Költséghatékony, Költséghatékony, testreszabható megoldás: grep megoldás:• grep ‘mysql_query’ mysql_query’• grep ‘SELECT’• grep ‘$_GET’• grep ‘eval(’ eval(’• grep ‘print_r(’ print_r(’• Csak a fantázia szab határt! ☺ határt!
  45. 45. Emlékeztető• Webalkalmazás nem létezik önállóan • HTTP szerver • Böngésző • DBMS • Távoli szolgáltatások • ???• őnek Egy jó fejlesztőnek ismernie kell az általa fejlesztett alkalmazás környezetét is!• A webes támadások általában nem technológia-specifikusak technológia-
  46. 46. Köszönöm a figyelmet! figyelmet!
  47. 47. Linkek• http://www.owasp.org• http://www.hardened- http://www.hardened-php.net/• http://www.exploit- http://www.exploit-db.com/download_pdf/17010• http://www.exploit- http://www.exploit-db.com/download_pdf/15955• http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real- http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real- escape- escape-string• http://blog.mindedsecurity.com/2009/05/http-parameter- http://blog.mindedsecurity.com/2009/05/http-parameter- pollution-new-web- pollution-new-web-attack.html• http://blog.mindedsecurity.com/2009/05/client-side-http- http://blog.mindedsecurity.com/2009/05/client-side-http- parameter- parameter-pollution.html• http://resources.infosecinstitute.com/finding-bugs-in-php- http://resources.infosecinstitute.com/finding-bugs-in-php- using- using-grep/• http://buhera.blog.hu ;)

×