ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript Prototype과 Prototype Pollution
    #1 - Security/Web 2022. 12. 28. 17:35

    드림핵 문제를 풀던 중 Prototype Pollution 취약점에 대해 알게 되었다.

    기본적으로 JavaScript는 프로토타입 언어로 Class개념 대신 Prototype 개념이 존재합니다.

     

    쉽게 설명하면 이렇습니다. 객체라는건 대부분 함수로 생성 하는것으로 알고 있으실텐데

    자바스크립트는 아래와 같이 선언했을때도 객체 생성이 가능합니다. (Object 라는 함수를 자동으로 선언하게)

    var obj = {}; // = var obj = new Object();

    Object와 마찬가지로 Function, Array, Dictionary 모두 함수로 정의되어 있겠죠?

     

    다른 예시를 들어 Person 이라는 함수가 있다고 가정합니다.

    function Person(){
    	console.log("test")
    }

    이렇게 Person을 선언하게 되면 함수만 생성되는게 아니라 Prototype Object 라는 것도 같이 생성이 됩니다.

    생성된 함수는 prototype이라는 속성을 통해 Prototype Object에 접근할 수 있습니다. 

    그리고 Prototype Object의 속성 중 __proto__ 를 통해 함수 객체와 연결이 되어있죠.

     

    이제 여기서 새로운 객체를 생성해보겠습니다.

    var kim = new Person();

    그러면 kim의 __proto__ 속성은 Person Prototype Object를 바라보게 되고 그 안에 __proto__ 값을 전부 가지게 되는 것입니다.

    만약 kim 말고 다른 객체가 생성이 되었고 __proto__ 값을 바꿀 수 있다면 kim 속성까지 침범하게 되는것이죠

    var kim = new Person();
    var park = new Person(); // Person Prototype Object를 공유

    여기서 다른 객체의 값까지 침범할 수 있는게  Prototype Pollution 입니다.

     

    예제 코드를 보겠습니다.

    const obj1 = {};
    console.log(obj1.__proto__ === Object.prototype); // true
    obj1.__proto__.polluted = 1;
    const obj2 = {};
    console.log(obj2.polluted); // 1

     

    위의 설명한대로 obj1와 obj2 는 Object의 객체를 생성하였습니다.

    obj1의 __proto__ 속성을 이용하여 polluted 값을 1로 설정했습니다.

    그러면 obj1.polluted 값은 1로 됩니다. 그치만 Object로 생성된 obj2 의 경우에도

    자동으로 상속을 받게되며 obj2.polluted가 생기는거죠 그 값은 __proto__에 저장된 값 1로 저장이 됩니다.

     

    이러한 공격이 JavaScript Prototype Pollution 이고 더 자세한 내용은 추후 포스팅할게요

     

    참조 - https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67

    '#1 - Security > Web' 카테고리의 다른 글

    Python Requests Authorization Header  (0) 2022.12.02
    SSRF Payload  (0) 2020.07.13

    댓글

Designed by Tistory.