Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p

This commit is contained in:
Translator 2025-08-19 22:04:42 +00:00
parent 86f3267118
commit 074884c6d4

View File

@ -1,10 +1,10 @@
# NodeJS - \_\_proto\_\_ とプロトタイプ汚染
# NodeJS - \_\_proto\_\_ & prototype Pollution
{{#include ../../../banners/hacktricks-training.md}}
## JavaScriptのオブジェクト <a href="#id-053a" id="id-053a"></a>
JavaScriptのオブジェクトは本質的にキーと値のペアのコレクションであり、プロパティとして知られています。オブジェクトは、引数に`null`を指定して`Object.create`を使用することで空のオブジェクトを生成できます。このメソッドは、継承されたプロパティなしでオブジェクトを作成することを可能にします。
JavaScriptのオブジェクトは本質的にキーと値のペアのコレクションであり、プロパティとして知られています。オブジェクトは、引数に`null`を指定して`Object.create`を使用することで空のオブジェクトを生成できます。このメソッドは、継承されたプロパティなしでオブジェクトを作成することを可能にします。
```javascript
// Run this in the developers tools console
console.log(Object.create(null)) // This will output an empty object.
@ -47,7 +47,7 @@ JavaScriptは、ランタイムでプロトタイプ属性の修正、追加、
## JavaScriptにおけるプロトタイプ汚染の探求
JavaScriptオブジェクトはキーと値のペアによって定義され、JavaScript Objectプロトタイプから継承されます。これは、Objectプロトタイプを変更することで、環境内のすべてのオブジェクトに影響を与える可能性があることを意味します。
JavaScriptオブジェクトはキーと値のペアによって定義され、JavaScriptオブジェクトプロトタイプから継承されます。これは、オブジェクトプロトタイプを変更することで、環境内のすべてのオブジェクトに影響を与える可能性があることを意味します。
別の例を使って説明しましょう:
```javascript
@ -98,7 +98,7 @@ console.log("Honk!")
}
car1.constructor.prototype.isElectric = true
```
これは、`Vehicle` コンストラクタから作成されたオブジェクトのみ影響を与え、`beep``hasWheels``honk`、および `isElectric` プロパティを与えます。
これは、`Vehicle` コンストラクタから作成されたオブジェクトのみ影響を与え、`beep``hasWheels``honk`、および `isElectric` プロパティを与えます。
プロトタイプ汚染を通じて JavaScript オブジェクトにグローバルに影響を与える2つの方法は次のとおりです
@ -117,7 +117,7 @@ console.log("Hello!")
```
これらの操作の後、すべてのJavaScriptオブジェクトは`goodbye`および`greet`メソッドを実行できます。
## 他のオブジェクトを汚染する
## 他のオブジェクトの汚染
### クラスからObject.prototypeへ
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
```
### 配列要素の汚染
JSのオブジェクトの属性を汚染できるように、配列を汚染するアクセス権がある場合、**インデックスによってアクセス可能な配列の値も汚染できます**(値を上書きすることはできないので、何らかの形で使用されているが書き込まれていないインデックスを汚染する必要があります)。
JSのオブジェクトの属性を汚染できるように、配列を汚染するアクセス権がある場合、**インデックスによってアクセス可能な配列の値も汚染できます**(値を上書きすることはできないため、何らかの形で使用されているが書き込まれていないインデックスを汚染する必要があります)。
```javascript
c = [1, 2]
a = []
@ -171,7 +171,7 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
### 基本的な例
プロトタイプ汚染は、`Object.prototype`のプロパティを上書きすることを許可するアプリケーションの欠陥によって発生します。これは、ほとんどのオブジェクトが`Object.prototype`からプロパティを継承することを意味します。
プロトタイプ汚染は、`Object.prototype`のプロパティを上書きすることを許可するアプリケーションの欠陥によって発生します。これは、ほとんどのオブジェクトが`Object.prototype`からプロパティを継承するためです。
最も簡単な例は、チェックされるオブジェクトの**未定義の属性に値を追加する**ことです。
```javascript
@ -185,7 +185,7 @@ user.isAdmin // true
```
このメカニズムは、攻撃者が特定の入力を制御できる場合、アプリケーション内のすべてのオブジェクトのプロトタイプを変更できるようにプロパティを操作することに関係しています。この操作は通常、`__proto__`プロパティを設定することを含み、JavaScriptではオブジェクトのプロトタイプを直接変更することと同義です。
この攻撃が成功裏に実行される条件は、特定の[研究](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf)に概説されており、以下が含まれます:
この攻撃が成功裏に実行される条件は、特定の[研究](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf)に概説されているように、以下を含みます:
- 再帰的マージを実行すること。
- パスに基づいてプロパティを定義すること。
@ -195,13 +195,13 @@ user.isAdmin // true
```python
customer.__proto__.toString = ()=>{alert("polluted")}
```
### プロトタイプ汚染からRCEへ
### Proto Pollution to RCE
{{#ref}}
prototype-pollution-to-rce.md
{{#endref}}
その他のペイロード:
他のペイロード:
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
@ -213,14 +213,14 @@ client-side-prototype-pollution.md
### CVE-201911358: jQuery $ .extendを通じたプロトタイプ汚染攻撃
[詳細についてはこの記事を確認してください](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQueryでは、`$ .extend`関数が深いコピー機能を不適切に利用するとプロトタイプ汚染を引き起こす可能性があります。この関数は、オブジェクトのクローンやデフォルトオブジェクトからのプロパティのマージによく使用されます。しかし、誤って設定された場合、新しいオブジェクト用のプロパティがプロトタイプに割り当てられることがあります。例えば:
[詳細についてはこの記事を確認してください](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQueryでは、`$ .extend`関数が深いコピー機能を不適切に利用するとプロトタイプ汚染を引き起こす可能性があります。この関数は、オブジェクトのクローンやデフォルトオブジェクトからのプロパティのマージによく使用されます。しかし、誤って設定されると、新しいオブジェクト用のプロパティがプロトタイプに割り当てられることがあります。例えば:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode) // Outputs: true
```
この脆弱性はCVE-201911358として特定されており、ディープコピーがプロトタイプを意図せずに変更する方法を示しています。これにより`isAdmin`のようなプロパティが適切な存在確認なしにチェックされると、未承認の管理者アクセスなどの潜在的なセキュリティリスクが生じる可能性があります。
この脆弱性はCVE-201911358として特定されており、ディープコピーがプロトタイプを意図せず変更することで`isAdmin`のようなプロパティが適切な存在確認なしにチェックされると、未承認の管理者アクセスなどの潜在的なセキュリティリスクを引き起こす可能性があることを示しています。
### CVE-20183721CVE-201910744: lodashによるプロトタイプ汚染攻撃
### CVE-20183721, CVE-201910744: lodashによるプロトタイプ汚染攻撃
[詳細についてはこの記事を確認してください](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
@ -228,29 +228,29 @@ console.log({}.devMode) // Outputs: true
### CVEを含む別のチュートリアル
{{#ref}}
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
{{#endref}}
- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2)
### プロトタイプ汚染を検出するためのツール
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): ウェブアプリケーションにおけるサーバーサイドのプロトタイプ汚染脆弱性を検出および分析するために設計されたBurp Suite拡張機能。このツールは、潜在的なプロトタイプ汚染の問題を特定するためにリクエストをスキャンするプロセスを自動化します。特にNode.jsライブラリに焦点を当て、プロトタイプ汚染を利用して有害なアクションを実行する既知のガジェットを悪用します。
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): この拡張機能は、サーバーサイドのプロトタイプ汚染脆弱性を特定します。[サーバーサイドプロトタイプ汚染](https://portswigger.net/research/server-side-prototype-pollution)で説明されている技術を使用します。
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): ウェブアプリケーションにおけるサーバーサイドのプロトタイプ汚染脆弱性を検出および分析するために設計されたBurp Suite拡張機能。このツールは、リクエストをスキャンして潜在的なプロトタイプ汚染の問題を特定するプロセスを自動化します。既知のガジェット - プロトタイプ汚染を利用して有害なアクションを実行する方法 - を悪用し、特にNode.jsライブラリに焦点を当てています。
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): この拡張機能は、サーバーサイドのプロトタイプ汚染脆弱性を特定します。[サーバーサイドプロトタイプ汚染](https://portswigger.net/research/server-side-prototype-pollution)で説明されている技術を使用しています。
### NodeJSにおけるASTプロトタイプ汚染
NodeJSは、テンプレートエンジンやTypeScriptなどの機能のためにJavaScriptで抽象構文木ASTを広範に利用しています。このセクションでは、特にHandlebarsとPugのテンプレートエンジンに関連するプロトタイプ汚染に関する脆弱性を探ります。
NodeJSは、テンプレートエンジンやTypeScriptの機能のためにJavaScriptで抽象構文木ASTを広範に利用しています。このセクションでは、テンプレートエンジン、特にHandlebarsとPugにおけるプロトタイプ汚染に関連する脆弱性を探ります。
#### Handlebars脆弱性分析
Handlebarsテンプレートエンジンはプロトタイプ汚染攻撃に対して脆弱です。この脆弱性は、`javascript-compiler.js`ファイル内の特定の関数から生じます。例えば、`appendContent`関数は、`pendingContent`が存在する場合にそれを連結し、`pushSource`関数はソースを追加した後に`pendingContent``undefined`にリセットします。
Handlebarsテンプレートエンジンはプロトタイプ汚染攻撃に対して脆弱です。この脆弱性は、`javascript-compiler.js`ファイル内の特定の関数から生じます。例えば、`appendContent`関数は、`pendingContent`が存在する場合にそれを連結し、`pushSource`関数はソースを追加した後に`pendingContent``undefined`にリセットします。
**悪用プロセス**
悪用は、Handlebarsによって生成されたAST抽象構文木を利用し、以下の手順に従います
1. **パーサーの操作**: 最初に、`NumberLiteral`ノードを介してパーサーは値が数値であることを強制します。プロトタイプ汚染はこれを回避でき、非数値の文字列を挿入することが可能になります。
2. **コンパイラによる処理**: コンパイラはASTオブジェクトまたは文字列テンプレートを処理できます。`input.type``Program`に等しい場合、入力は事前に解析されたものとして扱われ、これを悪用できます。
2. **コンパイラによる処理**: コンパイラはASTオブジェクトまたは文字列テンプレートを処理できます。`input.type``Program`に等しい場合、入力は事前に解析されたものとして扱われ、悪用される可能性があります。
3. **コードの注入**: `Object.prototype`の操作を通じて、テンプレート関数に任意のコードを注入でき、リモートコード実行につながる可能性があります。
Handlebarsの脆弱性を悪用する例
@ -315,7 +315,7 @@ requests.get(TARGET_URL)
```
#### Pugの脆弱性
Pugは、別のテンプレートエンジンであり、プロトタイプ汚染の同様のリスクに直面しています。詳細情報は、[PugにおけるASTインジェクション](https://blog.p6.is/AST-Injection/#Pug)の議論で入手できます。
Pugは、別のテンプレートエンジンであり、プロトタイプ汚染の同様のリスクに直面しています。詳細情報は、[AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug)の議論で入手できます。
Pugにおけるプロトタイプ汚染の例:
```python
@ -338,10 +338,10 @@ requests.get(TARGET_URL)
プロトタイプ汚染のリスクを減らすために、以下の戦略を採用できます:
1. **オブジェクトの不変性**: `Object.prototype``Object.freeze`を適用することで不変にできます。
1. **オブジェクトの不変性**: `Object.prototype``Object.freeze`を適用することで不変にできます。
2. **入力検証**: JSON入力はアプリケーションのスキーマに対して厳密に検証する必要があります。
3. **安全なマージ関数**: 再帰的なマージ関数の安全でない使用は避けるべきです。
4. **プロトタイプのないオブジェクト**: プロトタイププロパティないオブジェクトは`Object.create(null)`を使用して作成できます。
4. **プロトタイプのないオブジェクト**: プロトタイププロパティを持たないオブジェクトは`Object.create(null)`を使用して作成できます。
5. **Mapの使用**: キーと値のペアを保存するために`Object`の代わりに`Map`を使用すべきです。
6. **ライブラリの更新**: 定期的にライブラリを更新することでセキュリティパッチを組み込むことができます。
7. **リンターと静的解析ツール**: プロトタイプ汚染の脆弱性を検出し防止するために、適切なプラグインを持つESLintのようなツールを使用します。