mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p
This commit is contained in:
parent
882e0d46ee
commit
c3ab27d351
@ -4,7 +4,7 @@
|
||||
|
||||
## JavaScript의 객체 <a href="#id-053a" id="id-053a"></a>
|
||||
|
||||
JavaScript의 객체는 본질적으로 키-값 쌍의 모음으로, 속성이라고 합니다. 객체는 `Object.create`를 사용하여 `null`을 인수로 전달하여 빈 객체를 생성할 수 있습니다. 이 방법은 상속된 속성 없이 객체를 생성할 수 있게 해줍니다.
|
||||
JavaScript의 객체는 본질적으로 키-값 쌍의 모음으로, 이를 속성이라고 합니다. `Object.create`를 사용하여 `null`을 인수로 전달하면 빈 객체를 생성할 수 있습니다. 이 방법은 상속된 속성 없이 객체를 생성할 수 있게 해줍니다.
|
||||
```javascript
|
||||
// Run this in the developers tools console
|
||||
console.log(Object.create(null)) // This will output an empty object.
|
||||
@ -31,23 +31,23 @@ var employee1 = new Employee("Generic Employee", "Developer")
|
||||
|
||||
employee1.__proto__
|
||||
```
|
||||
### JavaScript의 프로토타입
|
||||
### Prototypes in JavaScript
|
||||
|
||||
JavaScript는 런타임에 프로토타입 속성을 수정, 추가 또는 삭제할 수 있습니다. 이 유연성은 클래스 기능의 동적 확장을 가능하게 합니다.
|
||||
|
||||
`toString` 및 `valueOf`와 같은 함수는 그 동작을 변경하기 위해 수정될 수 있으며, 이는 JavaScript의 프로토타입 시스템의 적응 가능한 특성을 보여줍니다.
|
||||
`toString` 및 `valueOf`와 같은 함수는 그 동작을 변경하도록 수정될 수 있으며, 이는 JavaScript의 프로토타입 시스템의 적응 가능한 특성을 보여줍니다.
|
||||
|
||||
## 상속
|
||||
## Inheritance
|
||||
|
||||
프로토타입 기반 프로그래밍에서 속성/메서드는 객체가 클래스에서 상속받습니다. 이러한 클래스는 다른 클래스의 인스턴스나 빈 객체에 속성/메서드를 추가하여 생성됩니다.
|
||||
|
||||
다른 객체의 프로토타입 역할을 하는 객체(예: `myPersonObj`)에 속성이 추가될 때, 상속받는 객체는 이 새로운 속성에 접근할 수 있다는 점에 유의해야 합니다. 그러나 이 속성은 명시적으로 호출되지 않는 한 자동으로 표시되지 않습니다.
|
||||
다른 객체의 프로토타입 역할을 하는 객체(예: `myPersonObj`)에 속성이 추가되면, 상속받는 객체는 이 새로운 속성에 접근할 수 있습니다. 그러나 이 속성은 명시적으로 호출되지 않는 한 자동으로 표시되지 않습니다.
|
||||
|
||||
## \_\_proto\_\_ 오염 <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
|
||||
## JavaScript에서 프로토타입 오염 탐색
|
||||
## Exploring Prototype Pollution in JavaScript
|
||||
|
||||
JavaScript 객체는 키-값 쌍으로 정의되며 JavaScript Object 프로토타입에서 상속됩니다. 이는 Object 프로토타입을 변경하면 환경의 모든 객체에 영향을 미칠 수 있음을 의미합니다.
|
||||
JavaScript 객체는 키-값 쌍으로 정의되며 JavaScript Object 프로토타입에서 상속됩니다. 이는 Object 프로토타입을 변경하면 환경 내의 모든 객체에 영향을 미칠 수 있음을 의미합니다.
|
||||
|
||||
다른 예제를 사용하여 설명해 보겠습니다:
|
||||
```javascript
|
||||
@ -142,9 +142,9 @@ console.log(key1 + "." + key2)
|
||||
}
|
||||
}
|
||||
```
|
||||
### 배열 요소 오염
|
||||
### Array elements pollution
|
||||
|
||||
JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열에 오염시킬 수 있는 접근 권한이 있다면 **인덱스를 통해 접근 가능한 배열의 값도 오염시킬 수 있습니다** (값을 덮어쓸 수는 없으므로, 어떤 식으로든 사용되지만 쓰이지 않는 인덱스를 오염시켜야 합니다).
|
||||
JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열에 접근하여 오염시킬 수 있다면 **인덱스를 통해 접근 가능한 배열의 값**도 **오염시킬 수 있다**는 점에 유의하세요 (값을 덮어쓸 수는 없으므로, 어떤 식으로든 사용되지만 쓰이지 않는 인덱스를 오염시켜야 합니다).
|
||||
```javascript
|
||||
c = [1, 2]
|
||||
a = []
|
||||
@ -154,9 +154,9 @@ b[0] //undefined
|
||||
b[1] //"yolo"
|
||||
c[1] // 2 -- not
|
||||
```
|
||||
### Html 요소 오염
|
||||
### Html elements pollution
|
||||
|
||||
JS를 통해 HTML 요소를 생성할 때 **`innerHTML`** 속성을 **덮어쓰는** 것이 가능하여 **임의의 HTML 코드**를 작성할 수 있습니다. [이 글에서 아이디어와 예시](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)입니다.
|
||||
JS를 통해 HTML 요소를 생성할 때 **`innerHTML`** 속성을 **덮어쓰는** 것이 가능하여 **임의의 HTML 코드를 작성**할 수 있습니다. [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
```javascript
|
||||
// Create element
|
||||
devSettings["root"] = document.createElement('main')
|
||||
@ -183,19 +183,19 @@ Object.prototype.isAdmin = true
|
||||
let user = {}
|
||||
user.isAdmin // true
|
||||
```
|
||||
이 메커니즘은 공격자가 특정 입력을 제어할 수 있는 경우 애플리케이션의 모든 객체의 프로토타입을 수정할 수 있도록 속성을 조작하는 것과 관련이 있습니다. 이 조작은 일반적으로 `__proto__` 속성을 설정하는 것을 포함하며, JavaScript에서는 객체의 프로토타입을 직접 수정하는 것과 동의어입니다.
|
||||
이 메커니즘은 공격자가 특정 입력에 대한 제어를 가지고 있을 경우, 애플리케이션의 모든 객체의 프로토타입을 수정할 수 있도록 속성을 조작하는 것과 관련이 있습니다. 이 조작은 일반적으로 `__proto__` 속성을 설정하는 것을 포함하며, JavaScript에서는 객체의 프로토타입을 직접 수정하는 것과 동의어입니다.
|
||||
|
||||
이 공격이 성공적으로 실행될 수 있는 조건은 특정 [연구](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf)에서 설명된 바와 같이 다음과 같습니다:
|
||||
|
||||
- 재귀적 병합 수행.
|
||||
- 경로를 기반으로 속성 정의.
|
||||
- 경로에 따라 속성 정의.
|
||||
- 객체 복제.
|
||||
|
||||
### Override function
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
### 프로토 오염을 통한 RCE
|
||||
### 프로토 폴루션을 통한 RCE
|
||||
|
||||
{{#ref}}
|
||||
prototype-pollution-to-rce.md
|
||||
@ -205,15 +205,15 @@ prototype-pollution-to-rce.md
|
||||
|
||||
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||
|
||||
## 클라이언트 측 프로토타입 오염을 통한 XSS
|
||||
## 클라이언트 측 프로토타입 폴루션을 통한 XSS
|
||||
|
||||
{{#ref}}
|
||||
client-side-prototype-pollution.md
|
||||
{{#endref}}
|
||||
|
||||
### CVE-2019–11358: jQuery $ .extend를 통한 프로토타입 오염 공격
|
||||
### CVE-2019–11358: jQuery $ .extend를 통한 프로토타입 폴루션 공격
|
||||
|
||||
[자세한 내용은 이 기사를 확인하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery에서 `$ .extend` 함수는 깊은 복사 기능이 잘못 사용될 경우 프로토타입 오염을 초래할 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체에서 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성된 경우, 새로운 객체를 위한 속성이 대신 프로토타입에 할당될 수 있습니다. 예를 들어:
|
||||
[자세한 내용은 이 기사를 확인하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery에서 `$ .extend` 함수는 깊은 복사 기능이 잘못 사용될 경우 프로토타입 폴루션을 초래할 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체의 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성된 경우, 새로운 객체를 위한 속성이 대신 프로토타입에 할당될 수 있습니다. 예를 들어:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode) // Outputs: true
|
||||
@ -228,18 +228,16 @@ console.log({}.devMode) // Outputs: true
|
||||
|
||||
### CVE가 포함된 또 다른 튜토리얼
|
||||
|
||||
{{#ref}}
|
||||
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
|
||||
{{#endref}}
|
||||
- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2)
|
||||
|
||||
### 프로토타입 오염 탐지를 위한 도구
|
||||
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): 웹 애플리케이션에서 서버 측 프로토타입 오염 취약점을 탐지하고 분석하기 위해 설계된 Burp Suite 확장입니다. 이 도구는 요청을 스캔하여 잠재적인 프로토타입 오염 문제를 식별하는 과정을 자동화합니다. 이는 알려진 가젯 - 프로토타입 오염을 활용하여 해로운 작업을 실행하는 방법 - 을 악용하며, 특히 Node.js 라이브러리에 중점을 둡니다.
|
||||
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): 이 확장은 서버 측 프로토타입 오염 취약점을 식별합니다. 이는 [서버 측 프로토타입 오염](https://portswigger.net/research/server-side-prototype-pollution)에서 설명된 기술을 사용합니다.
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): 웹 애플리케이션에서 서버 측 프로토타입 오염 취약점을 탐지하고 분석하기 위해 설계된 Burp Suite 확장입니다. 이 도구는 요청을 스캔하여 잠재적인 프로토타입 오염 문제를 식별하는 과정을 자동화합니다. 알려진 가젯 - 프로토타입 오염을 활용하여 해로운 작업을 실행하는 방법 - 을 악용하며, 특히 Node.js 라이브러리에 중점을 둡니다.
|
||||
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): 이 확장은 서버 측 프로토타입 오염 취약점을 식별합니다. [서버 측 프로토타입 오염](https://portswigger.net/research/server-side-prototype-pollution)에서 설명된 기술을 사용합니다.
|
||||
|
||||
### NodeJS의 AST 프로토타입 오염
|
||||
|
||||
NodeJS는 템플릿 엔진 및 TypeScript와 같은 기능을 위해 JavaScript에서 추상 구문 트리(AST)를 광범위하게 활용합니다. 이 섹션에서는 템플릿 엔진, 특히 Handlebars와 Pug에서의 프로토타입 오염과 관련된 취약점을 탐구합니다.
|
||||
NodeJS는 템플릿 엔진 및 TypeScript와 같은 기능을 위해 JavaScript에서 추상 구문 트리(AST)를 광범위하게 활용합니다. 이 섹션에서는 템플릿 엔진, 특히 Handlebars와 Pug의 프로토타입 오염과 관련된 취약점을 탐구합니다.
|
||||
|
||||
#### Handlebars 취약점 분석
|
||||
|
||||
@ -283,7 +281,7 @@ console.log(eval("(" + template + ")")["main"].toString())
|
||||
```
|
||||
이 코드는 공격자가 Handlebars 템플릿에 임의의 코드를 주입할 수 있는 방법을 보여줍니다.
|
||||
|
||||
**외부 참조**: 'flat' 라이브러리에서 프로토타입 오염과 관련된 문제가 발견되었습니다. 자세한 내용은 여기에서 확인하세요: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||
**외부 참조**: 프로토타입 오염과 관련된 문제가 'flat' 라이브러리에서 발견되었습니다. 자세한 내용은 여기에서 확인하세요: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||
|
||||
**외부 참조**: [flat' 라이브러리의 프로토타입 오염과 관련된 문제](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
@ -344,7 +342,7 @@ requests.get(TARGET_URL)
|
||||
4. **프로토타입 없는 객체**: 프로토타입 속성이 없는 객체는 `Object.create(null)`을 사용하여 생성할 수 있습니다.
|
||||
5. **Map 사용**: 키-값 쌍을 저장할 때 `Object` 대신 `Map`을 사용해야 합니다.
|
||||
6. **라이브러리 업데이트**: 라이브러리를 정기적으로 업데이트하여 보안 패치를 통합할 수 있습니다.
|
||||
7. **린터 및 정적 분석 도구**: ESLint와 적절한 플러그인을 사용하여 프로토타입 오염 취약점을 감지하고 방지하는 도구를 사용하세요.
|
||||
7. **린터 및 정적 분석 도구**: 프로토타입 오염 취약점을 감지하고 방지하기 위해 적절한 플러그인이 포함된 ESLint와 같은 도구를 사용하세요.
|
||||
8. **코드 리뷰**: 프로토타입 오염과 관련된 잠재적 위험을 식별하고 수정하기 위해 철저한 코드 리뷰를 구현하세요.
|
||||
9. **보안 교육**: 개발자에게 프로토타입 오염의 위험과 안전한 코드를 작성하기 위한 모범 사례에 대해 교육하세요.
|
||||
10. **라이브러리 사용 시 주의**: 서드파티 라이브러리를 사용할 때 주의하세요. 그들의 보안 상태를 평가하고, 특히 객체를 조작하는 코드에 대해 검토하세요.
|
||||
|
Loading…
x
Reference in New Issue
Block a user