Post on 06-Jun-2015
description
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