Segurança PHP - por Samyr Abdo

Preview:

DESCRIPTION

Apresentação que tem como objetivo mostrar algumas técnicas de segurança em programas desenvolvidos em PHP.

Citation preview

SEGURANÇA PHP

Samyr Abdo

XSS

XSS

XSS(Cross Site Scripting) é uma técnica utilizada para roubar sessões (cookies) em uma aplicação web.

Como funciona?

Injeção de tags html e comandos javascript em alguma função de um sistema.

XSS

Como atacar?

Simulando o ataque:

http://localhost/seguranca/xss.php?temp=<script>alert(document.cookie)</script>

XSS

Como se proteger?

htmlspecialchars() htmlentities()

Converte caracteres especiais para a realidade HTML

SESSIONS

SESSIONS

Como funciona?

Principais ataques: Session fixation Session hijacking.

SESSIONS - SESSION FIXATION

Como atacar?

<a href="http://www.dominio-exemplo.com?PHPSESSID=987654321">Acessar</a>

SESSIONS - SESSION FIXATION

Simulando o ataque:<?php

session_start(); if (!array_key_exists('visitas', $_SESSION)) $_SESSION['visitas'] = 1;else $_SESSION['visitas']++; echo $_SESSION['visitas'];

?>

SESSIONS - SESSION FIXATION

Testando a vulnerabilidade url + ?PHPSESSID=654321

SESSIONS - SESSION FIXATION

Como se proteger? Basta gerar novamente o identificador de sessão

toda vez que o usuário autenticar.Ex.:

<?phpif (usuario_autenticado()) { session_regenerate_id();}?>

SESSIONS - SESSSION HIJACKING

Ataque mais difícil de se proteger, porém mais difícil de ser explorado.

Devido ao identificador da sessão estar gravado em um cookie no navegador, o usuário malicioso pode explorar alguma vulnerabilidade do browser ou obter os cookies do navegador através de um ataque chamado XSS.

SESSIONS - SESSSION HIJACKING

Como se proteger? Chegar algum dos headers da aplicação. Criptografia md5

SESSIONS - SESSSION HIJACKING

Header “HTTP_USER_AGENT” Exemplo do Header no Mozilla:

Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1

Exemplo do Header no Chrome:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML,

like Gecko) Chrome/16.0.912.77 Safari/535.7

SESSIONS - SESSSION HIJACKING

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

INCLUDE X REQUIRE

INCLUDE X REQUIRE

Include(): Tenta incluir uma página. Em caso de erro, o script retorna um warning (aviso) e prossegue com a execução do script.

Require(): Tenta incluir uma página. Em caso de erro, o script retorna um fatal error e aborta a execução do script.

INCLUDE X REQUIRE

Como atacar? RFI (Remote File Inclusion) e LFI (Local File Inclusion)Ex:Endereço: index.php?url=[Parâmetro]

<?php

if (isset($_GET['url'])){

$pg = $_GET['url']; include($pg); }

?>

INCLUDE X REQUIRE

Como se proteger? RFI (Remote File Inclusion) – uso de expressões

regularesEndereço: index.php?url=[Parâmetro] <?phpif (isset($_GET['url'])){

$pg = $_GET['url'];$testa = '/([http])([:]{1})/';

if (preg_match($testa,$pg) != TRUE) include($pg);

else echo ‘ERRADO’;

} ?>

INCLUDE X REQUIRE

Como se proteger? LFI (Local File Inclusion) – configuração do php.ini

allow_url_fopen = Offpermite abrir ou processar uma página ou arquivo externo dentro do script php.

PHP.INI

PHP.INI

expose_php = offPermite reduzir a quantidade de informações

disponíveis para o invasor.

PHP.INI – OCULTANDO ERROS

error_reporting = E_ALLdisplay_errors = Off

Para que não seja exibido qualquer erro, aviso ou notice no site ou aplicativo.

PHP.INI – OCULTANDO ERROS

Ex:

Ocorreu um erro no banco de dados

Error Number: 1054

Unknown column 'ordem' in 'order clause'

SELECT `compra_contrata`.* FROM `compra_contrata` WHERE `status` = 1 AND `data_final` >= '2012-01-30' ORDER BY `ordem`

INICIALIZAÇÃO DE VARIÁVEIS

INICIALIZAÇÃO DE VARIÁVEIS

Como atacar?

<?php

if (authenticated_user()) {

     $authorized = true;}

?>

auth.php?authorized=1

INICIALIZAÇÃO DE VARIÁVEIS

Como se proteger?<?php

$authorized = false;

if (authenticated_user()) 

{$authorized = true;

}

?>

SQL INJECTION

SQL INJECTION

Como atacar?

"SELECT * FROM usuarios WHERE usuario= ‘{$usuario}’ AND senha = ‘{ $senha }’"

 

SQL INJECTION

Como atacar?

  ‘or 1=‘1

SELECT * FROM usuarios WHERE usuario = ‘ ‘ AND senha = ‘ ’ OR 1=‘1’

SQL INJECTION

Como se proteger?

addslashes()/stripslashes(): insere o caracter de escape antes de aspas

simples ou duplas, antes da barra invertida e antes do caracter NULL.

mysql_real_escape_string(): Escapa os caracteres especiais numa string para

usar em um comando SQL