Try to be the expert.

Ainsetin's Hacking & PS & Math

2021 1人 1 Project

1인 1프로젝트 : 7일차 (prototype & pollution)

Ainsetin 2021. 6. 10. 16:39

어떤 한 객체는 반드시 [[prototype]]이라는 hide property를 가지고 있다. 이 property는 내부에서 참조를 통해 다른 객체의 메서드나 변수를 가져올 수 있는 기능을 한다.

 

예를 들어, 다음과 같은 코드에서 prototype이 어떤 값을 가지고 있는지를 알 수 있다.

 

1
2
3
4
5
6
7
a={
    'A'1234,
    'B'"5678"
}
 
var b={};
console.log(b.__proto__)
cs

 

__proto__ 를 사용하면 위 사진과 같이 참조할 또 다른 객체를 적용시킬 수 있는데, 현재 b라는 객체는 constructor, __defineGetter__, .... 등을 가지고 있는 내부 객체가 할당되어 있다. 따라서 __proto__ 값을 a라는 객체로 만들어주면 overwrite가 된다.

그럼 만약 __proto__를 다른 객체로 치환하지 않고, 이미 할당 되어있는 객체 안에 새로운 key-value를 할당해주면 어떤 일이 발생할까?

원래의 객체 안에 alert(1)을 호출하는 in_proto 라는 메서드가 새로 추가되었다. 그렇다면, 만약 그냥 __proto__를 입력했을 때는 해당 메서드가 추가되어 있을까?
그냥 __proto__를 입력했을 경우에는 window라는 객체의 prototype을 불러오는 것과 마찬가진데, 여기는 적용이 안되어 있지 않을까.... 라는 합리적인 생각을 했지만, 이건 틀렸다.

__proto__는 Object.prototype와 같은 의미이기 때문에, prototype의 기능을 따라 어떠한 다른 객체를 똑같이 참조하고 있다. 그렇기 때문에 다른 객체에도 오염이 되는 것이다.

이를 "Prototype Pollution" 이라고 한다.

 

이러한 로직 버그를 발견하였다면, 웹 상에서 Node.js와 같이 자바스크립트 framework로 웹 서버를 구축할 때 서버단에서 prototype pollution을 일으켜 원하는 javascript code를 실행할 수도 있을 것이다.

 

많은 CTF에서 prototype pollution에 관한 문제를 종종 내는 편이고, 한국 해킹교육 사이트인 dreamhack.io에도 해당 취약점 관련 문제가 있다. 한번 풀어봐도 좋겠다.

https://dreamhack.io/wargame/challenges/205/