File Upload
Ataque extremamente útil para realizar upload de arquivos maliciosos em sites e/ou sistemas.
Imaginamos um cenário onde podemos fazer upload de uma Web Shell, e assim conseguir embutir comandos Linux através desse arquivo. Feito isso podemos ler arquivos do servidor, e é claro ler os arquivos do próprio sistema web, que provalmente deve ter alguma autenticação no banco de dados, chaves SSH, variáveis de ambiente com keys, etc.
Linguagens e Suas Extensões
LINGUAGEM / PLATAFORMA
EXTENSÕES
PHP
.phtml .php .php2 .php3 .php4 .php5 .php.test .inc .ptar
ASP
asp .aspx
PERL
.pl .cgi .pm .lib
JSP
.jsp .jspx .jsw .jsv .jspf
ColdFusion
.cfm .cfml .cfc .db
DICA: Sempre que possível, utilize a extensão .phtml
, pois os servidores web PHP geralmente permitem direitos de execução de código.
Windows
Gerando Erros
Utilize arquivos com nomes que contém caracteres reservados, como |
, <
, >
, *
ou ?
. Esses caracteres geralmente são reservados para usos especiais, como curingas. Provalvemente se você já tentou criar arquivos com um desses caracteres, você recebeu uma mensgem de erro informando que deve escolher um nome válido. Se o aplicativo da web não limpar adequadamente esses nomes ou colocá-los entre aspas, eles podem se referir a outro arquivo (que pode não existir) e causar um erro que divulga o diretório de upload. Da mesma forma, podemos usar nomes reservados do Windows para o nome do arquivo carregado, como (CON
, COM1
, LPT1
ou NUL
), o que também pode causar um erro, pois o aplicativo da Web não terá permissão para gravar um arquivos com esses nomes.
Replace Files
Finalmente, podemos utilizar a Convenção de Nome de Arquivo do Windows 8.3 para substituir arquivos existentes ou fazer referência a arquivos que não existem. As versões mais antigas do Windows eram limitadas a um tamanho curto para nomes de arquivos, então eles usavam um caractere ~
(Til) para completar o nome do arquivo, que podemos usar a nosso favor.
Por exemplo, para fazer referência a um arquivo chamado mysther.txt
podemos usar MYS~1.TXT
ou MYS~2.TXT
, onde o dígito representa a ordem dos arquivos correspondentes que começam com MYS
. Como o Windows ainda suporta essa convenção, podemos escrever um arquivo chamado por exemplo, WEB~.CONF
para substituir o arquivo web.conf
. Da mesma forma, podemos escrever um arquivo que substitua arquivos de sistema confidenciais. Esse ataque pode levar a vários resultados, como causar divulgação de informações por meio de erros, causar um DoS no servidor back-end ou até mesmo acessar arquivos privados.
Configuração Apache
A configuração abaixo é como o servidor web determina quais arquivos permitirão a execução do código PHP. Ele especifica uma lista branca com um padrão regex que corresponde a .phar,
.php
e .phtml
. No entanto, esse padrão regex tem o mesmo erro de esquecer de terminá-lo com $
. Nesses casos, qualquer arquivo que contenha as extensões acima terá permissão para execução de código PHP, mesmo que não termine com a extensão PHP. Por exemplo, o nome do arquivo (shell.php.jpg) deve passar no teste anterior da lista de permissões, pois termina com (.jpg), e seria capaz de executar o código PHP devido à configuração incorreta acima, pois contém (.php) em seu nome.
Página Web com File Discovery
Em alguns casos, podemos ver páginas web que listam os nomes de arquivos de upload. Em alguns cenários podemos inserir arquivos nesses diretórios, utilizando o método HTTP PUT.
Levando em conta que esteja utilizando a URL acima e o Burp Suite para realizar o upload, a URL no Burp iria ser http://site.com/uploads/<file>
e no body deverá ter o conteúdo do arquivo que será enviado ao web server. Deverá ser retornado no cabeçalho algo como HTTP/1.1 201 Created
.
DICA: Caso o método DELETE também esteja indisponível, podemos apagá-lo com o comando: curl http://site.com.br/uploads -X DELETE
Null Byte
Isso só funciona em versões abaixo do PHP 5.3 e caso não funcione, substitua %00
por %2500
. Em situações de falha, podemos contornar isso de outra maneira, substituindo %00
por ?
. Colocando a interrogação, o sistema pode entender que se trata de parâmetros GET. Em alguns casos, também pode ser útil tentar utilizar um \x00
.
Double Extensions
Para "bypassar" a extensão do arquivo, renomeie para os padrões shell.php.jpg
, shell.php:.jpg
, shell.php;.jpg
, etc
Nginx
Existe uma falha no Nginx que permite fazer upload e executar arquivos php de uma forma um pouco diferente. Para isso, vamos fazer upload do shell php, porém com uma extensão diferente, exemplo:
Agora ao acessarmos o arquivo, iremos repetir o nome do arquivo na URL (no exemplo acima demos o nome de shell)
, da seguinte forma:
Adicionando Código PHP em Imagens
Se renomear o arquivo.php
para arquivo.jpg
, a imagem irá ser exibida corretamente
Inserindo Código em Comentários de Imagens
Inserindo Código em GIFs
GIF89a
Alguns servidores validam apenas se tem o GIF87a
ou GIF89a
no header do arquivo para considerá-lo como um GIF. Então basicamente, apenas adicione o texto GIF89a;
antes de codificar o shell.
Exportando Cabeçalho de Imagem
SVG
Vídeo Upload + LFI
Antes de executar o comando abaixo, faça uma cópia do arquivo do vídeo, pois o ffmpeg-avi-m3u-xbin
irá sobreescrever no arquivo.
Sites
Last updated