$30 off During Our Annual Pro Sale. View Details »

Sistemas seguros em PHP

Sistemas seguros em 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.

Vinícius Campitelli

June 08, 2019
Tweet

More Decks by Vinícius Campitelli

Other Decks in Programming

Transcript

  1. Sistemas seguros em PHP 1

  2. Sistemas seguros em PHP estou fazendo certo? 1

  3. Quem sou eu VINÍCIUS CAMPITELLI Membro do Desenvolvedor na Entusiasta

    em cibersegurança 10+ anos desenvolvendo em PHP PHPSP OTTera 2 . 1
  4. Quem sou eu Slides & GitHub Twitter LinkedIn vcampitelli vcampitelli

    vcampitelli vcampitelli Vinícius Vinícius Campitelli Campitelli 2 . 2
  5. Agenda OWASP Top Ten Gerenciamento de sessão Validação de entradas

    Armazenamento e políticas de senhas Enumeração de usuários Referências 3
  6. OWASP Top Ten owasp.org 4 . 1

  7. OWASP Top Ten

  8. 4 . 2

  9. OWASP Top Ten

  10. 4 . 3

  11. Gerenciamento de sessão 5 . 1

  12. Codificação 5 . 2

  13. 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
  14. Configurações 5 . 4

  15. Antes de mais nada... 5 . 5

  16. Antes de mais nada... USE HTTPS! 5 . 5

  17. Com , podemos ter certificados SSL gratuitos ♥ Uso e

    recomendo o Let's Encrypt Lista de clientes suportados acme.sh 5 . 6
  18. 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 . 7
  19. Referências Paragon IE - The Fast Track to Safe and

    Secure PHP Sessions Manual do PHP - Securing Session INI Settings 5 . 8
  20. Validação de entradas 6 . 1

  21. Nunca confie em entradas do usuário! 6 . 2

  22. Nunca confie em entradas do usuário! “Mas eu estou validando

    no frontend!” 6 . 2
  23. Nunca confie em entradas do usuário! “Mas eu estou validando

    no frontend!” — Alguém antes de ter sua aplicação invadida 6 . 2
  24. Você pode utilizar filtros de XSS na entrada Mas deve

    tratar a saída Se usar uma ferramenta de templating, verifique sua própria função Senão, use a função nativa: HTML Purifier voku/anti-xss htmlentities htmlentities( ($str $str, , ENT_QUOTES ENT_QUOTES | | ENT_HTML5 ENT_HTML5, , $encoding $encoding) ) 6 . 3
  25. 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
  26. 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
  27. 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
  28. Referências PHP Security: XSS OWASP: XSS Filter Evasion Cheat Sheet

    6 . 7
  29. Armazenamento e políticas de senhas 7 . 1

  30. 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
  31. Armazenamento Aplique um algoritmo de hash para transformá-la em um

    texto com tamanho fixo Utilize um salt específico 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
  32. Se possível, use a ! Uma biblioteca segura, moderna e

    fácil de usar... libsodium 7 . 4
  33. Se possível, use a ! Uma biblioteca segura, moderna e

    fácil de usar... libsodium (por mais que os métodos sejam um pouco verbosos) 7 . 4
  34. Se possível, use a ! Uma biblioteca segura, moderna e

    fácil de usar... libsodium (por mais que os métodos sejam um pouco verbosos) Sim, estou de olho em você, sodium_crypto_sign_keypair_from_secretkey_and_publi 7 . 4
  35. 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
  36. O que um sistema que rode o código a seguir

    pode dar de informação a um atacante? 8 . 1
  37. 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-> ->getPasswo getPasswo return return false false; ; } } return return true true; ; } } 8 . 2
  38. Enumeração de usuários 8 . 3

  39. Enumeração de usuários É possível saber que usuários existem em

    sua aplicação através de Timing attacks 8 . 3
  40. 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, , $storedPasswor $storedPasswor && && ( ($user $user !== !== null null) ); ; } } 8 . 4
  41. Será que não estamos exagerando? É realmente possível ver essa

    diferença? 8 . 5
  42. 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
  43. 0:00 / 0:58 8 . 6

  44. Referências 9 . 1

  45. Ferramentas Metasploit w3af Burp Suite Nessus OpenVAS Kali Linux 9

    . 2
  46. Leituras OWASP Paragon Initiative devsecops.org BSIMM SSDLC 9 . 3

  47. Vulnerabilidades snyk CVE - Mitre CVE Details 9 . 4

  48. Eventos Roadsec mindthesec H2HC BSides Security Leaders you sh0t the

    sheriff Garoa Hacker Club 9 . 5
  49. 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 Utilize técnicas de defesa em camadas 10
  50. Obrigado! vcampitelli.github.io 11