JavaScript에서 Prototype 개념
함수 객체와 내부 구조
JS에서는 함수를 정의하고, 파싱단계에 들어가면, 내부적으로 수행되는 작업이 있다. 함수 멤버로 prototype 속성이 있는데, 이 속성은 다른 곳에 생성된 함수 이름의 프로토타입 객체를 참조한다. 프로토타입 객체의 멤버인 constructor 속성은 함수를 참조하는 내부 구조를 가진다.
그리고 생성된 함수는 Prototype이라는 속성을 통해 Prototype Object에 접근할 수 있습니다. Prototype Object는 일반적인 객체와 같으며 기본적인 속성으로 constructor와 __proto__를 가지고 있습니다.
속성이 하나도 없는 Person 함수가 정의되고, 파싱단계에 들어가면, Person함수 Prototype 속성은 프로토타입 객체를 참조한다. 프로토타입 객체 멤버인 constructor 속성은 Person함수를 참조하는 구조를 가진다. 여기서 중요한 것은 Person 함수의 prototype 속성이 참조하는 프로토타입 객체는 new라는 연산자와 Person 함수를 통해 생성된 모든 객체의 원형 즉, 기원이 되는 개체이다. 생성된 모든 객체가 참조한다는 것을 기억해야한다.
Prototype Pollution 기본개념
- JavaScript는 객체지향 언어로 Class가 없었으나, ECMA6 표준에서는 Class라는 키워드가 추가됨. 그래서 javascript에는 prototype이라는 개념이 등장함. 이러한 점을 이용한 취약점이다.
Javascript Prototype Chain
- 자바스크립트에서는 prototype이라는 객체를 사용하여 상속한다. 자바스크립트에서 객체의 부모는 __proto__로 접근할 수 있다.
- 상속은 자식 객체에서 어떠한 변수를 찾을 수 없으면 부모 객체에서 해당 변수를 찾게되는데, Javascript에서는 이것을 Prototype Chain임
user라는 객체에서 hasOwnProperty() 메소드를 선언하지 않았음에도 호출할 수 있는 이유는 user 객체가 부모 객체에서 hasOwnProperty() 메소드를 상속받았기 때문이다. Object 리터럴 (즉, 중괄호 {}를 통한} 객체 선언 방식은 내부적으로 new Object();이 실행되며 선언된다. 이러한 이유로 Object 객체를 상속받게 되는 것이다.
b에서 부모 객체인 a의 attr에 접근할 수 있다. a가 부모객체가 된 것이고, b가 자식객체가 된 것이다. 객체 리터럴을 통해 선언한 객체의 부모는 Object.prototype이기 때문에, 객체에서 undefined인 속성에 접근할 때 Object.prototype에도 해당 속성이 있는지 확인한다.
foo는 객체 리터럴로 생성된 객체이며, foo.__proto__는 object.prototype이다.
Prototype Pollution 개념
Javascript 내부에서 객체지향의 핵심 기술인 상속을 Prototype Chain으로 구현한 점을 이용, 특정 로직을 우회하거나 코드가 해커가 원하는 방향으로 실행되도록 만드는 공격이다.
위 예제에서 obj1의 프로토타입 객체를 조작했다. 아무 관계 없는 obj2속성의 값(obj2.polluted)이 undefined가 아니라 1로 출력된다.
'웹 공부' 카테고리의 다른 글
구름 IDE를 이용한 리버스셸(feat. MinYuqShu) (1) | 2023.12.05 |
---|---|
SSTI (2) | 2023.11.22 |
Express.js (1) | 2023.11.22 |
SSRF(Server Side Request Forgery) (2) | 2023.11.22 |
CSRF (0) | 2023.11.13 |