Ads Top

Ataques comuns do PHP: Directory Traversal



O que é Directory Traversal?


Durante um ataque de desvio de diretório, o invasor enviará um nome de arquivo contendo caracteres que permitirão acessar arquivos fora do diretório pretendido. Por exemplo, um único ponto (.) Refere-se ao diretório atual e dois pontos (..) ao diretório pai. Durante um ataque, o objetivo será acessar e ler arquivos restritos usando os privilégios elevados do PHP. Por exemplo, arquivos fora do diretório raiz (public_html, por exemplo, no Apache) não são acessíveis na Internet, mas o PHP provavelmente terá privilégios para ler e executar esses arquivos. Outro exemplo seria exibir o conteúdo dos arquivos PHP no servidor, que pode conter informações valiosas, como credenciais do banco de dados.

Exemplo:


$page = $_GET;
$filename = "/pages/$page";
$file_handler = fopen($filename, "r");
$contents = fread($file_handler, filesize($file));
fclose($file_handler);
echo $contents;

Uso malicioso

view.php?page=../admin/login.php

Neste exemplo, em vez de obter um arquivo do diretório de páginas, o ../ passa para o diretório dos pais, obtendo o arquivo /admin/login.php. Isso é muito ruim, pois provavelmente conterão credenciais de administrador ou de banco de dados; caso contrário, poderia conter caminhos para outros arquivos PHP que conterão essas informações. O invasor pode então usar o mesmo método novamente para obter esses outros arquivos e obter informações valiosas. Essas credenciais poderiam então ser usadas para realizar um ataque mais desanimador de roubar detalhes do usuário, desfigurar, excluir arquivos / registros ou seqüestrar o site, espalhando software malicioso ... para citar alguns.


Solução

Você pode ficar tentado a usar o regex para remover todos os ../s, mas existem algumas boas funções incorporadas ao PHP que farão um trabalho muito melhor:

$page = basename(realpath($_GET));

basename - remove todas as informações de diretório do caminho, por exemplo ../pages/about.php se tornaria about.php
realpath - retorna um caminho completo para o arquivo, por exemplo about.php se tornaria /home/www/pages/about.php, mas apenas se o arquivo existir.

Combinados, eles retornam apenas o nome dos arquivos, mas apenas se o arquivo existir.


Nenhum comentário:

Tecnologia do Blogger.