Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP & Segurança: Blindando Aplicações Web

PHP & Segurança: Blindando Aplicações Web

O objetivo dessa palestra é apresentar algumas vulnerabilidades que são bastante comuns em aplicações PHP e qual a maneira de contorná-las. Serão mostradas técnicas de programação defensiva, resposta a incidentes, prevenção de perdas e outros tópicos relevantes à segurança da informação. Princípios de segurança, técnicas de invasão e defesa, identificação e prevenção de ataques, boas práticas e proteção do usuário fazem parte dos assuntos abordados nessa palestra.

Rafa Jaques

March 28, 2017
Tweet

More Decks by Rafa Jaques

Other Decks in Programming

Transcript

  1. Rafael Jaques Professor do Instituto Federal de Educação, Ciência e

    Tecnologia do Rio Grande do Sul. Graduado em Análise e Desenvolvimento de Sistemas. Pós- graduado em Gestão e Docência do Ensino Superior. Mestre em Educação. Desenvolvedor web e viciado em segurança.
  2. Warning: Cannot modify header information - headers already sent by

    (output started at / path/to/script.php:1) in script.php on line 55 Omita as tags de fechamento Boas práticas
  3. Utilize extensões consistentes Boas práticas .php .inc.php .inc .php~ .bak

    httpd.conf AddType application/x-httpd-php .php .phtml
  4. Funções perigosas exec( ) Não execute bobagem no seu sistema

    shell_exec( ) system( ) passthru( ) proc_*( )
  5. Funções perigosas exec( ) Não execute bobagem no seu sistema

    shell_exec( ) system( ) passthru( ) proc_*( ) escapeshellcmd( ) escapeshellarg( )
  6. Ex.: https://speakerdeck.com/willdonohoe/practical-php-security class Logger { public $logFile; public $buffer; public

    $fh; public function __destruct() { $this->WriteBuffer(); } public function WriteBuffer() { if (!$this->fh) { $this->fh = fopen($this->logFile, 'w'); } fwrite($this->fh, $this->buffer); } // ... } // ... $cookieData = unserialize($_COOKIE['data']); // ...
  7. $ lwp-request -edm GET sitedealguem.com.br 200 OK [...] Connection: close

    Pragma: no-cache Server: Apache/2.2.22 (Debian) Vary: Accept-Encoding Content-Type: text/html X-Meta-Revisit-After: 4 days X-Powered-By: PHP/5.3.3-7+squeeze2
  8. $ lwp-request -edm GET sitedealguem.com.br 200 OK [...] Connection: close

    Pragma: no-cache Server: Apache/2.2.22 (Debian) Vary: Accept-Encoding Content-Type: text/html X-Meta-Revisit-After: 4 days X-Powered-By: PHP/5.3.3
  9. set_error_handler( ) error_log( ) Indica uma função para manipular erros

    Loga um erro personalizado Gerenciamento de erros
  10. filter_var( ) php.net/filter.filters FILTER_VALIDATE_* FILTER_SANITIZE_* Validação de dados Verifica se

    determinado valor encontra-se dentro dos parâmetros esperados. Limpeza de dados Retira de um determinado valor todos os caracteres que não são permitidos.
  11. FILTER_SANITIZE_STRING uma string string(10) "uma string" string(12) "uma string *"

    string(21) "uma string&lt;tag&gt;" Limpeza <tag>uma string * <tag>uma string&lt;tag&gt;
  12. Abuso de form mail <?php $cabecalhos = "From: {$_POST['nome']} <{$_POST['email']}>";

    $para = "[email protected]"; $assunto = "Contato via site"; $corpo = $_POST['mensagem']; mail($para, $assunto, $corpo, $cabecalhos);
  13. Abuso de form mail From: Fulaninho Bcc: [email protected], [email protected], <[email protected]>

    To: [email protected] Subject: Contato via site Aqui coloco uma mensagem de SPAM sobre viagra ou algo assim! Possível
  14. XSS Cross-Site Scripting Cuidado com injeção de CSS expression( )

    url( ) Métodos
 específicos moz- binding
  15. CSRF Cross-Site Request Forgery Exigir um token Solicitar reautenticação Prefira

    POST em vez de GET Limite o tempo de sessão Verificar Referer Force o uso de seus formulários uniqid( ) $_SERVER['HTTP_REFERER']
  16. SGBDs suportados pelo PHP php.net/refs.database dBase DB++ CUBRID FrontBase FireBird/Interbase

    filePro Ingres Informix IBM DB2 mSQL Mongo MaxDB Oracle MySQL M$ SQL PostgreSQL Paradox Ovrimos SQL Tokyo Tyrant Sybase SQLite
  17. Servidor session_start() Verifica se a sessão existe Procura pelo SESSID

    em um cookie Procura pelo SESSID numa querystring Busca os dados e cria a $_SESSION Sim Sim Não Cria uma nova SESSID Não Cookies e Sessions
  18. Dados de sessão podem ser visualizados via sniff quando não

    criptografado com HTTPS Exposição de Sessão
  19. Hospedagens compartilhadas podem vazar dados dentro dos diretórios com permissões

    de leitura a todos Utilize session_set_save_handler() para alterar o comportamento de gravação dos dados de sessão Exposição de Sessão
  20. Algumas sugestões para evitar roubo de sessão (tente equilibrar usabilidade

    e segurança): Gerar tokens únicos por usuário Verificar User-Agent e IP Utilizar sessões apenas via cookies Roubo de Sessão
  21. $_SERVER [HTTP_HOST] => localhost [SERVER_SOFTWARE] => Apache/2.2.22 [SERVER_NAME] => localhost

    [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /var/www HTTP [HTTPS] => on [SSL_TLS_SNI] => localhost [HTTP_HOST] => localhost [SERVER_SOFTWARE] => Apache/2.2.22 [SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 443 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /var/www HTTPS
  22. <?php $cript = password_hash('abacaxi', CRYPT_BLOWFISH, ['cost' => 12]); // Exemplo:

    $2y$12$0VeJrCeppjPkEkxwuJNRRudT25GAUprLgzUHq5zX01G2LPJyZjixS if (password_verify('abacaxi', $cript)) { echo 'Senha OK'; } else { echo 'Deu ruim!'; }
  23. <?php $senha = 'abacaxi'; $hash = '$2y$12$0VeJrCeppjPkEkxwuJNRRudT25GAUprLgzUHq5zX01G2LPJyZjixS'; // Pode aumentar

    conforme a capacidade do seu servidor evolui $opcoes = ['cost' => 10]; // Verifica se a senha está OK if (password_verify($senha, $hash)) { // Se deu certo, verifica se a senha atende às novas // opções (como algoritmo ou custo diferentes) if (password_needs_rehash($hash, PASSWORD_DEFAULT, $opcoes)) { // Gera uma senha nova para substituir a antiga $novoHash = password_hash($senha, PASSWORD_DEFAULT, $opcoes); } }
  24. Sempre que possível, utilize código refatorado Exposição phpinfo() Cuidados ao

    enviar e-mails Segurança no sistema de arquivos Últimas dicas