Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu

This commit is contained in:
Translator 2024-03-17 20:40:35 +00:00
parent f5408d0fd5
commit 9477c999f9

View file

@ -2,19 +2,19 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## JavaScript中的对象 <a href="#053a" id="053a"></a> ## JavaScript中的对象 <a href="#id-053a" id="id-053a"></a>
JavaScript中的对象本质上是键值对的集合称为属性。可以使用`Object.create`方法并将`null`作为参数来创建一个空对象。这种方法允许创建一个没有任何继承属性的对象。 JavaScript中的对象本质上是键值对的集合称为属性。可以使用`Object.create`方法并将`null`作为参数来创建一个空对象。这种方法允许创建一个没有任何继承属性的对象。
```javascript ```javascript
@ -45,19 +45,19 @@ employee1.__proto__
JavaScript允许在运行时修改、添加或删除原型属性。这种灵活性使得可以动态扩展类的功能。 JavaScript允许在运行时修改、添加或删除原型属性。这种灵活性使得可以动态扩展类的功能。
像`toString`和`valueOf`这样的函数可以被改以改变它们的行为展示了JavaScript原型系统的适应性。 像`toString`和`valueOf`这样的函数可以被改以改变它们的行为展示了JavaScript原型系统的适应性。
## 继承 ## 继承
在基于原型的编程中,属性/方法是从类继承到对象的。这些类是通过将属性/方法添加到另一个类的实例或空对象中创建的。 在基于原型的编程中,属性/方法是从类中继承给对象的。这些类是通过将属性/方法添加到另一个类的实例或空对象中创建的。
值得注意的是,当将属性添加到充当其他对象原型(如`myPersonObj`)的对象时,继承对象就可以访问这个新属性。但是,除非显式调用,否则不会自动显示此属性。 值得注意的是,当将属性添加到充当其他对象原型的对象(如`myPersonObj`)时,继承对象将获得对这个新属性的访问权限。然而,除非显式调用,否则不会自动显示此属性。
## \_\_proto\_\_污染 <a href="#0d0a" id="0d0a"></a> ## \_\_proto\_\_污染 <a href="#id-0d0a" id="id-0d0a"></a>
## 探索JavaScript中的原型污染 ## 探索JavaScript中的原型污染
JavaScript对象由键值对定义从JavaScript对象原型继承。这意味着修改Object原型可能会影响环境中的所有对象。 JavaScript对象由键值对定义继承自JavaScript对象原型。这意味着修改Object原型可能会影响环境中的所有对象。
让我们使用一个不同的示例来说明: 让我们使用一个不同的示例来说明:
```javascript ```javascript
@ -66,7 +66,7 @@ this.model = model;
} }
var car1 = new Vehicle("Tesla Model S"); var car1 = new Vehicle("Tesla Model S");
``` ```
可以通过以下方式访问Object原型: 可以通过以下方式访问对象原型:
```javascript ```javascript
car1.__proto__.__proto__; car1.__proto__.__proto__;
Vehicle.__proto__.__proto__; Vehicle.__proto__.__proto__;
@ -102,7 +102,7 @@ console.log(car1.hasWheels); // Outputs true
car1.constructor.prototype.honk = function() { console.log("Honk!"); }; car1.constructor.prototype.honk = function() { console.log("Honk!"); };
car1.constructor.prototype.isElectric = true; car1.constructor.prototype.isElectric = true;
``` ```
这仅影响从`Vehicle`构造函数创建的对象,赋予它们`beep`、`hasWheels`、`honk`和`isElectric`属性。 这仅影响从`Vehicle`构造函数创建的对象,为它们提供`beep`、`hasWheels`、`honk`和`isElectric`属性。
全局影响JavaScript对象的两种方法包括 全局影响JavaScript对象的两种方法包括
@ -119,7 +119,7 @@ example.constructor.prototype.greet = function() { console.log("Hello!"); };
### 从类到Object.prototype ### 从类到Object.prototype
在一个场景中,你可以**污染特定对象**并且需要**访问`Object.prototype`**,你可以使用类似以下代码进行搜索: 在一个场景中,您可以**污染特定对象**并且需要**访问`Object.prototype`**,您可以使用类似以下代码进行搜索:
```javascript ```javascript
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/ // From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
@ -142,7 +142,7 @@ console.log(key1 + "." + key2)
``` ```
### 数组元素污染 ### 数组元素污染
请注意正如您可以污染JS对象的属性一样,如果您可以污染一个数组,您也可以**污染数组的值**,这些值可以通过**索引**访问(请注意,您无法覆盖值,因此您需要污染某种方式使用但未写入的索引)。 请注意正如您可以污染JS对象的属性一样如果您可以访问污染一个数组,您也可以**污染数组的值**,这些值可以通过**索引**访问(请注意,您无法覆盖值,因此您需要污染某种方式使用但未写入的索引)。
```javascript ```javascript
c = [1,2] c = [1,2]
a = [] a = []
@ -154,7 +154,7 @@ c[1] // 2 -- not
``` ```
### Html元素污染 ### Html元素污染
在通过JS生成HTML元素时可以**覆盖** **`innerHTML`** 属性,使其编写**任意HTML代码。** [灵感和示例来自此文](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/). 在通过JS生成HTML元素时可以**覆盖** **`innerHTML`** 属性,使其编写**任意HTML代码。** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
{% code overflow="wrap" %} {% code overflow="wrap" %}
```javascript ```javascript
@ -173,13 +173,13 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
### 基本示例 ### 基本示例
原型污染是由于应用程序中存在漏洞,允许在 `Object.prototype` 上覆盖属性。这意味着由于大多数对象从 `Object.prototype` 派生其属性 由于应用程序中存在允许在 `Object.prototype` 上覆盖属性的缺陷,导致原型污染。这意味着由于大多数对象从 `Object.prototype` 派生其属性
最简单的示例是向将要被检查的对象的**未定义属性**添加一个值,如下所示: 最简单的示例是向将要被检查的对象的**未定义属性**添加一个值,如下所示:
```javascript ```javascript
if (user.admin) { if (user.admin) {
``` ```
如果属性**`admin`未定义**就有可能滥用原型污染并将其设置为True类似于以下操作 如果属性 **`admin` 未定义**,就有可能滥用原型污染并将其设置为 True类似于以下操作
```javascript ```javascript
Object.prototype.isAdmin = true Object.prototype.isAdmin = true
let user = {} let user = {}
@ -187,11 +187,13 @@ user.isAdmin // true
``` ```
这种机制涉及操纵属性,使得如果攻击者控制了某些输入,他们可以修改应用程序中所有对象的原型。这种操纵通常涉及设置`__proto__`属性在JavaScript中这等同于直接修改对象的原型。 这种机制涉及操纵属性,使得如果攻击者控制了某些输入,他们可以修改应用程序中所有对象的原型。这种操纵通常涉及设置`__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)中所述,包括
- 执行递归合并。 * 执行递归合并。
- 基于路径定义属性。 * 根据路径定义属性。
- 克隆对象。 * 克隆对象。
### 覆盖函数
```python ```python
customer.__proto__.toString = ()=>{alert("polluted")} customer.__proto__.toString = ()=>{alert("polluted")}
``` ```
@ -209,43 +211,45 @@ customer.__proto__.toString = ()=>{alert("polluted")}
### CVE-201911358: 通过jQuery $ .extend进行原型污染攻击 ### CVE-201911358: 通过jQuery $ .extend进行原型污染攻击
[有关更多详细信息,请查看此文章](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) [有关更多详细信息,请查阅此文章](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) 在jQuery中如果深度复制功能被错误使用`$ .extend`函数可能导致原型污染。该函数通常用于克隆对象或从默认对象合并属性。然而,当配置错误时,本应分配给新对象的属性可能被分配给原型。例如:
在jQuery中如果深度复制功能被错误使用`$ .extend`函数可能导致原型污染。该函数通常用于克隆对象或从默认对象合并属性。但是,当配置错误时,本应分配给新对象的属性可能被分配给原型。例如:
```javascript ```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}')); $.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
console.log({}.devMode); // Outputs: true console.log({}.devMode); // Outputs: true
``` ```
### CVE-201911358漏洞说明 这个漏洞被标识为CVE-2019-11358说明了深拷贝可能会无意中修改原型导致潜在的安全风险比如如果未经适当存在性验证就检查诸如`isAdmin`之类的属性,可能导致未经授权的管理员访问。
这个漏洞被标识为CVE-201911358展示了如何深度复制可能无意中修改原型导致潜在的安全风险比如如果未经适当存在性验证就检查`isAdmin`等属性,可能导致未经授权的管理员访问。 ### CVE-2018-3721CVE-2019-10744通过lodash进行原型污染攻击
### CVE-20183721CVE-201910744通过lodash进行原型污染攻击 [有关更多详细信息,请查看此文章](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[更多详情请查看这篇文章](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) [Lodash](https://www.npmjs.com/package/lodash) 遇到了类似的原型污染漏洞CVE-2018-3721CVE-2019-10744。这些问题已在版本4.17.11中得到解决。
[Lodash](https://www.npmjs.com/package/lodash) 遇到了类似的原型污染漏洞CVE-20183721CVE-201910744。这些问题已在版本4.17.11中得到解决。 ### 具有CVE的另一个教程
### 其他带有CVE的教程
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %} {% embed url="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扩展程序旨在检测和分析Web应用程序中的服务器端原型污染漏洞。该工具自动化扫描请求的过程以识别潜在的原型污染问题。它利用已知的小工具 - 利用原型污染执行有害操作的方法 - 特别关注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中的AST原型污染
NodeJS在JavaScript中广泛使用抽象语法树AST来实现功能比如模板引擎和TypeScript。本节探讨了与模板引擎中原型污染相关的漏洞特别是Handlebars和Pug。 NodeJS在JavaScript中广泛使用抽象语法树AST来实现诸如模板引擎和TypeScript等功能。本节探讨了与模板引擎中原型污染相关的漏洞特别是Handlebars和Pug。
#### Handlebars漏洞分析 #### Handlebars漏洞分析
Handlebars模板引擎容易受到原型污染攻击。这个漏洞源自`javascript-compiler.js`文件中的特定函数。例如,`appendContent`函数在存在`pendingContent`时连接它,而`pushSource`函数在添加源后将`pendingContent`重置为`undefined`。 Handlebars模板引擎容易受到原型污染攻击。漏洞源自`javascript-compiler.js`文件中的特定函数。例如,`appendContent`函数在存在`pendingContent`时连接它,而`pushSource`函数在添加源代码后将`pendingContent`重置为`undefined`。
##### 攻击过程 **利用过程**
利用Handlebars生成的AST抽象语法树进行攻击,遵循以下步骤: 利用AST抽象语法树生成的Handlebars,遵循以下步骤:
1. **解析器的操纵**:首先,解析器通过`NumberLiteral`节点强制值为数字。原型污染可以绕过这一限制,允许插入非数字字符串 1. **解析器的操纵**:首先,解析器通过`NumberLiteral`节点强制值为数字。原型污染可以绕过这一点,使非数字字符串插入
2. **编译器的处理**编译器可以处理AST对象或字符串模板。如果`input.type`等于`Program`,则将输入视为预解析,可以被利用。 2. **编译器的处理**编译器可以处理AST对象或字符串模板。如果`input.type`等于`Program`,则将输入视为预解析,可以被利用。
3. **代码注入**:通过操纵`Object.prototype`,可以将任意代码注入模板函数,可能导致远程代码执行。 3. **代码注入**:通过操纵`Object.prototype`,可以将任意代码注入模板函数,可能导致远程代码执行。
一个演示利用Handlebars漏洞的示例 演示利用Handlebars漏洞的示例
```javascript ```javascript
const Handlebars = require('handlebars'); const Handlebars = require('handlebars');
@ -302,7 +306,7 @@ requests.get(TARGET_URL)
``` ```
#### Pug漏洞 #### Pug漏洞
Pug另一个模板引擎面临原型污染的类似风险。有关更详细信息请参阅[Pug中的AST注入讨论](https://blog.p6.is/AST-Injection/#Pug)。 Pug另一个模板引擎面临原型污染的类似风险。有关更详细信息,请参阅[Pug中的AST注入讨论](https://blog.p6.is/AST-Injection/#Pug)。
Pug中原型污染的示例 Pug中原型污染的示例
```python ```python
@ -327,12 +331,12 @@ requests.get(TARGET_URL)
1. **对象不可变性**:可以通过应用 `Object.freeze` 来使 `Object.prototype` 不可变。 1. **对象不可变性**:可以通过应用 `Object.freeze` 来使 `Object.prototype` 不可变。
2. **输入验证**JSON 输入应该严格根据应用程序的模式进行验证。 2. **输入验证**JSON 输入应该严格根据应用程序的模式进行验证。
3. **安全合并函数**:应避免不安全使用递归合并函数。 3. **安全合并函数**:应避免不安全使用递归合并函数。
4. **无原型对象**:可以使用 `Object.create(null)` 创建没有原型属性的对象。 4. **无原型对象**:可以使用 `Object.create(null)` 创建没有原型属性的对象。
5. **使用 Map**:应该使用 `Map` 而不是 `Object` 来存储键值对。 5. **使用 Map**:应该使用 `Map` 而不是 `Object` 来存储键值对。
6. **库更新**:可以通过定期更新库来整合安全补丁。 6. **库更新**:可以通过定期更新库来整合安全补丁。
7. **代码检查工具**:使用诸如 ESLint 等适当插件的工具来检测和防止原型污染漏洞。 7. **代码检查工具**:使用诸如 ESLint 等适当插件的工具来检测和防止原型污染漏洞。
8. **代码审查**:实施彻底的代码审查,以识别和消除与原型污染相关的潜在风险。 8. **代码审查**:实施彻底的代码审查,以识别和修复与原型污染相关的潜在风险。
9. **安全培训**:教育开发人员有关原型污染的风险以及编写安全代码的最佳实践。 9. **安全培训**:教育开发人员有关原型污染的风险以及编写安全代码的最佳实践。
10. **谨慎使用库**:在使用第三方库时要谨慎。评估它们的安全状况并审查它们的代码,特别是那些操作对象的代码。 10. **谨慎使用库**:在使用第三方库时要谨慎。评估它们的安全状况并审查它们的代码,特别是那些操作对象的代码。
11. **运行时保护**:采用运行时保护机制,例如使用专注于安全的 npm 包,可以检测和防止原型污染攻击。 11. **运行时保护**:采用运行时保护机制,例如使用专注于安全的 npm 包,可以检测和防止原型污染攻击。
@ -350,10 +354,10 @@ requests.get(TARGET_URL)
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您想在 HackTricks 中看到您的 **公司广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想看到您的 **公司在 HackTricks 中做广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) * 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) 上 **关注** 我们。 * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>