hacktricks/pentesting-web/file-inclusion/lfi2rce-via-temp-file-uploads.md
2023-06-06 18:56:34 +00:00

5.9 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Uploads de arquivos PHP

O motor PHP, ao receber um pacote POST com arquivos codificados em RFC 1867, cria um ou mais arquivos temporários que são usados para armazenar os dados dos arquivos enviados. Um script PHP que manipula uploads de arquivos deve usar a função move_uploaded_file para mover o arquivo temporário enviado para um local desejado (se o script exigir que o arquivo exista após o término, é claro). Quando o script termina, o motor PHP remove todos os arquivos temporários para os arquivos que foram enviados (se houver algum arquivo temporário restante após o término do script).

{% hint style="info" %} Como o invasor geralmente sabe onde esses arquivos temporários estão localizados, caso ele encontre uma Inclusão Local de Arquivo, ele pode carregar o arquivo sendo enviado e obter RCE. {% endhint %}

O principal problema para acessar o arquivo é basicamente adivinhar seu nome (que será "aleatório").

Exploração no Windows

Para gerar o nome aleatório no Windows, o PHP usa a função GetTempFileName. Ao procurar na documentação, podemos encontrar a seguinte explicação: A função GetTempFileName cria um nome de arquivo temporário com a seguinte forma:

<path>\<pre><uuuu>.TMP

  • O caminho é upload_tmp_dir, que normalmente é C:\Windows\Temp
  • O prefixo é geralmente: "php"
  • O <uuuu> é um valor hexadecimal exclusivo. No entanto:
    • Apenas os 16 bits inferiores do parâmetro uUnique são usados. Isso limita o GetTempFileName a um máximo de 65.535 nomes de arquivo exclusivos se os parâmetros lpPathName e lpPrefixString permanecerem os mesmos. É possível forçar a entrada.

Como vimos, é bastante fácil encontrar o arquivo temporário em sistemas Windows. E vai ficar mais fácil porque a força bruta não é necessária aqui, graças a uma peculiaridade do FindFirstFile que permite usar máscaras (<< como * e > como ?) em caminhos LFI no Windows. Graças a isso, pode-se formar um caminho de inclusão como este:

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

(Em alguns casos, uma máscara mais específica pode ser necessária, como php1<< ou phpA<<). Você pode fazer Brute-Force de máscaras mais específicas até encontrar o arquivo temporário enviado.

Exploração GNU/Linux

O valor aleatório do nome do arquivo é bom o suficiente para não ser previsível nem passível de Brute-Force. Para mais informações, verifique as referências.

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥