핵심 요약
- 에러 객체의 prepareStackTrace와 프로토타입 오염을 조합해 소괄호 없이 임의의 자바스크립트 함수를 생성하는 방법이 공개되었습니다.
- 배열의 문자열 변환과 단항 연산자를 이용한 객체 형변환 트릭을 통해 괄호 한 번 안 쓰고도 alert 페이로드가 실행됩니다.
- XSS 방어 필터링 우회 기법 연구자들 사이에서 기발한 발상으로 주목받고 있습니다.
요약 자바스크립트 환경에서 소괄호`()`를 전혀 사용하지 않고 임의의 함수를 실행(호출)하는 기발한 페이로드 트릭이 공개되었습니다. 보통 웹 해킹이나 XSS 공격 방어 환경에서는 소괄호가 필터링되는 경우가 많은데, 연구자들은 이를 우회하기 위해 다양한 변칙 문법을 연구하곤 합니다.
이번에 제시된 방식은 자바스크립트의 `Error` 객체에 내장된 `prepareStackTrace` 함수를 조작하는 것에서 출발합니다. 이 속성은 원래 에러의 스택 트레이스를 커스텀 포맷팅할 때 쓰이며, 에러 객체의 `stack` 속성에 접근하는 순간 자동으로 호출됩니다. 이때 인자로 넘어오는 구조화된 스택 배열이 `Function` 생성자의 시그니처와 호환될 수 있다는 점을 이용해 임의의 함수를 생성하도록 덮어씁니다.
하지만 스택 트레이스 배열 자체는 유효한 자바스크립트 코드가 아니기 때문에 그대로 호출하면 문법 에러(Syntax Error)가 발생합니다. 작성자는 이를 해결하기 위해 `Array.prototype.toString()`의 출력값을 제어하는 방식을 고안했습니다. `Object.prototype.message`를 오염시키고 `Error.prototype.toString`을 배열의 `toString`에 덮어씌움으로써 배열이 원하는 자바스크립트 문자열로 변환되도록 만들었습니다.
마지막으로 이렇게 생성된 함수를 실행하기 위해 단항 덧셈 연산자(`+`)를 통한 암시적 형변환 트릭을 사용했습니다. 객체의 `valueOf`를 생성된 함수(`x.stack`)로 지정한 뒤 `+x`를 실행하면, 숫자로의 원시값 변환 과정에서 소괄호 없이도 해당 함수가 즉시 트리거됩니다. 결과적으로 브라우저 콘솔에서 `+x` 한 줄로 `alert(1337)`을 띄우는 완전한 우회 페이로드가 완성되었습니다.
Sponsored · 광고