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

PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques [FISL 16]

PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques [FISL 16]

Palestra apresentada por Rafael Jaques no 16º Fórum Internacional de Software Livre (FISL)

Vídeo da apresentação: https://www.youtube.com/watch?v=eACTodtGuME

Todos os dias, diversas de pessoas ao redor do mundo começam a programar em PHP. É uma linguagem fácil de ser aprendida e, por isso, pode fazer com que desenvolvedores despreparados criem sistemas vulneráveis. O objetivo dessa palestra é apresentar as principais vulnerabilidades de aplicações PHP e a maneira de contorná-las. Serão mostradas também 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

July 09, 2015
Tweet

More Decks by Rafa Jaques

Other Decks in Programming

Transcript

  1. “Porque Deus amou o mundo de tal maneira que deu

    o seu Filho Unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna. Portanto, Deus enviou o seu Filho ao mundo não para condenar o mundo, mas para que o mundo fosse salvo por meio dele.” (João 3.16-17)
  2. 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. Desenvolvedor web e viciado em segurança.
  3. 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
  4. Utilize extensões consistentes Boas práticas .php .inc.php .inc .php~ .bak

    httpd.conf AddType application/x-httpd-php .php .phtml
  5. == != === Cuidado ao efetuar comparações Boas práticas “1”

    == 1 “1” === 1 true == 1 True False true === 1 NULL == false NULL === false True True False False
  6. Funções perigosas exec( ) Não execute bobagem no seu sistema

    shell_exec( ) system( ) passthru( ) proc_*( ) escapeshellcmd( ) escapeshellarg( )
  7. set_error_handler( ) error_log( ) Indica uma função para manipular erros

    Loga um erro personalizado Gerenciamento de erros
  8. isset( ) is_array( ) is_bool( ) is_float( ) is_int( )

    is_null( ) is_numeric( ) is_object( ) is_string( ) Filtragem de dados
  9. Type Casting Assegure-se dos tipos de dados $numero = (int)

    $variavel; $numero = (float) $variavel; Filtragem de dados
  10. Type Casting Assegure-se dos tipos de dados $numero = settype($variavel,

    ‘integer’); $bool = settype($variavel, ‘boolean’); $texto = settype($variavel, ‘string’); Filtragem de dados
  11. Type Casting Assegure-se dos tipos de dados $numero = intval($variavel);

    $numero = floatval($variavel); $texto = strval($variavel); Filtragem de dados
  12. 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.
  13. Validação FILTER_VALIDATE_INT “7” 7 0 true false int(7) int(7) int(0)

    int(1) bool(false) “10 teste” “palavra” -5 3.1 bool(false) bool(false) int(-5) bool(false) bool(false) +0 || -0
  14. 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;
  15. 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);
  16. 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
  17. Array   (        [arquivo]  =>  Array  

               (                    [name]  =>  exemplo.txt                    [type]  =>  text/plain                    [tmp_name]  =>  /tmp/php3IdMTx                    [error]  =>  0                    [size]  =>  33              )   ) Upload de arquivos
  18. POST  /upload.php  HTTP/1.1   Host:  localhost   Content-­‐Type:  multipart/form-­‐data;  boundary=-­‐-­‐-­‐-­‐12345

      Content-­‐Length:  413   -­‐-­‐-­‐-­‐12345   Content-­‐Disposition:  form-­‐data;  name="arquivo";   filename="exemplo.txt"   Content-­‐Type:  text/plain   rafajaques   Palestra  de  PHP   -­‐-­‐-­‐-­‐12345-­‐-­‐ Upload de arquivos
  19. XSS Cross-Site Scripting Cuidado com injeção de CSS expression( )

    url( ) Métodos
 específicos moz- binding
  20. 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']
  21. 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
  22. 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
  23. Exposição de Sessão Dados de sessão podem ser visualizados via

    sniff quando não criptografado com HTTPS
  24. 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
  25. Não é o roubo de um ID de sessão. É

    a imposição de um! Fixação de Sessão
  26. Gere um novo SID em cada requisição Utilize session_regenerate_id() Páginas

    com muito tráfego acabam gerando SID inválidos Fixação de Sessão
  27. 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
  28. php.ini session.use_cookies session.use_only_cookies GET / HTTP/1.1 Host: algumsite.com User-Agent: Mozilla/5.0

    Accept: image/png,image/*;q=0.8,*/*;q=0.5 Cookie: PHPSESSID=3108c6a684a89787947087d4e46f278d Cache-Control: max-age=0
  29. Destrua a sessão antes de alterar o nível de permissão

    de usuário autenticado Impede que uma sessão de guest seja utilizada para um usuário autenticado
  30. $_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
  31. Sempre que possível, utilize código refatorado Exposição phpinfo() Cuidados ao

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