Pelo exemplo a seguir podemos ver uma inclusão local de arquivos.
$var=$_GET['var'];
include "/home/pages/" . $var . ".php";
?>
Podemos ver que o programador colocou uma "proteção" para abrir apenas arquivos .php, mas como o include não foi declarado de forma correta um usuário malicioso pode inserir um arquivo arbitrário como /etc/passwd.
Um método para a exploração da falha seria algo como por example http://site.com/page.php?var=../../../../etc/passwd
Isto não irá funcionar pois o programador colocou uma "proteção" para abrir apenas arquivos ".php"
Enão para o php o resultado seria algo como
include "/home/pages/../../../../etc/passwd.php"
[...]
?>
E o ataque não seria bem sucedido.
Mas este tipo de proteção é falha, pois permite a inserção de um caractere NULL no final da string.
A nova string ficaria assim ttp://site.com/page.php?var=../../../../etc/passwd
E para o php:
include "/home/pages/../../../../etc/passwd.php"
?>
Como tem este caractere NULL o php ignora a verificação da extensão "php" e o usuário malicioso consegue ler o arquivo /etc/passwd normalmente.
Se colocarmos no php.ini o register_globals para off e magic quotes para on este tipo de erro não acontece ou podemos criar um arquivo .htaccess para forçar o register_globals e magic quotes.
Exemplo do .htaccess:
# php
php_value "register_globals" "off"
php_value "magic_quotes_gpc" "on"
php_value "magic_quotes_runtime" "on"
php_value "display_errors" "off"
Apenas configurar o php.ini de forma correta é um "falso senso de segurança", então vamos arrumar o código para que não acontece o erro.
No exemplo a seguir o código está corrigido e filtrando os dados incluídos.
$var=$_GET['var'];
if(!ereg('^[ a-zA-Z0-9]{1,50}$',$var))$var="error";
include "/home/pages/" . $var . ".php";
?>
quinta-feira, 15 de maio de 2008
Assinar:
Postar comentários (Atom)

Um comentário:
Muito bom esse artigo Verin, parabéns.
O blog está ótimo.
Espero que continue postando mais e mais artigos ^^
Postar um comentário