# LFI - Local File Inclusion

Essa vulnerabilidade ocorre quando a aplicação permite que o usuário inclua algum arquivo. Vamos supor que no código fonte há um include que pega por parâmetro via GET e inclui esse arquivo.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYWc6JuA0eoVJ6o_qGo%2F-MYWhWQiPlk2RFXKEkrf%2Fimage.png?alt=media\&token=fe6fcaa9-b672-45ef-a272-e901dd28daf6)

Com isso, podemos testar colocar uma  barra "/" no parâmetro **file** para ver como que a aplicação se comporta.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYWc6JuA0eoVJ6o_qGo%2F-MYWhxhX-xUm0keskngv%2Fimage.png?alt=media\&token=71c5b33d-b2b7-4e90-b084-60df4b7da2e4)

Como esperado, a aplicação tentará incluir o que for passado no parâmetro. Podemos então navegar pelas pastas voltando e lendo alguns arquivos sensíveis, como o **/etc/passwd** por exemplo.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYWc6JuA0eoVJ6o_qGo%2F-MYWiRECXDaWB2D6oFdx%2Fimage.png?alt=media\&token=d115467f-72ff-4f2c-ac09-562a28915ec7)

E pronto, conseguimos ler um arquivo no servidor.

Essa é até uma falha pouco provável de achar, apenas acontecerá se o desenvolvedor realmente confiar no controle que o usuário tem da aplicação, que é algo que não se deve fazer.



### Infecção de logs

Uma técnica para conseguirmos uma shell com a falha de LFI, é infectar algum arquivo de logs de algum serviço, como por exemplo, o do apache. O arquivo de logs do apache fica localizado em **/var/log/apache2/access.log**. A ideia é enviarmos uma requisição maliciosa para o servidor e após isso, utilizar a LFI para ler esse arquivo de log, assim ele irá exibir a requisição e se houver um script PHP ele irá interpretar. Se enviarmos uma requisição ou um arquivo pelo netcat com um comando **\<?php system($\_GET\['cmd']); ?>** e depois disso lermos o arquivo de logs, ele irá permitir que nós conseguiremos executar um comando no sistema alvo que for passado por parâmetro. Com isso, podemos conseguir uma shell e comprometer esse sistema.

### PHP Wrappers

Uma outra forma de explorarmos essa falha, é utilizarmos o php wrappers. Passando qualquer valor, a aplicação retorna esse erro, está inserindo **".php"** no final do arquivo passado por parâmetro.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MZ8Ik-qfMuOqGCx3cAU%2F-MZ8yDnbe-d3SDXJ4_TL%2Fimage.png?alt=media\&token=1e122a13-9552-4daf-992c-6ce01afb4a82)

Agora passando o wrapper data:// podemos inserir um código php logo em seguida.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MZ8Ik-qfMuOqGCx3cAU%2F-MZ8z9dfC6wEtJb_7oXf%2Fimage.png?alt=media\&token=19a374fe-65e1-4336-b2e9-9672650df647)

Não apareceu nada na tela, mas se visualizarmos o código fonte, veremos que foi executado normalmente.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MZ8Ik-qfMuOqGCx3cAU%2F-MZ8zMHunENRbcBK-NVU%2Fimage.png?alt=media\&token=7e325ec1-02dd-4263-b5a1-8117c72b4882)

Obs: geralmente esse wrapper é passado da seguinte forma: **data://text/plain;base64**,**\<código aqui em base64>** porém nesse caso não foi necessário codificar para base64.
