Protegendo sites php no seu servidor web

2,769 views
2,754 views

Published on

Palestra dada por Claudio Borges no CONAPHP 2008 - Congresso Nacional de PHP que ocorreu em São Paulo nos dias 18 e 19 de Outubro dentro do CONISLI 2008

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,769
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
118
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Protegendo sites php no seu servidor web

  1. 1. Cláudio
Borges
 cborges@openbsd‐sp.org

  2. 2. O
Que
será
abordado
   O
porque
da
segurança.
   Diretivas
e
funções
perigosas.
   Configurando
o
open_basedir
e
 disable_functions.
   Utilizando
as
diretivas
php_flag
e
php_value.
   A
polêmica
do
register_globals.
   Mod_security.
   Suhoshin.
   Cuidados
com
logs
e
exibição
de
erros
em
 ambiente
de
produção.
   Programando
com
segurança.

  3. 3. O
Porque
da
segurança

  4. 4.   Falhas
podem
existir
em
qualquer
sistema.
   Programas
inseguros
podem
ser
feitos
em 
qualquer
linguagem.
   Proteger
as
aplicações
web
é
tarefa
tanto
do 
administrador
quando
do
programador.
   Muitas
features
ajudam
na
programação
mas 
diminuem
a
segurança.
   Por
ser
uma
linguagem
muito
rica,muitos 
programadores
não
consideram
que
a 
segurança
também
depende
da
qualidade
do 
seu
código
PHP.

  5. 5. Diretivas
perigosas

  6. 6.   allow_url_fopen
–
Permite
utilizar
arquivos
 externos
como
se
fossem
arquivos
locais.
   allow_url_include
–
Permite
utilizar
arquivos
 externos
em
include/require.
   expose_php
–
Adiciona
uma
assinatura
no
 header
do
seu
servidor
web,
informando
que
 o
php
está
instalado.

  7. 7.   Exemplo
de
uso
de
site
mal
desenvolvido
e 
allow_url_fopen/allow_url_include
habilitado:

  8. 8.   Agora
desabilitado:

  9. 9.   Exemplo
de
scan
em
servidor
com 
expose_php
habilitado:

  10. 10.   E
com
ele
desabilitado:

  11. 11. Funções
perigosas

  12. 12.   As
funções
exec,
shellexec,
system
e
passthru
 executam
comandos
externos.
   Outras
funções:

phpinfo,
proc_open,
 proc_nice,
chdir,
chroot,
dir,
closedir,
getcwd,
 opendir,
readdir,
rewinddir,
scandir,
popen,
 pcntl_exec,
pcntl_fork,
pcntl_alarm,
 pcntl_setpriority,
pcntl_signal,
pcntl_wait,
 pcntl_waitpid,
ini_get,
ini_get_all,
ini_set,
 ini_restore.

  13. 13. Configurando
o
open_basedir
 e
disable_functions

  14. 14.   open_basedir
–
Define
os
diretórios
a
partir
 dos
quais
o
PHP
pode
utilizar.
 open_basedir = /var/www/:/tmp/   disable_functions
–
Permite
desabilitar
 funções
que
não
precisem
ser
utilizadas.
 disable_functions = phpinfo, shell_exec, exec, passthru, proc_open, proc_nice, system, chdir, chroot, dir, closedir, getcwd, opendir, readdir, rewinddir, scandir, popen, pcntl_exec, pcntl_fork, pcntl_alarm, pcntl_setpriority, pcntl_signal, pcntl_wait, pcntl_waitpid, ini_get, ini_get_all, ini_set, ini_restore
  15. 15.   Exemplo
de
uma
página
sem
open_basedir 
configurado:

  16. 16.   Outro
exemplo:
criei
um
arquivo
chamado
readfile.php 
com
o
seguinte
conteúdo: <?php readfile(‘/etc/passwd’); ?>   E
o
resultado:

  17. 17.   E
o
mesmo
exemplo
com
ele
configurado:
 open_basedir = /var/www/:/tmp/
  18. 18.   E
com
o
código
do
readfile.php:

  19. 19. A
polêmica
do
 register_globals

  20. 20.   Com
register_globals
habilitado,
são
criadas
 variáveis
locais
com
o
nome
equivalente
às
da
 EGPCS.
   É
possível
utilizar
register_globals
habilitado
 e
ter
minha
aplicação
segura?
   Por
que
tantos
programadores
insistem
em
 habilitar
register_globals?
   Porque
não
utilizar
register_globals?

  21. 21. Exemplos
de
uso
de
 register_globals

  22. 22.   Exemplo
de
código
com
register_globals
habilitado:
 if (authenticated_user()) $auth = true; if ($auth) echo “Usuário autorizado…”; else echo “Usuário sem autorização!”;   O
código
acima
pode
ser
facilmente
burlado
com
a
 seguinte
URL:
 http://www.site.com.br?login.php?auth=1
  23. 23.   E
agora
da
forma
correta:
 if (authenticated_user()) $_SESSION[‘auth’] = true; if ($_SESSION[‘auth’]) echo “Usuário autorizado…”; else 
 echo “Usuário sem autorização!”;
  24. 24. Utilizando
as
diretivas
 php_flag
php_value

  25. 25.   Com
as
diretivas
php_value,
php_flag,
é 
possível
definir
opções
personalizadas
para 
cada
vhost
via
arquivos
.htaccess.
É 
necessário
que
a
diretiva
AllowOverride 
esteja
definida
com
o
valor
All.
   As
diretivas
php_admin_flag
e 
php_admin_value
só
podem
ser
utilizadas 
em
arquivos
de
configuração
do
Apache
e 
não
podem
ser
sobrescritas
por 
diretivas
.htaccess.

  26. 26.   Exemplo
de
uso
da
diretiva
php_admin_value:

  27. 27. Mod_security

  28. 28.   É
um
firewall
de
aplicação
web
(WAF).
   É
um
módulo
do
Apache.
   Monitoramento,
detecção
e
prevenção
em

 tempo
real.
   Existem
arquivos
de
regras
disponíveis
para
 download.
   Você
mesmo
pode
criar
suas
regras.
   É
possível
criar
whitelists.

  29. 29. Suhoshin

  30. 30.   Um
patch
para
o
PHP
que
pode
ser
utilizado 
como
estensão.
   Proteção
em
tempo
de
execução.
   Tem
modo
de
simulação
e
proteção.
   Aceita
filtrar
entrada
de
dados.
   Permite
encriptar
sessões.
   Proteção
de
memória.
   Aplica
limites
de
requisições
por
tipo
de
variável.
   Várias
opções
de
logs.
   Aceita
criar
whitelist/blacklist.

  31. 31. Cuidados
com
logs
e
exibição
 de
erros
em
ambiente
de
 produção

  32. 32.   Gravar
logs
de
erros
é
útil
para
debugar
 problemas.
   O
usuário
não
deve
ter
acesso
a
todas
as
 informações
de
erro.
   Exibir
erros
em
ambiente
de
produção
pode
 fornecer
informações
sobre
sistema
e
 servidor.

  33. 33. Opções
de
erros
e
logs
no
 php.ini

  34. 34.   error_reporting
–
Define
quais
níveis
de
erros
 serão
reportados.
   display_errors
–
Determina
se
os
erros
devem
 ser
exibidos
como
parte
da
saída
ou
não.
   log_errors
–
Define
se
os
erros
serão
gravados
 em
arquivo
ou
não.
   error_log
–
Define
em
qual
arquivo
os
erros
 serão
gravados.
Necessita
que
o
log_errors
 esteja
ativado.

  35. 35. Programando
com
segurança

  36. 36.   Sempre
verifique
o
tipo
de
dado,
utilize
funções 
ctype_alpha,
ctype_alnum,
ctype_digit, 
is_numeric,
is_digit,
e
expressões
regulares.
   Filtre
os
dados
de
entrada
com
funções
do
tipo 
filter_var
e
filter_input.
   Utilizar
funções
de
escape
output,
como
por 
exemplo
htmlentities,
strip_tags.
   Nunca
utilize
magic_quotes.
   Nunca
armazene
senha
em
texto
plano,
utilize 
hashes
(md5,
sha1,
…).
   Utilize
require_once
no
lugar
de
include.
   Nunca
confie
em
usuário,
sempre
verifique
a 
origem
dos
dados.

  37. 37. Referências

  38. 38.   Site
oficial
da
linguagem
php:
 http://www.php.net
   Site
oficial
do
mod_security
 http://www.modsecurity.org
   Site
oficial
do
suhoshin:
 http://www.hardened‐php.net/suhosin/
   Site
oficial
do
phpsecinfo:
 http://phpsec.org/projects/phpsecinfo/index.html
   Site
oficial
do
Chorizo:
 https://chorizo‐scanner.com

  39. 39. Perguntas?
 cborges@openbsd‐sp.org
 IRC:
irc.freenode.net
 Canais:
slackware‐br,
sysadms,
openbsd‐br,
opensd‐sp


×