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:
include()
require()
include_once()
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:
- Inclusão estática (Static inclusion)
- 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.