1인1프로젝트

XS-Leak 취약점 탐구 (4)

엑슨 2025. 4. 24. 11:45

이제부터 설명할 취약점은 CTFd 버전 < 3.7.2 에서 가능한 XS-Leak 취약점이다.

 

XS-leaks 취약점은 cross-site 응답을 유추하기 위해 브라우저의 사이드 채널을 이용한다. 일반적으로 target.com이라는 웹사이트에서 사용자가 인증하여 민감한 데이터를 리턴받을 때, 다른 attacker.com이라는 웹사이트는 이 민감한 데이터를 읽을 수 없다. 바로 Same-Origin Policy (SOP) 정책이 이를 방지하기 때문이다.

 

XS-leaks를 사용하면, 여전히 다른 사이트의 응답 내용 그 자체를 볼 수 없지만 그 내용의 side-effects와 다른 사소한 것처럼 보이는 것들을 알아낼 수 있다. 이것의 한가지 예시는 Frame Counting 이다. 

// Get a reference to the window
var win = window.open('https://example.org');

// Wait for the page to load
setTimeout(() => {
  // Read the number of iframes loaded
  console.log("%d iframes detected", win.length);
}, 2000);

 

한 사이트 내에서 window.open 함수를 이용해 다른 사이트를 열면, SOP 정책으로 인해 많은 정보를 얻지는 못하지만, 허용되는 파라메터들이 있는데 그 중 하나가 win.length이다. 이는 해당 window 객체에 로드된 iframe의 수를 알려주는 파라메터이다. 따라서 iframe의 개수에 따라 중요한 정보를 알 수 있는 사이트라면 이 파라메터를 사용해서 중요한 정보를 유출시킬 수도 있는 것이다! 

이렇게만 언급하면 대체 어떻게 유출시킬 수 있는지 와닿지 않을 수도 있다. 따라서 자세한 예시를 들어보겠다.

1. 어느 한 사이트에 플래그를 검색할 수 있는 기능이 있는데, 오로지 로컬호스트에만 작동한다. 

2. 로컬호스트에서 "/search/문자열" 라는 path로 검색할 수 있다.

3. /search/문자열 path에서는 플래그에 해당되는 문자열 하나 당 하나의 iframe을 생성한다.

이 상황에서 공격자는 /search/a, /search/b ... 와 같이 한 글자만 검색해서 window.iframe의 개수를 확인하고, 그 개수가 1이라면 해당되는 플래그가 있다는 뜻이므로, 그 문자는 고정시키고 그 문자 다음에 똑같은 방식으로 한글자씩 변경하면서 개수를 확인한다. 이 과정을 반복하면 iframe의 개수를 알아내는 것만으로도 플래그를 유출시킬 수 있다.