새소식

인기 검색어

보안/웹(Web)

프로토타입 오염 (Prototype Pollution)

  • -

프로토타입

  • 자바스크립트에서 모든 객체들이 메소드와 속성을 상속 받기 위한 객체

 

객체를 생성할 때 기본적으로 상속되며 여러 메소드를 포함합니다. 새로운 인스턴스가 생성될 때, 생성된 인스턴스는

 

상위 객체의 프로토타입을 상속받아 생성되고, 인스턴스의 상위 객체 또한 더 위의 상위 객체로부터 프로토타입

 

객체를 상속받아 생성됩니다. 이렇게 프로토타입 객체를 상속받고 또 상속받는 것을 '프로토타입 체인' 이라고 합니다.

 

프로토타입이 상속되었기 때문에 아무런 내용도 없이 생성되었던 obj 객체에서도 다양한 메소드를 사용할 수 있습니다.

 

상속받은 여러 메소드 중 valueOf 함수를 사용해보겠습니다.

 

 

 

객체에서 메소드가 사용되면 먼저 해당 객체에서 메소드를 찾고, 존재하지 않으면 상속받은 프로토타입에서

 

메소드를 찾게됩니다. 그렇기 때문에 상속받은 valueOf 함수가 실행되었습니다.

 

이렇듯 프로토타입은 상위 객체에서 새로 만든 객체에 상속되어 상위 객체의 기능을 사용할 수 있도록 합니다.

 

 

 

 

프로토타입 오염

 

말 그대로 프로토타입이 오염되는 것입니다. 상위 객체에서 상속되어오는 프로토타입을 사용자가 접근하여 내용을

 

변경하거나 임의의 내용을 추가하면 그것은 하위 객체에도 그대로 상속되게 됩니다.

 

function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}
 
function setValue(obj, key, value) {
  const keylist = key.split('.');
  const e = keylist.shift();
  if (keylist.length > 0) {
    if (!isObject(obj[e])) obj[e] = {};
    setValue(obj[e], keylist.join('.'), value);
  } else {
    obj[key] = value;
    return obj;
  }
}

 

프로토타입 오염 공격에 취약한 코드입니다. 위의 setValue 함수에 다음과 같이 인자를 주면 프로토타입을 오염시킬 수

 

있습니다.

 

setValue(r1,"__proto__.name", 1);

 

이제 r1 객체의 name 을 호출해보면 1이 출력될 것입니다. 그리고 새로운 객체 r2 를 만들어 name 을 호출해도 1이

 

출력됩니다. 객체가 상속받는 프로토타입이 사용자에 의해 오염되었기 때문입니다.

 

r1={};
setValue(r1,"__proto__.name",1);
console.log(r1.name); // 1
r2={};
console.log(r2.name); // 1

 

 

 

공격 방지책

  • Object.freeze(Object.prototype) 메소드를 이용해 프로토타입을 동결시킵니다

 

Object.freeze 메소드는 객체를 동결시킵니다. 이 메소드로 prototype 을 동결시키면 사용자가 오염시킬 수 없을 것입니다.

 

 

 

참고

 

'보안 > 웹(Web)' 카테고리의 다른 글

JWT (Json Web Token)  (0) 2024.07.08
[PHP] mysqli_real_escape_string 함수  (1) 2023.01.09
XSS (Cross Site Scripting)  (0) 2022.12.12
CSP(Content Security Policy)  (0) 2022.09.23
디코딩 전 필터링  (0) 2022.09.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.