SlideShare a Scribd company logo
Před čím tě Nette ani
Symfony neochrání
@ProchazkaFilip
#makeCodeNotWar
~ Anonym, v současnosti v programu ochrana svědků
Staré verze
● PHP7
● I v Nette jsou security bugy
● Composer
● PECL
● Systém
● Roave/SecurityAdvisories
● Symfony security:check
Knihovny
● Je knihovna “stable”? Stará se o ni autor?
● Nastudovat api/internals
● Security audit?
● Nikdy nic nepředpokládejte!
● Integrační testy
● Pochopení flow dat - xdebug
Špatné nastavení
● Umyslně
● Z neznalosti/nepochopení
● security: false
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Security through obscurity
● PHP: expose_php=Off
● Nginx: server_tokens off;
● Http client knihovny vs verze PHP
XSS
$this->flashMessage(Html::el('p')->setHtml(sprintf(
'Váš nový účet je <b>%s</b>',
$username
)));
XSS / escapování
● |noescape
○ translator
● href="foo?bar={$bar|urlescape}"
● escapeshellarg()
SQL
"UPDATE users
SET pwd = '$pwd'
WHERE id = '$uid'";
SQL: escapování LIKE
addcslashes($search_term, "%_");
function like($s, $e) {
return str_replace([$e, '_', '%'], [$e.$e, $e.'_', $e.'%'], $s);
}
$q = $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
Source
SQL: escapování REGEX
● preg_quote()
SQL: IS vs =
SELECT * FROM t WHERE col IS NULL;
SELECT * FROM t WHERE col = NULL;
SQL: PDO::ATTR_EMULATE_PREPARES
● Auto fallback WTF
● Výjimky při prepare
dump($dbh->prepare('INSERT;'));
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
dump($dbh->prepare('INSERT;'));
SQL: kódování
● SET NAMES utf8;
● DSN charset=utf8
● Nové MySQL => utf8mb4
SQL: MySQL sql mode
● strict = STRICT_TRANS_TABLES or STRICT_ALL_TABLES
○ Různá výchozí hodnota v závislosti na verzi MySQL
● ERROR_FOR_DIVISION_BY_ZERO + strict => error
● NO_UNSIGNED_SUBTRACTION
● NO_ZERO_DATE + strict => error
● NO_ZERO_IN_DATE + strict => error
Validace vstupů
● Vyvarovat se
○ Použití globals $_
○ filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
● Používat
○ Value/DTO objekty
■ Symfony Data Transformers?
○ Json Schema
○ JMS Serializer
○ Symfony/Validator
● Filesystém
○ fopen($file, "t");
Validace vstupů: regulární výrazy
● Multiline
● A Z
● ^ $
Type juggling
● uživatelské vstupy - především scalar vs array
● Podmínky
○ == vs ===
○ in_array(,,true), array_search(,,true)
○ switch()
○ isset() vs array_key_exists()
○ empty() ~ !isset($var) || $var == false
● declare(strict_types=1)
● $objectA > $objectB
CSRF
● nextras/secured-links
● $form->addProtection();
Cache
● Sdílená cache
○ APC
● Cache poisoning
○ Router
○ Data v aplikaci
○ HTTP (proxyny atd)
● umask(0);
File Upload
● $_FILES["file"]["type"];
● Kontrolovat
○ koncovku
○ mime typ
● Stripnout EXIF data a uložit bokem, pokud je potřebuju
● Zajistit, aby nešlo spustit soubor připojením .php za název
● Vlastní názvy pomocí
○ Strings::webalize(), lépe random/UUID
○ lomítka a speciální znaky
○ null byte exploity v názvu souboru
HTTPS & Security Headers
● Secured session sušenka (& permanent login cookie)
○ session.cookie_httponly=1
○ session.cookie_secure=1
○ session.use_only_cookies=1
● HSTS
○ Zavádět s malou expirací, postupně zvyšovat když vše funguje
● CORS
● CSP
○ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
○ https://github.com/spaze/csp-config
○ https://csp-evaluator.withgoogle.com/
HTTPS & Security Headers
● SRi
○ Michal Špaček: HTTP hlavičky, Subresource Integrity a spol.
○ https://github.com/spaze/sri-macros
● securityheaders.io
● observatory.mozilla.org
Přístupný důvěrný obsah
● Čitelné .neon/.yml configy
● git, svn
● Uniknutí Laděnky
○ Debug mode
○ Přístupné na veřejné adrese, která je nezabezpečená
Insecure Direct Object References
● Možnost editace něčeho k čemu nemám přístup
● Možnost vykradení dat
● UUID (neřeší problém, jen ho zmírní)
Unvalidated Redirects and Forwards
● Zneužití redirect parametru
● Backlinky
Random
● Kde
○ Generovaná hesla
○ jakékoliv tokeny v url a formulářích
● Co nepoužívat
○ rand, srand, getrandmax -> mt_rand()
● Co použít
○ random_int()
○ random_bytes()
○ Random::generate()
● paragonie/random_compat
Crypto:
● Použít libsodium nebo openssl
● mcrypt je od 7.1 deprecated
● defuse/php-encryption
“The First Rule of Cryptography: Don't Implement it Yourself”
Hashování
Cryptographic Hashes
● Fast
● Only one input: The message
Password Hashes
● Intentionally slow
● At least three inputs:
○ The password
○ A per-user salt
○ A cost factor (how expensive to make the computation)
Source
Hashování
● memory-hard algoritmy
○ Scrypt
○ Argon2
○ Bcrypt - don’t be smart, just use Bcrypt
● Bcrypt omezení (bugs in the algorithm itself)
○ 72 znaků
○ Truncate NUL byte
○ base64_encode(hash('sha384', $password, true));
● password_hash() & password_verify()
● Kdy má smysl šifrovat hashe hesel?
○ Když je všechno ostatní vyřešný!
Source
Side-channel attack
● Constant-time porovnávání stringů
○ hash_equals()
○ baseN kódování paragonie/constant_time_encoding
○ Anthony Ferrara: It's All About Time
● password_verify() má ochranu zabudovanou
Monitoring
● Logovat “nebezpečné” operace
○ Přihlášení
○ Registrace
○ Zapomenuté heslo
○ …?
Díky všem co přispěli!
● Jan Tvrdík @jantvrdik
● Jakub Chábek @grongor
● Jan-Sebastian Fabík @janfabik
● David Matějka @matej_21
● Petr Soukup @petrsoukup
● Jan Škrášek @hrachcz
● Jiří Pudil @jiripudil
● Patrik Votoček @PatrikVotocek
● Michal Špaček @spazef0rze
● Jan Kuchař @honzakuchar
Díky za pozornost!
@ProchazkaFilip
#makeCodeNotWar

More Related Content

PDF
Php storm @ phpprague 2016
PDF
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
ODP
Noční můry webového vývojáře
PDF
SymfonyCon Cluj 2017
ODP
Jak zlepšit zabezpečení čtvrtiny celého webu
ODP
XSS PHP CSP ETC OMG WTF BBQ
ODP
Bezpečnostní útoky na webové aplikace
PDF
Tomáš Votruba – Jako Vinnetou a Old Shatterhand – refaktoruj nenávist v přáte...
Php storm @ phpprague 2016
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Noční můry webového vývojáře
SymfonyCon Cluj 2017
Jak zlepšit zabezpečení čtvrtiny celého webu
XSS PHP CSP ETC OMG WTF BBQ
Bezpečnostní útoky na webové aplikace
Tomáš Votruba – Jako Vinnetou a Old Shatterhand – refaktoruj nenávist v přáte...

Similar to Před čím vás Nette ani Symfony neochrání (20)

PDF
Vinettou a Old Shatterhand (PhpLive.cz, jaro 2016)
PDF
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
PDF
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
PPTX
TNPW2-2012-04
ODP
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
PPTX
TNPW2-2013-04
PPTX
Bezpečnost Wordpressu - 4. WP konference
ODP
Kolik webových útoků znáš...
PDF
Nejčastější webové zranitelnosti
PPTX
Bezpečnost na webu
PPTX
Symfony vs Nette vs Phalcon
PPTX
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
PPTX
Optimalizace Symfony na devu
PDF
Péhápkaři v Pecce: phpDay2018 Verona - Jan Kadeřábek - 16. 5. 2018
PDF
WordCamp Prague 2014 - Website security cz
PDF
Michal Majer / I testování může být zábava
PPTX
Odpoledne se Seznamem II - Provozní bezpečnost
PDF
Úvod do bezpečnosti na webu
ODP
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
PDF
Website Security & WordPress (Peter Gramantik)
Vinettou a Old Shatterhand (PhpLive.cz, jaro 2016)
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
TNPW2-2012-04
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
TNPW2-2013-04
Bezpečnost Wordpressu - 4. WP konference
Kolik webových útoků znáš...
Nejčastější webové zranitelnosti
Bezpečnost na webu
Symfony vs Nette vs Phalcon
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Optimalizace Symfony na devu
Péhápkaři v Pecce: phpDay2018 Verona - Jan Kadeřábek - 16. 5. 2018
WordCamp Prague 2014 - Website security cz
Michal Majer / I testování může být zábava
Odpoledne se Seznamem II - Provozní bezpečnost
Úvod do bezpečnosti na webu
Minulé století volalo (Cross-Site Scripting + BeEF + CSP demo)
Website Security & WordPress (Peter Gramantik)
Ad

More from Filip Procházka (15)

PDF
4 roky remote
PDF
Doctrine: co dělat, když entity nestačí
PDF
Nejlepší cache je žádná cache
PDF
Testování prakticky
PDF
Doctrine ORM & model
PDF
CQRS v rohlik.cz
PDF
Nette framework - How to compile an extensible di container
PDF
Kdyby/Translation
PDF
Kdyby/Events #posobota
PDF
Kdyby/Events
PDF
Kdyby/Redis
PDF
Dependency injection v Nette 2.1 prakticky
PDF
Usnadněte si soužití s Doctrine
PDF
Nette Tester / Posobota
PDF
Composer / Posobota
4 roky remote
Doctrine: co dělat, když entity nestačí
Nejlepší cache je žádná cache
Testování prakticky
Doctrine ORM & model
CQRS v rohlik.cz
Nette framework - How to compile an extensible di container
Kdyby/Translation
Kdyby/Events #posobota
Kdyby/Events
Kdyby/Redis
Dependency injection v Nette 2.1 prakticky
Usnadněte si soužití s Doctrine
Nette Tester / Posobota
Composer / Posobota
Ad

Před čím vás Nette ani Symfony neochrání

  • 1. Před čím tě Nette ani Symfony neochrání @ProchazkaFilip #makeCodeNotWar
  • 2. ~ Anonym, v současnosti v programu ochrana svědků
  • 3. Staré verze ● PHP7 ● I v Nette jsou security bugy ● Composer ● PECL ● Systém ● Roave/SecurityAdvisories ● Symfony security:check
  • 4. Knihovny ● Je knihovna “stable”? Stará se o ni autor? ● Nastudovat api/internals ● Security audit? ● Nikdy nic nepředpokládejte! ● Integrační testy ● Pochopení flow dat - xdebug
  • 5. Špatné nastavení ● Umyslně ● Z neznalosti/nepochopení ● security: false curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  • 6. Security through obscurity ● PHP: expose_php=Off ● Nginx: server_tokens off; ● Http client knihovny vs verze PHP
  • 8. XSS / escapování ● |noescape ○ translator ● href="foo?bar={$bar|urlescape}" ● escapeshellarg()
  • 9. SQL "UPDATE users SET pwd = '$pwd' WHERE id = '$uid'";
  • 10. SQL: escapování LIKE addcslashes($search_term, "%_"); function like($s, $e) { return str_replace([$e, '_', '%'], [$e.$e, $e.'_', $e.'%'], $s); } $q = $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR); Source
  • 12. SQL: IS vs = SELECT * FROM t WHERE col IS NULL; SELECT * FROM t WHERE col = NULL;
  • 13. SQL: PDO::ATTR_EMULATE_PREPARES ● Auto fallback WTF ● Výjimky při prepare dump($dbh->prepare('INSERT;')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); dump($dbh->prepare('INSERT;'));
  • 14. SQL: kódování ● SET NAMES utf8; ● DSN charset=utf8 ● Nové MySQL => utf8mb4
  • 15. SQL: MySQL sql mode ● strict = STRICT_TRANS_TABLES or STRICT_ALL_TABLES ○ Různá výchozí hodnota v závislosti na verzi MySQL ● ERROR_FOR_DIVISION_BY_ZERO + strict => error ● NO_UNSIGNED_SUBTRACTION ● NO_ZERO_DATE + strict => error ● NO_ZERO_IN_DATE + strict => error
  • 16. Validace vstupů ● Vyvarovat se ○ Použití globals $_ ○ filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); ● Používat ○ Value/DTO objekty ■ Symfony Data Transformers? ○ Json Schema ○ JMS Serializer ○ Symfony/Validator ● Filesystém ○ fopen($file, "t");
  • 17. Validace vstupů: regulární výrazy ● Multiline ● A Z ● ^ $
  • 18. Type juggling ● uživatelské vstupy - především scalar vs array ● Podmínky ○ == vs === ○ in_array(,,true), array_search(,,true) ○ switch() ○ isset() vs array_key_exists() ○ empty() ~ !isset($var) || $var == false ● declare(strict_types=1) ● $objectA > $objectB
  • 20. Cache ● Sdílená cache ○ APC ● Cache poisoning ○ Router ○ Data v aplikaci ○ HTTP (proxyny atd) ● umask(0);
  • 21. File Upload ● $_FILES["file"]["type"]; ● Kontrolovat ○ koncovku ○ mime typ ● Stripnout EXIF data a uložit bokem, pokud je potřebuju ● Zajistit, aby nešlo spustit soubor připojením .php za název ● Vlastní názvy pomocí ○ Strings::webalize(), lépe random/UUID ○ lomítka a speciální znaky ○ null byte exploity v názvu souboru
  • 22. HTTPS & Security Headers ● Secured session sušenka (& permanent login cookie) ○ session.cookie_httponly=1 ○ session.cookie_secure=1 ○ session.use_only_cookies=1 ● HSTS ○ Zavádět s malou expirací, postupně zvyšovat když vše funguje ● CORS ● CSP ○ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP ○ https://github.com/spaze/csp-config ○ https://csp-evaluator.withgoogle.com/
  • 23. HTTPS & Security Headers ● SRi ○ Michal Špaček: HTTP hlavičky, Subresource Integrity a spol. ○ https://github.com/spaze/sri-macros ● securityheaders.io ● observatory.mozilla.org
  • 24. Přístupný důvěrný obsah ● Čitelné .neon/.yml configy ● git, svn ● Uniknutí Laděnky ○ Debug mode ○ Přístupné na veřejné adrese, která je nezabezpečená
  • 25. Insecure Direct Object References ● Možnost editace něčeho k čemu nemám přístup ● Možnost vykradení dat ● UUID (neřeší problém, jen ho zmírní)
  • 26. Unvalidated Redirects and Forwards ● Zneužití redirect parametru ● Backlinky
  • 27. Random ● Kde ○ Generovaná hesla ○ jakékoliv tokeny v url a formulářích ● Co nepoužívat ○ rand, srand, getrandmax -> mt_rand() ● Co použít ○ random_int() ○ random_bytes() ○ Random::generate() ● paragonie/random_compat
  • 28. Crypto: ● Použít libsodium nebo openssl ● mcrypt je od 7.1 deprecated ● defuse/php-encryption “The First Rule of Cryptography: Don't Implement it Yourself”
  • 29. Hashování Cryptographic Hashes ● Fast ● Only one input: The message Password Hashes ● Intentionally slow ● At least three inputs: ○ The password ○ A per-user salt ○ A cost factor (how expensive to make the computation) Source
  • 30. Hashování ● memory-hard algoritmy ○ Scrypt ○ Argon2 ○ Bcrypt - don’t be smart, just use Bcrypt ● Bcrypt omezení (bugs in the algorithm itself) ○ 72 znaků ○ Truncate NUL byte ○ base64_encode(hash('sha384', $password, true)); ● password_hash() & password_verify() ● Kdy má smysl šifrovat hashe hesel? ○ Když je všechno ostatní vyřešný! Source
  • 31. Side-channel attack ● Constant-time porovnávání stringů ○ hash_equals() ○ baseN kódování paragonie/constant_time_encoding ○ Anthony Ferrara: It's All About Time ● password_verify() má ochranu zabudovanou
  • 32. Monitoring ● Logovat “nebezpečné” operace ○ Přihlášení ○ Registrace ○ Zapomenuté heslo ○ …?
  • 33. Díky všem co přispěli! ● Jan Tvrdík @jantvrdik ● Jakub Chábek @grongor ● Jan-Sebastian Fabík @janfabik ● David Matějka @matej_21 ● Petr Soukup @petrsoukup ● Jan Škrášek @hrachcz ● Jiří Pudil @jiripudil ● Patrik Votoček @PatrikVotocek ● Michal Špaček @spazef0rze ● Jan Kuchař @honzakuchar