RFI (Remote File Inclusion): Entendendo o ataque e como se prevenir
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:
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.
Referências:
http://www.imperva.com/docs/HII_Web_Application_Attack_Report_Ed6.pdf
https://www.owasp.org/index.php/Testing_for_Remote_File_Inclusion
https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_Remote_File_Inclusion
https://en.wikipedia.org/wiki/File_inclusion_vulnerability
http://php.net/manual/en/filesystem.configuration.php
http://www.imperva.com/docs/HII_Web_Application_Attack_Report_Ed6.pdf
https://www.owasp.org/index.php/Testing_for_Remote_File_Inclusion
https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_Remote_File_Inclusion
https://en.wikipedia.org/wiki/File_inclusion_vulnerability
http://php.net/manual/en/filesystem.configuration.php
0 comentários: