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. 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. 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?
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. 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. 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. 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. 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. 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 aren't very realistic,
many people, especially ISP's, 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-
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. 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. 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. Fájlfeltöltés – Az Apache
trü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. 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
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. 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
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. 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. Adatbázis elérés – SQL
Smuggling
• 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 …
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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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?
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-