RFI (Remote File Inclusion): Entendendo o ataque e como se prevenir

17:28 Anônimo 0 Comentarios



Apesar de não ser um ataque de grande visibilidade por parte da mídia especializada, o RFI possui um potencial destrutivo tão poderoso quanto o SQL Injection ou ataques (XSS) Cross-Site Scripting. Uma vulnerabilidade que deve ser mitigada e investigada para evitar transtornos, algumas plataformas muito usadas são um dos principais alvos, como por exemplo, Wordpress.

Mas, o que é o ataque RFI?
A vulnerabilidade RFI, na tradução literal - inclusão remota de arquivos, é causada pela falta de validação do "input" de informações fornecidas pelo usuário, deixando passar scripts para uma aplicação Web. Parâmetros que são vulneráveis ao RFI permitem ao atacante incluir códigos de um arquivo hospedado remotamente em um script executado pelo servidor de aplicação. Assim que o código do atacante é executado no servidor Web, é possível que ele execute este código para roubar arquivos temporários, manipular arquivos e em longo prazo, a dominação total do servidor vulnerável.

Como o ataque pode ser feito:
Normalmente, os ataques RFI são realizados definindo o valor de um parâmetro de solicitação para uma URL referente a um arquivo malicioso.

Considere o seguinte código PHP:

$incfile = $_REQUEST["file"];
include($incfile.".php");

A primeira linha de código, extrai o valor do parâmetro de arquivo a partir da solicitação HTTP. Na segunda linha, define-se dinamicamente o nome do arquivo a ser incluído utilizando o valor extraído. Se o aplicativo Web não filtrar corretamente o valor do parâmetro de arquivo (por exemplo, através da verificação de uma White-list de execução), este código pode ser explorado maliciosamente. 

Considere a seguinte URL:

Neste caso, o nome do arquivo incluído será:

Desta maneira, o arquivo remoto será incluído e qualquer código nele será executado pelo servidor. Em muitos casos, os parâmetros da requisição são extraídos implicitamente (quando a variável register_globals está definida como Ligado). Neste caso, o próximo código também é vulnerável ao mesmo ataque:

include($file.".php");

Outros comandos PHP que são vulneráveis ao RFI estão no include_once, fopen, file_get_contents, require e require_once.

Prevenção:
Assim como todos os ataques de injeção de código, o RFI é o resultado da permissão do input de dados não seguros em uma plataforma segura. A melhor maneira de evitar um ataque RFI é nunca usar dados de entrada arbitrários em um campo, ou inclusão que só deveria aceitar dados puros sem código. Uma boa maneira de programar segurança em seu site é usando uma matriz para mapear o parâmetro da página do link para nomes de arquivos reais no servidor:

<?php
 $page_files=array( 'about'=>'about.html',
                    'photos'=>'photos.html',
                    'contact'=>'contact.html',
                    'home'=>'home.html'
                  );
if (in_array($_GET['page'],array_keys($page_files))) {
      include $page_files[$_GET['page']];
 } else {
      include $page_files['home'];
}
?>

No exemplo de código PHP acima, o parâmetro "page" na URL é meramente um símbolo que mapeia o nome do arquivo definido dentro do script. Se a solicitação de URL não contém um token válido, o site carrega a home page. Por isso, é quase impossível para um atacante utilizar um RFI malicioso para este pedido.
É sempre bom também investir um trabalho extra na concepção de um back-end que seja imune a RFI. Vale muito a pena em comparação com os riscos de deixar brechas para ataques deste tipo.

Outra solução viável é a utilização de um WAF (Firewall de aplicações web), que conseguem lidar com esta ameaça e bloquear esse tipo de exploit (sequência de comandos, dados ou uma parte de um software malicioso) usando assinaturas que devem coincidir com os parâmetros da aplicação utilizada. Detecção e bloqueio de tais ataques podem ser melhorados através da criação de uma black list de fontes de ataque e outra de URLs. Ter uma base de conhecimentos avançados sobre fontes de ataque RFI permite que o WAF para bloquear um ataque antes mesmo de começar.


0 comentários: