Segurança além do óbvio com PHP

Segurança além do óbvio com PHP

Veremos como aplicar as melhores medidas para protegermos nossos sistemas, trazendo os principais itens do OWASP Top Ten de uma forma mais profunda, indo além dos exemplos mais comuns encontrados, que muitas vezes são resolvidos pelos próprios frameworks.
Pontos que serão abordados: enumeração de usuários, gerenciamento de sessão, melhores práticas de validação de entradas, runtime application self-protection, armazenamento e políticas de senhas.

375596b28a94ecfaec5d63ff64c7f948?s=128

Vinícius Campitelli

June 08, 2019
Tweet

Transcript

  1. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 1/51 Segurança

    Segurança além do óbvio além do óbvio com PHP com PHP 1
  2. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 2/51 Quem

    sou eu? Quem sou eu? Vinícius Campitelli — Arquiteto na Sócio-fundador no vcampitelli.github.io MT4 Tecnologia Curseduca 2
  3. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 3/51 Agenda

    Agenda OWASP Top Ten Gerenciamento de sessão Validação de entradas Armazenamento e políticas de senhas Enumeração de usuários Runtime Application Self-Protection 3
  4. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 4/51 OWASP

    Top Ten OWASP Top Ten owasp.org 4 . 1
  5. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 5/51 OWASP

    Top Ten OWASP Top Ten 4 . 2
  6. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 6/51 OWASP

    Top Ten OWASP Top Ten 4 . 3
  7. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 7/51 Gerenciamento

    de Gerenciamento de sessão sessão 5 . 1
  8. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 8/51 Codificação

    Codificação 5 . 2
  9. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 9/51 Regere

    o ID da sessão no login e logout para mitigar Session Fixation if if ( ($user $user = = $this $this- -> >loginFrom loginFrom( ($_POST $_POST) )) ) { { session_start session_start( () ); ; session_regenerate_id session_regenerate_id( (true true) ); ; // true para apagar a sessã // true para apagar a sessã } } 5 . 3
  10. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 10/51 Adicione

    camadas extras de proteção à sessão Por mais que IP e User-Agent possam ser forjados, é uma camada extra de proteção Mas tome cuidado com o IP, pois proxies e ISPs podem fazer com que ele mude constantemente protected protected function function afterLogin afterLogin( () ) : : void void { { $_SESSION $_SESSION[ ['ip' 'ip'] ] = = $_SERVER $_SERVER[ ['REMOTE_ADDR' 'REMOTE_ADDR'] ]; ; $_SESSION $_SESSION[ ['ua' 'ua'] ] = = $_SERVER $_SERVER[ ['HTTP_USER_AGENT' 'HTTP_USER_AGENT'] ]; ; $_SESSION $_SESSION[ ['timestamp' 'timestamp'] ] = = time time( () ); ; } } 5 . 4
  11. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 11/51 protected

    protected function function isSessionValid isSessionValid( () ) : : bool bool { { if if ( (( (empty empty( ($_SESSION $_SESSION[ ['ip' 'ip'] ]) )) ) || || ( (empty empty( ($_SESSION $_SESSION[ ['ua' 'ua'] ]) )) ) || || ( (empty empty( ($_SESSION $_SESSION[ ['timestamp' 'timestamp'] ]) )) ) || || ( ($_SESSION $_SESSION[ ['ip' 'ip'] ] !== !== $_SERVER $_SERVER[ ['REMOTE_ADDR' 'REMOTE_ADDR'] ]) ) || || ( ($_SESSION $_SESSION[ ['ua' 'ua'] ] !== !== $_SERVER $_SERVER[ ['HTTP_USER_AGENT' 'HTTP_USER_AGENT'] ]) ) session_regenerate_id session_regenerate_id( (true true) ); ; $_SESSION $_SESSION = = [ [] ]; ; return return false false; ; } } 5 . 5
  12. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 12/51 Configurações

    Configurações 5 . 6
  13. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 13/51 Antes

    de mais nada... 5 . 7
  14. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 14/51 Antes

    de mais nada... USE HTTPS! USE HTTPS! 5 . 7
  15. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 15/51 Com

    , podemos ter certi cados SSL gratuitos ♥ Uso e recomendo o Let's Encrypt Lista de clientes suportados acme.sh 5 . 8
  16. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 16/51 Configurações

    do PHP Configurações do PHP session.cookie_domain session.cookie_domain= ="meusite.com.br" "meusite.com.br" session.cookie_httponly session.cookie_httponly= =On On session.cookie_samesite session.cookie_samesite= ="Strict" "Strict" session.cookie_secure session.cookie_secure= =On On session.name session.name= ="MYSESSNAME" "MYSESSNAME" session.sid_bits_per_character session.sid_bits_per_character= =6 6 session.sid_length session.sid_length= =48 48 session.use_only_cookies session.use_only_cookies= =On On session.use_strict_mode session.use_strict_mode= =On On session.use_trans_sid session.use_trans_sid= =Off Off 5 . 9
  17. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 17/51 Referências

    Referências Paragon IE - The Fast Track to Safe and Secure PHP Sessions Manual do PHP - Securing Session INI Settings 5 . 10
  18. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 18/51 Validação

    de entradas Validação de entradas 6 . 1
  19. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 19/51 Nunca

    con e em entradas do usuário! 6 . 2
  20. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 20/51 Nunca

    con e em entradas do usuário! “Mas eu estou validando no frontend!” 6 . 2
  21. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 21/51 Nunca

    con e em entradas do usuário! — Alguém antes de ter sua aplicação invadida “Mas eu estou validando no frontend!” 6 . 2
  22. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 22/51 Você

    pode utilizar ltros de XSS na entrada Mas deve tratar a saída Se usar uma ferramenta de templating, veri que sua própria função Senão, use a função nativa: HTML Puri er voku/anti-xss htmlentities htmlentities( ($str $str, , ENT_QUOTES ENT_QUOTES | | ENT_HTML5 ENT_HTML5, , $encoding $encoding) ) 6 . 3
  23. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 23/51 Valide

    os dados de entrada de acordo com o que você espera para aquele campo (data type) Exemplo: um nome de uma pessoa pode ter apenas letras, espaços, números, hífen e apóstrofo (não esqueça dos acentos!) 6 . 4
  24. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 24/51 Crie

    uma camada em seu framework que irá validar todos os dados da requisição antes de chegar à camada de negócio Se um campo não possuir um data type estipulado, remova-o da requisição 6 . 5
  25. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 25/51 Você

    pode optar por duas abordagens 1. Sanitizar a entrada e seguir o processamento com o valor limpo; ou 2. Parar o processamento com HTTP 400 Bad Request (recomendado para aplicações críticas) 6 . 6
  26. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 26/51 Referências

    Referências PHP Security: XSS OWASP: XSS Filter Evasion Cheat Sheet 6 . 7
  27. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 27/51 Armazenamento

    e Armazenamento e políticas de senhas políticas de senhas 7 . 1
  28. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 28/51 Políticas

    Políticas Não limite os caracteres permitidos Não coloque um tamanho máximo O tamanho mínimo pode variar de acordo com as necessidades de sua aplicação (de acordo com o , 10 caracteres é o desejável) Crie mecanismos de complexidade Exemplo: ao menos 1 caractere maiúsculo, 1 minúsculo, 1 número e 1 caractere especial NIST SP800-132 7 . 2
  29. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 29/51 Armazenamento

    Armazenamento Aplique um algoritmo de hash para transformá-la em um texto com tamanho xo Utilize um salt especí co para aquela senha Criptografe o hash gerado para garantir que você possa recriptografar todas as senhas caso haja vazamento do banco de dados 7 . 3
  30. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 30/51 Se

    possível, use a ! Uma biblioteca segura, moderna e fácil de usar... libsodium 7 . 4
  31. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 31/51 Se

    possível, use a ! Uma biblioteca segura, moderna e fácil de usar... (por mais que os métodos sejam um pouco verbosos) libsodium 7 . 4
  32. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 32/51 Se

    possível, use a ! Uma biblioteca segura, moderna e fácil de usar... (por mais que os métodos sejam um pouco verbosos) Sim, estou de olho em você, sodium_crypto_sign_keypair_from_secretkey_and_publickey() libsodium 7 . 4
  33. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 33/51 Referências

    Referências OWASP Authentication Cheat Sheet OWASP Password Storage Cheat Sheet CrackStation: Salted Password Hashing - Doing it Right paragonie/password_lock Slides da minha palestra sobre a libsodium Wikipedia: Rainbow Tables 7 . 5
  34. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 34/51 O

    que um sistema que rode o código a seguir pode dar de informação a um atacante? 8 . 1
  35. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 35/51 public

    public function function login login( (string string $username $username, , string string $password $password) ) : : { { $user $user = = $this $this- -> >findByUsername findByUsername( ($username $username) ); ; if if ( (! ! $user $user) ) { { return return false false; ; } } if if ( (! ! $this $this- -> >verifyPassword verifyPassword( ($password $password, , $user $user- -> >getPasswor getPasswor return return false false; ; } } return return true true; ; } } 8 . 2
  36. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 36/51 Enumeração

    de Enumeração de usuários usuários 8 . 3
  37. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 37/51 Enumeração

    de Enumeração de usuários usuários É possível saber que usuários existem em sua aplicação através de Timing attacks 8 . 3
  38. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 38/51 public

    public function function login login( (string string $username $username, , string string $password $password) ) : : { { $storedPassword $storedPassword = = $this $this- -> >generateFakePassword generateFakePassword( () ); ; $user $user = = $this $this- -> >findByUsername findByUsername( ($username $username) ); ; if if ( ($user $user) ) { { $storedPassword $storedPassword = = $user $user- -> >getPassword getPassword( () ); ; } } return return ( ($this $this- -> >verifyPassword verifyPassword( ($password $password, , $storedPassword $storedPassword && && ( ($user $user !== !== null null) ); ; } } 8 . 4
  39. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 39/51 Será

    que não estamos exagerando? É realmente possível ver essa diferença? 8 . 5
  40. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 40/51 Será

    que não estamos exagerando? É realmente possível ver essa diferença? Vamos testar, então! Executando os scripts login-user-enumeration.php e login-user-enumeration-fixed.php 8 . 5
  41. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 41/51 8

    . 6
  42. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 42/51 Runtime

    Application Runtime Application Self-Protection Self-Protection 9 . 1
  43. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 43/51 O

    que aconteceria se alguém alterasse sua aplicação de alguma maneira? 9 . 2
  44. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 44/51 Além

    de ferramentas de IDS (Intrusion Detection System, como o ), podemos colocar lógicas em nossa própria aplicação! OSSEC 9 . 3
  45. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 45/51 public

    public function function bootstrap bootstrap( () ) : : void void { { // Se não for performático sempre, balanceie as validaçõ // Se não for performático sempre, balanceie as validaçõ if if ( ($this $this- -> >shouldValidateRASP shouldValidateRASP( () )) ) { { $this $this- -> >validateRequest validateRequest( () ) - -> >validateFiles validateFiles( () ) - -> >validatePhpConfig validatePhpConfig( () ) - -> >validateDatabaseConfig validateDatabaseConfig( () ) - -> >validateWebServerConfig validateWebServerConfig( () ) - -> >validateServerConfig validateServerConfig( () ); ; } } } } 9 . 4
  46. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 46/51 Por

    exemplo, você pode garantir que estamos sempre rodando em HTTPS... final final private private function function validateRequest validateRequest( () ) : : self self { { if if ( (( (! !isset isset( ($_SERVER $_SERVER[ ['HTTPS' 'HTTPS'] ]) )) ) || || ( ($_SERVER $_SERVER[ ['HTTPS' 'HTTPS'] ] !== !== 'on' 'on') )) ) { { throw throw new new RuntimeException RuntimeException( ('HTTPS only' 'HTTPS only') ); ; } } return return $this $this; ; } } 9 . 5
  47. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 47/51 ...

    ou que um arquivo não tenha sido alterado! final final private private function function validateFiles validateFiles( () ) : : self self { { $fingerprint $fingerprint = = '/path/to/file.crt' '/path/to/file.crt'; ; if if ( (! ! hash_equals hash_equals( ( $this $this- -> >getOriginalFingerprint getOriginalFingerprint( ($file $file) ), , $this $this- -> >getCertificateFingerprint getCertificateFingerprint( ($file $file) ) ) )) ) { { $this $this- -> >alertAuthorities alertAuthorities( () ); ; throw throw new new RuntimeException RuntimeException( ('O ambiente está comprome 'O ambiente está comprome } } return return $this $this; ; } } 9 . 6
  48. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 48/51 10

  49. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 49/51 Pontos

    de atenção Pontos de atenção 10
  50. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 50/51 Pontos

    de atenção Pontos de atenção Proteger uma aplicação Web não é algo trivial Existem muitos outros ataques e técnicas de defesas além dessas Avalie o que faz sentido para seu sistema Quando possível, utilize técnicas de defesa em camadas 10
  51. 6/11/2019 Segurança além do óbvio com PHP https://viniciuscampitelli.com/slides-seguranca-alem-obvio-php/?print-pdf#/4 51/51 Obrigado!

    Obrigado! vcampitelli.github.io 11