Entendendo e explorando Unrestricted File Upload

storme
4 min readNov 16, 2021

A vulnerabilidade comumente conhecida como Unrestricted file upload proporciona à aplicação que a possui um risco imenso, uma vez que pode possibilitar que um agente mal intencionado invada a aplicação e tenha controle sobre ela.

A exploração dessa falha se decorre em um cenário onde a aplicação não bloqueia um arquivo malicioso enviado, podendo essa processar o conteúdo desse arquivo (comandos), sobrescrever algum arquivo crítico (impossibilitaria o fluxo comum de funcionamento), entre outras possibilidades. Também vale ressaltar que um upload de arquivo irrestrito também pode ser aproveitado para realizar ataques via Client-side, como por exemplo a execução de um comando de JavaScript que estava no nome do arquivo enviado (XSS).

O método de exploração dessa vulnerabilidade varia de caso para caso, além dos comentados anteriormente, como execução de comandos no servidor que hospeda a aplicação, sobrescrição de arquivos críticos e execução de comandos no lado do usuário, também é possível realizar o envio de arquivos muito grandes para lotar a memória e prejudicar o upload de outros usuários, execução de arquivos executáveis do lado do servidor (.exe), até mesmo enviar um arquivo contaminado por um vírus.

Possíveis Bypass’s:

#Modificando a extensão do arquivo:

Algumas aplicações bloqueiam determinados tipos de arquivos que recebem, mas muitas acabam esquecendo de outros tipos, o que acaba não sendo uma proteção efetiva. Alguns exemplos de tipos de arquivos não bloqueados são os com terminação “.php5”, “.pht”, “.phtml”, “.shtml”, “.swf”, “.xap”, entre outros. Também é possível burlar algumas aplicações apenas modificando o tamanho da caixa das letras, como por exemplo modificar o nome do arquivo de “.php” para “.PHp”.

#Modificando o Content-Type da requisição de upload utilizando um proxy

#Inserindo espaços, barras, virgulas e pontos finais no final do nome do arquivo

#Enviar um arquivo com duas extensões, exemplo: storme.php.jpg

#Inserir um null byte, exemplo: storme.php%00.jpg

entre outras possibilidades…

Exploração prática

Um caso comum e de simples exploração é onde a aplicação aceita e processa um arquivo que contém um comando php em seu servidor, a exploração decorre conforme a sequência abaixo:

Vale ressaltar que os conhecimentos fornecidos por esse material são para fins educacionais, não tente aplicá-los em um cenário que você não tem permissão, isso é crime 😊

A exploração exemplificada abaixo foi decorrida em um ambiente controlado: Máquina rootme do tryhackme

  • Criação de arquivo php com comando para web shell

<?php system($_GET[‘cmd’]);?>

Arquivo php com comando de uma WebShell simples
  • Fazendo upload do arquivo malicioso
Upload arquivo criado com extensão “.php”
  • A aplicação pode bloquear o tipo de arquivo enviado assim como ocorreu no caso exemplificado:
Aplicação não aceita arquivo tipo php
  • Podemos tentar burlar isso modificando a extensão do arquivo, tentaremos mudar de “.php” para “.php5”
  • Tentando enviar o arquivo novamente
  • Abrindo arquivo
  • Interagindo com a Web Shell utilizando o parâmetro definido na Web Shell (após o nome do arquivo é preciso declarar uma interrogação, o nome do parâmetro e o comando a ser executado: shellzinha.php?cmd=ls -la/)
Execução de comando “ls -la /”

Seria possível prosseguir com a exploração sem muitas dificuldades, mas como só queria explicar melhor a exploração dessa falha vou parar por aqui :)

Conclusão

Os desenvolvedores precisam se atentar para qualquer entrada provida pelos usuários de suas aplicações. Uma aplicação que apresenta um upload de arquivo irrestrito está em risco alto e prorciona a um atacante um bom caminho de entrada.

Espero ter ajudado, bons estudos!

“No mundo do hacking, ao parar você não fica estagnado na mesma posição, você começa a regredir, nunca pare!”. Storme

Caso queira entrar em contato comigo:

https://www.instagram.com/ohomemnaoparanunca/

Referências:

--

--