O que é a vulnerabilidade File Inclusion?

11:23 Adriano Rocha 1 Comentarios




File Inclusion é uma das vulnerabilidades mais comuns em aplicações web e ocorre quando a inclusão de ficheiros externos à aplicação principal é feita sem validação.
Sites em PHP que fazem uso da função include() de um modo inseguro, tornam-se vulneráveis a estes ataques.

O que a função include() faz?
Um desenvolvedor pode incluir conteúdo de um arquivo PHP dentro de outro arquivo PHP usando a função include(). Por exemplo:
Vamos supor que tenhamos dois arquivos PHP:

file1.php

<?php
echo “Modelo php file 1…”;
?>
file2.php
<?php
echo “Modelo php file 2…”;
?>
Se o desenvolvedor deseja o conteúdo do arquivo file2.php em file1.php, simplesmente pode utilizar o seguinte comando:

<?php
include(‘file2.php’);
echo “Modelo php file 1…”;
?>
Isto pode ser um problema, pois além de ser possível incluir o conteúdo de um arquivo dentro de outro, também é possível que um desenvolvedor inclua um arquivo fazendo input como usuário. E quando o input do usuário não é validado corretamente, um atacante pode incluir arquivos maliciosos no servidor.

A File include é uma vulnerabilidade que pode ser dividida em duas partes:
Local File Inclusion (LFI) e Remote File Inclusion (RFI), este último, aliás, do qual já falamos em artigos anteriores aqui no Site Blindado Labs.

Como o Local File Inclusion é utilizado?
Os desenvolvedores costumam utilizar a função include de duas maneiras: a primeira delas é obtendo o arquivo como entrada de usuário. A segunda, é obtendo o arquivo como entrada do usuário, porém anexando uma extensão.
O trecho abaixo mostra o exemplo de um código vulnerável para lfi.php

<?php
echo ‘<br/>’;
echo ‘Ola’;
echo ‘<br/>’;
echo ‘<br/>’;
echo ‘<html>
<body>
<a href=”index.php?page=news.php”><button>Mostrar News</button></a>
</body>
</html>
‘;
echo ‘<br/>’;
echo ‘<br/>’;
include($_GET[‘page’]);
echo ‘<br/>’;
?>

No código apresentado, é possível notar que a aplicação está recebendo um arquivo do cliente utilizando uma requisição no método GET e incluindo-no diretamente na página atual. Quando usuário clica em “Mostrar News”, na página, é exibido o conteúdo do arquivo news.php.
Além disso, uma pessoa mal-intencionada consegue alterar os diretórios do site na URL, tendo acesso a arquivos do servidor. Veja um exemplo:

meusite.com.br/lfi/index.php?page=news.php

Após a alteração:

meusite.com.br/lfi/index.php?page =/etc/passwd

Essa vulnerabilidade é conhecida como Path Traversal e ocorre porque, uma vez que o caminho é inserido dentro da URL e dado ao código PHP, a codificação do arquivo lfi.php ficará vulnerável e exposta, como é mostrado abaixo:

<?php
echo ‘<br/>’;
echo ‘Ola’;
echo ‘<br/>’;
echo ‘<br/>’;
echo ‘<html>
<body>
<a href=”index.php?page=news.php”><button>Mostrar News</button></a>
</body>
</html>
‘;
echo ‘<br/>’;
echo ‘<br/>’;
include(“/etc/passwd”);
echo ‘<br/>’;
?>

Por consequência, o conteúdo do arquivo será carregado.
O LFI se torna perigoso pois um atacante poderia percorrer os diretórios do servidor e conseguir obter acesso a dados sensíveis.
Uma pessoa mal-intencionada, que tenha identificado que a aplicação está lendo os arquivos de usuários, poderia simplesmente fazer um input de um arquivo malicioso.

Quais as recomendações para evitar ataques LFI e RFI?
Para prevenir estes dois tipos de ataque, é necessário validar as entradas dos usuários. O método de prevenção será o mesmo para as duas vulnerabilidades e é possível seguir os passos que já explicamos no post dedicado ao RFI (veja aqui).
Além disso, o valor de “allow_url_include” deverá estar em “on” para que o LFI funcione. Sendo assim, para prevenir de ataques LFI atribui o valor “off” para o “allow_url_include”.
O mesmo pode ser feito para ataques RFI, mas o valor a ser “setado” como “off” terá que ser o “allow_url_fopen”.

Referências:

Um comentário: