O documento discute técnicas de segurança PHP, incluindo XSS, sessões (fixação e sequestro), inclusão de arquivos (local e remoto), configurações PHP.ini e injeção SQL. Ele fornece exemplos de ataques e métodos de proteção como htmlspecialchars(), regeneração de IDs de sessão, expressões regulares e escapamento de strings.
3. 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.
4. XSS
Como atacar?
Simulando o ataque:
http://localhost/seguranca/xss.php?temp=<script>alert(doc
ument.cookie)</script>
5. XSS
Como se proteger?
htmlspecialchars()
htmlentities()
Converte caracteres especiais para a realidade HTML
11. SESSIONS - SESSION FIXATION
Como se proteger?
Basta gerar novamente o identificador de sessão toda
vez que o usuário autenticar.Ex.:
<?php
if (usuario_autenticado())
{
session_regenerate_id();
}
?>
12. 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.
13. SESSIONS - SESSSION HIJACKING
Como se proteger?
Chegar algum dos headers da aplicação.
Criptografia md5
14. 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
15. 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']);
}
?>
17. 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.
18. 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);
}
?>
19. INCLUDE X REQUIRE
Como se proteger?
RFI (Remote File Inclusion) – uso de expressões regulares
Endereço: index.php?url=[Parâmetro]
<?php
if (isset($_GET['url']))
{
$pg = $_GET['url'];
$testa = '/([http])([:]{1})/';
if (preg_match($testa,$pg) != TRUE)
include($pg);
else
echo „ERRADO‟;
}
?>
20. INCLUDE X REQUIRE
Como se proteger?
LFI (Local File Inclusion) – configuração do php.ini
allow_url_fopen = Off
permite abrir ou processar uma página ou arquivo externo
dentro do script php.
22. PHP.INI
expose_php = off
Permite reduzir a quantidade de informações disponíveis
para o invasor.
23. PHP.INI – OCULTANDO ERROS
error_reporting = E_ALL
display_errors = Off
Para que não seja exibido qualquer erro, aviso ou
notice no site ou aplicativo.
24. 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`
29. SQL INJECTION
Como atacar?
"SELECT * FROM usuarios WHERE usuario=
„{$usuario}‟ AND senha = „{ $senha }‟"
30. SQL INJECTION
Como atacar?
‘or 1=‘1
SELECT * FROM usuarios WHERE usuario = „ „
AND senha = „ ‟ OR 1=„1‟
31. 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