JavaScript 괄호 없이 함수 호출하는 또 다른 방법
원제 Yet another way to invoke functions without parentheses
183 포인트댓글 70
Key Point
JavaScript 보안 취약점 연구자와 CTF 참가자에게 필요한 고급 프로토타입 오염 기법으로, 엄격한 환경에서 코드 실행을 우회하는 원리를 이해하는 데 유용합니다.
핵심 요약
- JavaScript에서 괄호를 사용하지 않고 임의의 함수를 실행하는 새로운 방법을 소개합니다.
- Error 객체의 prepareStackTrace 함수를 덮어쓰는 방식으로 작동하며, 이 함수는 Error의 stack 속성에 접근할 때 호출됩니다.
- prepareStackTrace는 Function 생성자와 같은 함수 서명을 가지므로, 두 번째 인자가 유효한 JavaScript 코드면 함수를 생성할 수 있습니다.
- 생성된 함수를 호출하려면 Array.prototype.toString()의 출력을 조작해서 스택 트레이스를 유효한 JavaScript 페이로드로 변환해야 합니다.
- Object.prototype.message를 오염시켜 Error의 toString 함수를 조작하거나, Array 프로토타입을 직접 덮어써서 이를 구현할 수 있습니다.
- 함수 호출은 valueOf를 덮어씌운 후 객체를 원시값으로 사용하는 방식이나, toString을 이용해 문자열과 연결하는 방식으로 가능합니다.
- 실제 페이로드는 Object.prototype과 Array.prototype을 오염시킨 뒤 Error.prepareStackTrace에 Function을 할당하고, Error의 valueOf와 stack을 조작해서 코드를 실행합니다.