Entenda as Vulnerabilidades de Inclusão de Arquivos em Aplicações Web

Beginner

Introdução

Bem-vindo ao nosso curso introdutório sobre vulnerabilidades em aplicações web, com foco específico em vulnerabilidades de inclusão de arquivos (file inclusion), que estão entre os problemas mais prevalentes em aplicações web.

Neste módulo, começaremos dissecando o conceito de 'inclusão de arquivos' no contexto de aplicações web. Em seguida, construiremos sobre essa base para elucidar o que constitui uma 'vulnerabilidade de inclusão de arquivos'. Por fim, mergulharemos nas duas categorias principais de vulnerabilidades de inclusão de arquivos.

Na seção subsequente deste módulo, aprofundaremos nas 'Vulnerabilidades de Inclusão de Arquivos Locais' (Local File Inclusion Vulnerabilities) e 'Vulnerabilidades de Inclusão de Arquivos Remotos' (Remote File Inclusion Vulnerabilities), fornecendo-lhe uma compreensão abrangente dessas questões críticas de segurança.

Principais Resultados de Aprendizagem
  • Compreender o conceito fundamental de inclusão de arquivos em aplicações web.
  • Entender os princípios subjacentes às vulnerabilidades de inclusão de arquivos.
  • Aprender sobre os dois tipos principais de vulnerabilidades de inclusão de arquivos: Local e Remota.
Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 96%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Entendendo a Inclusão de Arquivos

Vamos nos aprofundar no conceito de "inclusão de arquivos" (file inclusion) e suas potenciais vulnerabilidades, especialmente adaptado para iniciantes.

A inclusão de arquivos é uma prática comum em programação, particularmente no contexto de reutilização de código. Os desenvolvedores frequentemente encapsulam funções ou módulos de uso frequente em arquivos separados. Quando essas funções ou módulos são necessários, eles simplesmente incluem esses arquivos em seu código, eliminando a necessidade de escrever o mesmo código repetidamente.

Em PHP, existem quatro funções principais para inclusão de arquivos:

  1. include()
  2. require()
  3. include_once()
  4. require_once()

Aqui está um breve resumo de cada uma:

  • include(): Esta função inclui um arquivo quando é invocada. Se o arquivo não for encontrado, o PHP emite um aviso (warning), mas o script continua a ser executado.
  • require(): Esta função inclui um arquivo antes que o script comece a ser executado. Se o arquivo não for encontrado, o PHP emite um erro fatal e interrompe o script.
  • include_once() e require_once(): Estas funções funcionam de forma semelhante a include() e require(), mas garantem que o arquivo seja incluído apenas uma vez, mesmo que a função seja chamada múltiplas vezes.

Os métodos de inclusão de arquivos podem ser amplamente categorizados em dois tipos:

  1. Inclusão estática (Static inclusion)
  2. Inclusão dinâmica (Dynamic inclusion)

A distinção entre esses dois tipos será esclarecida com um exemplo nas seções seguintes.

Em nosso curso, exploraremos três arquivos .php localizados no diretório /home/labex/project/. Estes são:

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

Vamos entender o que cada arquivo faz:

  • lfi_static.php: Este arquivo inclui o arquivo echo.php de forma estática. Em outras palavras, o caminho para o arquivo echo.php é codificado (hard-coded) e não muda. Este método é seguro e não expõe vulnerabilidades.

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php: Este arquivo inclui outros arquivos com base em um parâmetro 'file' na URL. Se este parâmetro não for fornecido, ele simplesmente fornece uma dica sobre como usá-lo. No entanto, este método pode ser arriscado se o parâmetro for controlado por um atacante.

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php: Este arquivo simplesmente exibe uma mensagem de sucesso quando incluído.

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

Use os seguintes comandos no terminal para preparar a imagem para o teste de lfi:

cd ~/projects
docker build -t lfi-image .

Quando a construção da imagem for concluída, você pode usá-la para iniciar um contêiner para testar a vulnerabilidade lfi:

docker run -d --name lfi -p 80:80 lfi-image

Agora você pode testar esses arquivos no seu navegador. Por exemplo, para acessar o arquivo lfi_static.php, você deve inserir a seguinte URL:

http://127.0.0.1/LFI/lfi_static.php

Você verá que o arquivo lfi_static.php inclui com sucesso o conteúdo de echo.php. Lembre-se, este método estático de inclusão de arquivos é seguro.

Agora, vamos olhar para o arquivo lfi_dynamic.php. Acesse-o usando esta URL:

http://127.0.0.1/LFI/lfi_dynamic.php

Você verá um aviso solicitando que você use o parâmetro 'file'. Vamos fazer isso e incluir echo.php:

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

Você verá que echo.php foi incluído com sucesso. Isso demonstra como a inclusão de arquivos funciona. É importante lembrar que, embora este seja um exemplo em PHP, os princípios se aplicam a outras linguagens de programação, mesmo que as funções específicas usadas possam ser diferentes.

Entendendo a Vulnerabilidade de Inclusão de Arquivos

Recentemente, aprendemos como incluir o arquivo echo.php usando o parâmetro file em lfi_dynamic.php. Mas surge uma questão:

É possível incluir outros arquivos usando o parâmetro file?

A resposta é um sonoro sim!

Se o desenvolvedor web negligenciar a validação do parâmetro file, ele pode ser explorado para incluir arquivos sensíveis localizados no servidor.

Aqui estão alguns exemplos:

  • Em um sistema Linux, você pode ser capaz de incluir o arquivo /etc/passwd.
  • Em um sistema Windows, você pode potencialmente incluir o arquivo C:\Windows\System32\drivers\etc\hosts.

Vamos ilustrar isso com um exemplo. Suponha que definimos o parâmetro file como /etc/passwd:

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

Abra a URL no navegador, você verá que incluímos e exibimos com sucesso o conteúdo do arquivo /etc/passwd. Isso indica a presença de uma vulnerabilidade de Inclusão de Arquivo Local (Local File Inclusion - LFI), que é uma séria questão de segurança.

Lembre-se, entender essas vulnerabilidades é o primeiro passo para preveni-las. Sempre garanta a validação e higienização (sanitization) de todas as entradas do usuário em suas aplicações web.

Tipos de Vulnerabilidades de Inclusão de Arquivos

As vulnerabilidades de inclusão de arquivos (file inclusion vulnerabilities), uma questão crítica na segurança web, são geralmente divididas em dois tipos principais:

  1. Inclusão de Arquivo Local (Local File Inclusion - LFI): Este tipo de vulnerabilidade ocorre quando arquivos locais no servidor alvo são incluídos.

  2. Inclusão de Arquivo Remoto (Remote File Inclusion - RFI): Este tipo de vulnerabilidade acontece quando arquivos localizados em um servidor diferente e remoto são incluídos.

No exemplo que discutimos anteriormente, a inclusão do arquivo local /etc/passwd é um caso clássico de vulnerabilidade de Inclusão de Arquivo Local (LFI). Entender a distinção entre esses dois tipos de vulnerabilidades é crucial para proteger eficazmente suas aplicações web.

Resumo

Neste laboratório, você aprendeu o método e o processo de iniciar um ataque através da funcionalidade de inclusão de arquivos (file inclusion). Vamos revisar os pontos importantes abordados nesta seção:

  • O que é inclusão de arquivos?
  • O que é uma vulnerabilidade de inclusão de arquivos?
  • Quais são os dois tipos de vulnerabilidades de inclusão de arquivos?