eval()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수입니다. Function으로는 실현할 수 없는 공격이 가능합니다.
라고 작성되어있는데 정확히 이게 무슨 소린가 싶다. 그래서 좀 찾아봤다.
자바스크립트에는 스코프(Scope)라는게 있는데 전역 스코프, 블록 스코프, 함수 스코프가 존재한다.
let | const | var | |
유효범위 | Block Scope | Block Scope | Function Scope |
값 재정의 | O | X | O |
재선언 | X | X | O |
출처: https://joooing.tistory.com/entry/Scope
function func() {
var a = 1;
}
console.log(a);
예로 들면 var a는 func의 함수 스코프에서 유효하므로 func 함수 밖에서 a 변수에 접근할 수 없다.
Function 생성자나 eval 함수를 통해 생성된 함수에도 이런 스코프가 존재한다.
Function 생성자는 전역 스코프에서만 실행되는 함수를 만들게 된다.
반면 eval()는 caller 권한 즉, 함수 자신을 호출한 함수에 따라 전역 함수가 될 지 내부 함수가 될지 달라진다.
예시로 사용자의 입력 값이 func()이라는 함수 내 반영되고 eval 또는 Function 생성자를 통해 스크립트를 실행한다면 이런 차이가 발생하게 된다.
Function 생성자로 실현할 수 없는 특수한 상황이 뭔지는 알겠는데
사용자의 입력 값이
- 함수 내에 반영되고
- 스크립트를 임의 실행이 가능하고
- 함수 내 공격자 관점에서 유의미하게 활용할 수 있는 데이터가 존재하는 경우
같은 제한적인 상황이라서 Function 생성자에 비해 엄청나게 위험한 것 처럼 작성된 이유도 모르겠고 (eval을 절대 사용하지 않아야한다기보다 사용자 입력 값이 스크립트로 해석되지 않는 게 중요한게 아닌지) 자주 써먹을 수 있을지도 잘 모르겠다.
'Web,Mobile > Tech' 카테고리의 다른 글
String, Number형 변수를 이용한 XSS Bypass (0) | 2023.08.08 |
---|---|
JSFuck과 Function 객체 생성자를 이용한 XSS Bypass (0) | 2023.07.19 |
XSS Bypass in window.location (0) | 2022.05.03 |
Log4shell(CVE-2021-44228) + JNDI Injection (0) | 2021.12.17 |
Unicode upper/lower Trick (0) | 2019.04.08 |