# Misc JS Tricks & Relevant Info
Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!
* Lavori in una **azienda di sicurezza informatica**? Vuoi vedere la tua **azienda pubblicizzata in HackTricks**? O vuoi avere accesso all'**ultima versione di PEASS o scaricare HackTricks in PDF**? Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* **Unisciti al** [**💬**](https://emojipedia.org/speech-balloon/) [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguimi** su **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR al** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **e al** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Here is a list of valid characters that can be used to generate strings:
``` ```htmlEcco una lista di caratteri validi che possono essere utilizzati per generare stringhe:
``` ```javascript // Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (pp. 41-42). Kindle Edition. // Check which pairs of chars can make something be a valid string log=[]; for(let i=0;i<=0x10ffff;i++){ try { eval(`${String.fromCodePoint(i)}%$£234${String.fromCodePoint(i)}`) log.push(i) }catch(e){} } console.log(log) //34,39,47,96 //single quote, quotes, backticks & // (regex) ``` ### **Surrogate Pairs BF** Questa tecnica non sarà molto utile per XSS, ma potrebbe essere utile per eludere le protezioni WAF. Questo codice Python riceve in input 2 byte e cerca una coppia di surrogati che ha il primo byte come gli ultimi byte della coppia di surrogati alti e l'ultimo byte come l'ultimo byte della coppia di surrogati bassi. ```python def unicode(findHex): for i in range(0,0xFFFFF): H = hex(int(((i - 0x10000) / 0x400) + 0xD800)) h = chr(int(H[-2:],16)) L = hex(int(((i - 0x10000) % 0x400 + 0xDC00))) l = chr(int(L[-2:],16)) if(h == findHex[0]) and (l == findHex[1]): print(H.replace("0x","\\u")+L.replace("0x","\\u")) ``` Ulteriori informazioni: * [https://github.com/dreadlocked/ctf-writeups/blob/master/nn8ed/README.md](https://github.com/dreadlocked/ctf-writeups/blob/master/nn8ed/README.md) * [https://mathiasbynens.be/notes/javascript-unicode](https://mathiasbynens.be/notes/javascript-unicode) [https://mathiasbynens.be/notes/javascript-encoding](https://mathiasbynens.be/notes/javascript-encoding) ### Fuzzing del protocollo `javascript{}:` ```javascript // Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 34). Kindle Edition. log=[]; let anchor = document.createElement('a'); for(let i=0;i<=0x10ffff;i++){ anchor.href = `javascript${String.fromCodePoint(i)}:`; if(anchor.protocol === 'javascript:') { log.push(i); } } console.log(log)//9,10,13,58 // Note that you could BF also other possitions of the use of multiple chars // Test one option let anchor = document.createElement('a'); anchor.href = `javascript${String.fromCodePoint(58)}:alert(1337)`; anchor.append('Click me') document.body.append(anchor) // Another way to test Test ``` ### URL Fuzzing URL Fuzzing è una tecnica utilizzata per individuare vulnerabilità nelle applicazioni web. Consiste nell'inserire dati di input non validi o imprevisti all'interno degli URL per testare la risposta dell'applicazione. Questo può includere l'inserimento di caratteri speciali, sequenze di escape, parametri aggiuntivi o modifiche nella struttura dell'URL. L'obiettivo è identificare eventuali errori o comportamenti anomali che potrebbero essere sfruttati per eseguire attacchi come l'iniezione di codice o il bypass di controlli di sicurezza. ```javascript // Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (pp. 36-37). Kindle Edition. // Before the protocol a=document.createElement('a'); log=[]; for(let i=0;i<=0x10ffff;i++){ a.href = `${String.fromCodePoint(i)}https://hacktricks.xyz`; if(a.hostname === 'hacktricks.xyz'){ log.push(i); } } console.log(log) //0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 // Between the slashes a=document.createElement('a'); log=[]; for(let i=0;i<=0x10ffff;i++){ a.href = `/${String.fromCodePoint(i)}/hacktricks.xyz`; if(a.hostname === 'hacktricks.xyz'){ log.push(i); } } console.log(log) //9,10,13,47,92 ``` ### Fuzzing HTML Il fuzzing HTML è una tecnica utilizzata per individuare vulnerabilità di cross-site scripting (XSS) in un'applicazione web. Consiste nell'inserire dati di input non validi o imprevisti nei campi di input dell'applicazione per verificare se l'applicazione è in grado di gestirli correttamente. Il fuzzing HTML può essere eseguito in diversi modi, ad esempio: * Inserendo caratteri speciali come "<", ">", "&" nei campi di input per verificare se l'applicazione esegue una corretta sanitizzazione dei dati. * Inserendo tag HTML o attributi non validi nei campi di input per verificare se l'applicazione li interpreta correttamente. * Inserendo script JavaScript nei campi di input per verificare se l'applicazione esegue una corretta sanitizzazione dei dati e previene l'esecuzione di codice dannoso. Durante il fuzzing HTML, è importante monitorare le risposte dell'applicazione per individuare eventuali errori o comportamenti anomali. Inoltre, è consigliabile utilizzare strumenti di fuzzing automatizzati per accelerare il processo di individuazione delle vulnerabilità. Una volta individuata una potenziale vulnerabilità di XSS, è necessario testarla ulteriormente per confermare la sua presenza e determinare il suo impatto. Ciò può essere fatto inserendo script JavaScript di prova per verificare se è possibile eseguire codice arbitrario nell'applicazione. In conclusione, il fuzzing HTML è una tecnica efficace per individuare vulnerabilità di XSS in un'applicazione web. È importante eseguirlo in modo accurato e sistematico per garantire la sicurezza dell'applicazione. ```javascript // Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 38). Kindle Edition. // Fuzzing chars that can close an HTML comment let log=[]; let div = document.createElement('div'); for(let i=0;i<=0x10ffff;i++){ div.innerHTML=``; if(div.querySelector('span')){ log.push(i); } } console.log(log)//33,45,62 ``` ## **Analisi degli attributi** Lo strumento **Hackability inspector** di Portswigger aiuta ad **analizzare** gli **attributi** di un oggetto javascript. Controlla: [https://portswigger-labs.net/hackability/inspector/?input=x.contentWindow\&html=%3Ciframe%20src=//subdomain1.portswigger-labs.net%20id=x%3E](https://portswigger-labs.net/hackability/inspector/?input=x.contentWindow\&html=%3Ciframe%20src=//subdomain1.portswigger-labs.net%20id=x%3E) ## **File .map js** * Trucco per scaricare file .map js: [https://medium.com/@bitthebyte/javascript-for-bug-bounty-hunters-part-2-f82164917e7](https://medium.com/@bitthebyte/javascript-for-bug-bounty-hunters-part-2-f82164917e7) * Puoi utilizzare questo strumento per analizzare questi file [https://github.com/paazmaya/shuji](https://github.com/paazmaya/shuji) ## Assegnazione "--" L'operatore di decremento `--` è anche un'assegnazione. Questo operatore prende un valore e poi lo decrementa di uno. Se quel valore non è un numero, verrà impostato su `NaN`. Questo può essere utilizzato per **rimuovere il contenuto delle variabili dall'ambiente**. ![](<../../.gitbook/assets/image (553).png>) ![](<../../.gitbook/assets/image (554).png>) ## Trucchi delle funzioni ### .call e .apply Il metodo **`.call`** di una funzione viene utilizzato per **eseguire la funzione**.\ Il **primo argomento** che si aspetta di default è il **valore di `this`** e se **niente** viene fornito, **`window`** sarà quel valore (a meno che non venga utilizzato **`strict mode`**). ```javascript function test_call(){ console.log(this.value); //baz } new_this={value:"hey!"} test_call.call(new_this); // To pass more arguments, just pass then inside .call() function test_call() { console.log(arguments[0]); //"arg1" console.log(arguments[1]); //"arg2" console.log(this); //[object Window] } test_call.call(null, "arg1", "arg2") // If you use the "use strict" directive "this" will be null instead of window: function test_call() { "use strict"; console.log(this); //null } test_call.call(null) //The apply function is pretty much exactly the same as the call function with one important difference, you can supply an array of arguments in the second argument: function test_apply() { console.log(arguments[0]); //"arg1" console.log(arguments[1]); //"arg2" console.log(this); //[object Window] } test_apply.apply(null, ["arg1", "arg2"]) ``` ### Funzioni freccia Le funzioni freccia ti permettono di generare funzioni in una singola riga più facilmente (se le comprendi) ```javascript // Traditional function (a){ return a + 1; } // Arrow forms a => a + 100; a => {a + 100}; // Traditional function (a, b){ return a + b + 1; } // Arrow (a, b) => a + b + 100; // Tradictional no args let a = 4; let b = 2; function (){ return a + b + 1; } // Arrow let a = 4; let b = 2; () => a + b + 1; ``` Quindi, la maggior parte delle funzioni precedenti sono in realtà inutili perché non le stiamo salvando da nessuna parte per poterle richiamare. Ad esempio, creiamo la funzione `plusone`: ```javascript // Traductional function plusone (a){ return a + 1; } //Arrow plusone = a => a + 100; ``` ### Funzione bind La funzione bind permette di creare una **copia** di una **funzione modificando** l'oggetto **`this`** e i **parametri** forniti. ```javascript //This will use the this object and print "Hello World" var fn = function ( param1, param2 ) { console.info( this, param1, param2 ); } fn('Hello', 'World') //This will still use the this object and print "Hello World" var copyFn = fn.bind(); copyFn('Hello', 'World') //This will use the "console" object as "this" object inside the function and print "fixingparam1 Hello" var bindFn_change = fn.bind(console, "fixingparam1"); bindFn_change('Hello', 'World') //This will still use the this object and print "fixingparam1 Hello" var bindFn_thisnull = fn.bind(null, "fixingparam1"); bindFn_change('Hello', 'World') //This will still use the this object and print "fixingparam1 Hello" var bindFn_this = fn.bind(this, "fixingparam1"); bindFn_change('Hello', 'World') ``` {% hint style="info" %} Nota che utilizzando **`bind`** puoi manipolare l'oggetto **`this`** che verrà utilizzato quando si chiama la funzione. {% endhint %} ### Fuga di codice della funzione Se puoi **accedere all'oggetto** di una funzione, puoi **ottenere il codice** di quella funzione. ```javascript function afunc(){ return 1+1; } console.log(afunc.toString()); //This will print the code of the function console.log(String(afunc)); //This will print the code of the function console.log(this.afunc.toString()); //This will print the code of the function console.log(global.afunc.toString()); //This will print the code of the function ``` Nei casi in cui la **funzione non ha un nome**, è comunque possibile stampare il **codice della funzione** da all'interno: ```javascript (function (){ return arguments.callee.toString(); })() (function (){ return arguments[0]; })("arg0") ``` Alcuni modi **casuali** per **estrarre il codice** di una funzione (anche i commenti) da un'altra funzione: ```javascript (function (){ return retFunc => String(arguments[0]) })(a=>{/* Hidden commment */})() (function (){ return retFunc => Array(arguments[0].toString()) })(a=>{/* Hidden commment */})() (function (){ return String(this)}).bind(()=>{ /* Hidden commment */ })() (u=>(String(u)))(_=>{ /* Hidden commment */ }) (u=>_=>(String(u)))(_=>{ /* Hidden commment */ })() ``` ## Fuga dalla sandbox - Recupero dell'oggetto window L'oggetto Window consente di accedere alle funzioni definite globalmente come alert o eval. {% code overflow="wrap" %} ```javascript // Some ways to access window window.eval("alert(1)") frames globalThis parent self top //If inside a frame, this is top most window // Access window from document document.defaultView.alert(1) // Access document from a node object node = document.createElement('div') node.ownerDocument.defaultView.alert(1) // There is a path property on each error event whose last element is the window // In other browsers the method is // In case of svg, the "event" object is called "evt"