hacktricks/pentesting-web/file-inclusion/lfi2rce-via-temp-file-uploads.md

3.6 KiB

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Confira os detalhes completos desta técnica em https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf

Upload de Arquivos PHP

Quando um mecanismo PHP recebe uma solicitação POST contendo arquivos formatados de acordo com o RFC 1867, ele gera arquivos temporários para armazenar os dados enviados. Esses arquivos são cruciais para o tratamento de upload de arquivos em scripts PHP. A função move_uploaded_file deve ser usada para mover esses arquivos temporários para um local desejado, se for necessário armazenamento persistente além da execução do script. Após a execução, o PHP exclui automaticamente quaisquer arquivos temporários restantes.

{% hint style="info" %} Alerta de Segurança: Hackers, cientes da localização dos arquivos temporários, podem explorar uma vulnerabilidade de Inclusão de Arquivo Local para executar código acessando o arquivo durante o upload. {% endhint %}

O desafio para o acesso não autorizado está em prever o nome do arquivo temporário, que é intencionalmente randomizado.

Exploração em Sistemas Windows

No Windows, o PHP gera nomes de arquivos temporários usando a função GetTempFileName, resultando em um padrão como <caminho>\<prefixo><uuuu>.TMP. Notavelmente:

  • O caminho padrão é tipicamente C:\Windows\Temp.
  • O prefixo é geralmente "php".
  • O <uuuu> representa um valor hexadecimal único. Crucialmente, devido à limitação da função, apenas os 16 bits inferiores são usados, permitindo um máximo de 65.535 nomes únicos com caminho e prefixo constantes, tornando a força bruta viável.

Além disso, o processo de exploração é simplificado em sistemas Windows. Uma peculiaridade na função FindFirstFile permite o uso de curingas em caminhos de Inclusão de Arquivo Local (LFI). Isso possibilita a criação de um caminho de inclusão como o seguinte para localizar o arquivo temporário:

http://site/vuln.php?inc=c:\windows\temp\php<<

Em certas situações, pode ser necessário um máscara mais específica (como php1<< ou phpA<<). Pode-se tentar sistematicamente essas máscaras para descobrir o arquivo temporário enviado.

Exploração em Sistemas GNU/Linux

Para sistemas GNU/Linux, a aleatoriedade na nomenclatura de arquivos temporários é robusta, tornando os nomes não previsíveis nem suscetíveis a ataques de força bruta. Mais detalhes podem ser encontrados na documentação referenciada.