Toolkit de exploração de LFI / Path Traversal para CTFs e Bug Bounty.
Detecta automaticamente filtros do servidor e gera variantes de bypass em quatro módulos de ataque: path traversal, PHP wrappers, log poisoning e fuzzing de parâmetros.
pip install requestsPython 3.10+
python3 lfiter.py -u "<URL com FUZZ>" [opções] --<módulo>
A palavra FUZZ marca o ponto de injeção na URL.
| Flag | Descrição |
|---|---|
-u, --url |
URL alvo com FUZZ no ponto de injeção |
-f, --file |
Arquivo PHP alvo para ataques de wrapper (padrão: index.php) |
--os |
SO alvo: Linux (padrão) ou Windows |
--prefix |
Prefixo obrigatório no payload (para bypass de filtro de path) |
--cookie |
Cookie de sessão — ex: PHPSESSID=abc123 |
--header |
Header extra, repetível — ex: --header 'X-Token: abc' |
--proxy |
Proxy HTTP/S — ex: http://127.0.0.1:8080 |
--timeout |
Timeout por requisição em segundos (padrão: 5) |
--threads |
Quantidade de threads paralelas (padrão: 30) |
--wordlist |
Wordlist externa de parâmetros para --fuzz |
--output |
Salvar findings em .json ou .txt |
--no-auto-detect |
Pula detecção automática de filtros |
-v, --verbose |
Exibe payloads que falharam também |
Executa todos os quatro módulos em sequência com detecção de filtros compartilhada.
Testa 34 arquivos sensíveis (Linux ou Windows) com 13 variantes de bypass por path — ....//, %2e%2e/, %252e%252e%252f, ..%c0%af, null bytes, entre outros. Multithreaded.
Testa 15+ PHP stream wrappers:
| Wrapper | Finalidade |
|---|---|
php://filter/base64 |
Lê código-fonte PHP codificado em base64 |
php://filter/rot13 |
Lê código-fonte com codificação ROT13 |
php://filter/iconv |
Cadeia de encoding para bypass de filtros de saída |
php://filter/zlib |
Leitura comprimida em base64 |
php://filter/chain-rce |
Filter chain RCE (sem necessidade de upload) |
data://text/plain |
Execução de PHP inline |
data://text/plain;base64 |
RCE inline codificado em base64 |
php://input |
Execução via corpo do POST |
expect:// |
Execução direta de comandos (se habilitado) |
zip://, phar:// |
Inclusão de shell pós-upload |
Quando --prefix é definido, os resources dos wrappers são ajustados automaticamente para incluir o prefixo obrigatório + traversal.
Injeta payloads PHP via headers User-Agent e Referer, depois testa arquivos de log comuns para RCE usando ?cmd=id. Testa 5 funções de execução PHP (system, passthru, exec, shell_exec, popen) para contornar disable_functions parcial.
Também detecta e tenta PHP session poisoning automaticamente quando um cookie PHPSESSID está presente.
Arquivos de log testados: Apache, Nginx, auth.log, syslog, mail.log, vsftpd.log, /proc/self/environ.
Descobre qual parâmetro é vulnerável testando 44 nomes comuns de parâmetros (ou uma wordlist personalizada) com payloads de traversal. Multithreaded.
Antes de executar qualquer módulo, o LFIter envia 6 requisições de diagnóstico para detectar automaticamente:
| Regra | Significado |
|---|---|
blocks_dotdot |
Servidor bloqueia ../.. — ativa bypasses com ....// e encoding |
blocks_null |
Servidor bloqueia %00 — payloads com null byte são removidos |
extension_check |
Servidor força extensão .php — null byte é adicionado para truncar |
requires_prefix |
Um path específico deve aparecer no valor do parâmetro |
Os resultados são passados ao BypassEngine, que seleciona automaticamente as variantes de payload compatíveis para cada módulo.
Use --no-auto-detect para pular essa fase e configurar as regras manualmente via --prefix.
# Scan completo — detecta todos os filtros automaticamente
python3 lfiter.py -u "http://alvo.com/index.php?page=FUZZ" --all
# CTF com prefixo obrigatório no parâmetro
python3 lfiter.py -u "http://alvo.com/test.php?view=FUZZ" --all \
--prefix "/var/www/html/development_testing"
# Ler código-fonte de um arquivo PHP específico via wrappers
python3 lfiter.py -u "http://alvo.com/index.php?file=FUZZ" \
--wrappers --file config.php
# Descobrir o nome do parâmetro vulnerável
python3 lfiter.py -u "http://alvo.com/index.php" \
--fuzz --wordlist /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
# Log poisoning com sessão autenticada
python3 lfiter.py -u "http://alvo.com/page.php?view=FUZZ" \
--log --cookie "PHPSESSID=abc123"
# Scan completo via proxy Burp com output em JSON
python3 lfiter.py -u "http://alvo.com/?p=FUZZ" --all \
--proxy http://127.0.0.1:8080 \
--cookie "session=xyz" \
--output findings.json \
--threads 20Todo payload passa por BypassEngine.generate(), que produz variantes para um path-alvo com base nas regras detectadas. Quando requires_prefix está definido, o prefixo é anteposto e as sequências de traversal sobem a partir dele. Quando blocks_dotdot é True, variantes que ainda contêm ../.. são descartadas.
As 13 técnicas de traversal por nível de profundidade:
../ # direto
....// # sobrevive a remoção simples de ../
..././ # variação do double-dot
%2e%2e/ # ponto com URL encode
..%2f # barra com URL encode
%252e%252e%252f # double URL encode
..%c0%af # barra UTF-8 overlong
..%ef%bc%8f # barra full-width
..\ # backslash Windows
../../%00 # null byte — trunca extensão forçada
../../\x00 # null byte raw
..%2f%2f # barra dupla encoded
..%2F # barra uppercase encoded
Os findings são exibidos no stdout com cores por severidade. Use --output para salvar:
--output results.json # JSON estruturado
--output results.txt # texto simplesCombine o LFIter com o SecLists para maior cobertura:
Fuzzing/LFI/LFI-Jhaddix.txt
Discovery/Web-Content/burp-parameter-names.txt
O LFIter é destinado exclusivamente ao uso em sistemas próprios ou em sistemas para os quais você possui autorização explícita e por escrito. O uso não autorizado contra sistemas de terceiros pode ser ilegal. Os autores não se responsabilizam pelo uso indevido da ferramenta.