# XS-Search/XS-Leaks {{#include ../banners/hacktricks-training.md}} ## 기본 정보 XS-Search는 **사이드 채널 취약점**을 활용하여 **교차 출처 정보**를 **추출하는 방법**입니다. 이 공격에 관련된 주요 구성 요소는 다음과 같습니다: - **취약한 웹**: 정보가 추출될 대상 웹사이트. - **공격자의 웹**: 피해자가 방문하는 공격자가 만든 악성 웹사이트로, 익스플로잇을 호스팅합니다. - **포함 방법**: 취약한 웹을 공격자의 웹에 통합하기 위해 사용되는 기술(예: window.open, iframe, fetch, href가 있는 HTML 태그 등). - **유출 기술**: 포함 방법을 통해 수집된 정보를 기반으로 취약한 웹의 상태 차이를 식별하는 데 사용되는 기술. - **상태**: 공격자가 구별하고자 하는 취약한 웹의 두 가지 잠재적 조건. - **감지 가능한 차이**: 공격자가 취약한 웹의 상태를 추론하는 데 의존하는 관찰 가능한 변동. ### 감지 가능한 차이 취약한 웹의 상태를 구별하기 위해 분석할 수 있는 여러 측면이 있습니다: - **상태 코드**: 서버 오류, 클라이언트 오류 또는 인증 오류와 같은 **다양한 HTTP 응답 상태 코드**를 교차 출처로 구별합니다. - **API 사용**: 특정 JavaScript 웹 API를 사용하는지 여부를 드러내는 **웹 API 사용**을 식별합니다. - **리디렉션**: HTTP 리디렉션뿐만 아니라 JavaScript 또는 HTML에 의해 트리거된 다른 페이지로의 탐색을 감지합니다. - **페이지 콘텐츠**: **HTTP 응답 본문** 또는 페이지 하위 리소스에서의 **변동 관찰**, 예를 들어 **임베디드 프레임의 수** 또는 이미지의 크기 차이. - **HTTP 헤더**: **특정 HTTP 응답 헤더**의 존재 또는 값(예: X-Frame-Options, Content-Disposition, Cross-Origin-Resource-Policy)을 주목합니다. - **타이밍**: 두 상태 간의 일관된 시간 차이를 감지합니다. ### 포함 방법 - **HTML 요소**: HTML은 스타일시트, 이미지 또는 스크립트와 같은 **교차 출처 리소스 포함**을 위한 다양한 요소를 제공합니다. 이로 인해 브라우저는 비HTML 리소스를 요청하게 됩니다. 이 목적을 위한 잠재적인 HTML 요소의 목록은 [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)에서 확인할 수 있습니다. - **프레임**: **iframe**, **object**, **embed**와 같은 요소는 HTML 리소스를 공격자의 페이지에 직접 포함할 수 있습니다. 페이지가 **프레임 보호가 부족한 경우**, JavaScript는 contentWindow 속성을 통해 프레임된 리소스의 window 객체에 접근할 수 있습니다. - **팝업**: **`window.open`** 메서드는 새 탭이나 창에서 리소스를 열어 JavaScript가 SOP에 따라 메서드 및 속성과 상호작용할 수 있는 **창 핸들**을 제공합니다. 팝업은 종종 단일 로그인에서 사용되며, 대상 리소스의 프레임 및 쿠키 제한을 우회합니다. 그러나 최신 브라우저는 특정 사용자 작업에만 팝업 생성을 제한합니다. - **JavaScript 요청**: JavaScript는 **XMLHttpRequests** 또는 **Fetch API**를 사용하여 대상 리소스에 직접 요청할 수 있습니다. 이러한 방법은 HTTP 리디렉션을 따르도록 선택하는 등 요청에 대한 정밀한 제어를 제공합니다. ### 유출 기술 - **이벤트 핸들러**: XS-Leaks에서 고전적인 유출 기술로, **onload** 및 **onerror**와 같은 이벤트 핸들러가 리소스 로딩 성공 또는 실패에 대한 통찰력을 제공합니다. - **오류 메시지**: JavaScript 예외 또는 특수 오류 페이지는 오류 메시지에서 직접 또는 그 존재와 부재를 구별하여 유출 정보를 제공할 수 있습니다. - **전역 한계**: 메모리 용량이나 다른 강제 브라우저 한계와 같은 브라우저의 물리적 제한은 임계값에 도달했을 때 신호를 보낼 수 있으며, 이는 유출 기술로 작용할 수 있습니다. - **전역 상태**: 브라우저의 **전역 상태**(예: History 인터페이스)와의 감지 가능한 상호작용을 악용할 수 있습니다. 예를 들어, 브라우저의 기록에 있는 **항목 수**는 교차 출처 페이지에 대한 단서를 제공할 수 있습니다. - **성능 API**: 이 API는 **현재 페이지의 성능 세부정보**를 제공하며, 문서 및 로드된 리소스에 대한 네트워크 타이밍을 포함하여 요청된 리소스에 대한 추론을 가능하게 합니다. - **읽기 가능한 속성**: 일부 HTML 속성은 **교차 출처에서 읽을 수 있으며**, 유출 기술로 사용될 수 있습니다. 예를 들어, `window.frame.length` 속성은 JavaScript가 교차 출처 웹페이지에 포함된 프레임의 수를 계산할 수 있게 합니다. ## XSinator 도구 및 논문 XSinator는 **여러 알려진 XS-Leaks**에 대해 브라우저를 **검사하는 자동 도구**로, 그 논문에서 설명됩니다: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) 도구에 **접근할 수 있는 곳**: [**https://xsinator.com/**](https://xsinator.com/) > [!WARNING] > **제외된 XS-Leaks**: XSinator의 다른 유출에 간섭할 수 있는 **서비스 워커**에 의존하는 XS-Leaks는 제외해야 했습니다. 또한, 특정 웹 애플리케이션의 잘못된 구성 및 버그에 의존하는 XS-Leaks도 **제외하기로 선택했습니다**. 예를 들어, CrossOrigin Resource Sharing (CORS) 잘못된 구성, postMessage 유출 또는 Cross-Site Scripting. 또한, 느리고 시끄럽고 부정확한 경우가 많기 때문에 시간 기반 XS-Leaks도 제외했습니다. ## **타이밍 기반 기술** 다음 기술 중 일부는 웹 페이지의 가능한 상태에서 차이를 감지하는 과정의 일환으로 타이밍을 사용할 것입니다. 웹 브라우저에서 시간을 측정하는 방법은 여러 가지가 있습니다. **시계**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API는 개발자가 고해상도 타이밍 측정을 얻을 수 있게 합니다.\ 공격자가 암묵적인 시계를 만들기 위해 남용할 수 있는 API의 수가 상당히 많습니다: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS 애니메이션 등.\ 자세한 정보는: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/)에서 확인할 수 있습니다. ## 이벤트 핸들러 기술 ### Onload/Onerror - **포함 방법**: 프레임, HTML 요소 - **감지 가능한 차이**: 상태 코드 - **자세한 정보**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **요약**: 리소스를 로드하려고 할 때 onerror/onload 이벤트가 리소스가 성공적으로/실패적으로 로드되면 트리거되며 상태 코드를 파악할 수 있습니다. - **코드 예제**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} xs-search/cookie-bomb-+-onerror-xs-leak.md {{#endref}} 코드 예제는 **JS**에서 스크립트 객체를 **로드하려고 시도하지만**, **다른 태그**(예: 객체, 스타일시트, 이미지, 오디오)도 사용할 수 있습니다. 또한, **태그를 직접 주입**하고 태그 내부에 `onload` 및 `onerror` 이벤트를 선언하는 것도 가능합니다(대신 JS에서 주입하는 대신). 이 공격의 스크립트 없는 버전도 있습니다: ```html ``` 이 경우 `example.com/404`가 발견되지 않으면 `attacker.com/?error`가 로드됩니다. ### Onload Timing - **Inclusion Methods**: HTML Elements - **Detectable Difference**: Timing (일반적으로 페이지 콘텐츠, 상태 코드로 인한) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Summary:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API**는 요청을 수행하는 데 걸리는 시간을 측정하는 데 사용할 수 있습니다. 그러나 [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming)와 같은 다른 시계를 사용할 수 있으며, 이는 50ms 이상 실행되는 작업을 식별할 수 있습니다. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 또 다른 예는: {{#ref}} xs-search/performance.now-example.md {{#endref}} #### Onload Timing + Forced Heavy Task 이 기술은 이전 기술과 유사하지만, **attacker**는 **긍정적 또는 부정적 응답**이 있을 때 **상당한 시간**이 걸리도록 **강제** 조치를 취하고 그 시간을 측정합니다. {{#ref}} xs-search/performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (일반적으로 페이지 콘텐츠, 상태 코드로 인한) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Summary:** [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers)는 요청을 수행하는 데 걸리는 시간을 측정하는 데 사용할 수 있습니다. 다른 시계를 사용할 수 있습니다. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) 리소스를 가져오는 데 걸리는 시간은 [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) 및 [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) 이벤트를 활용하여 측정할 수 있습니다. **`beforeunload`** 이벤트는 브라우저가 새 페이지로 이동하려고 할 때 발생하고, **`unload`** 이벤트는 실제로 탐색이 이루어질 때 발생합니다. 이 두 이벤트 간의 시간 차이를 계산하여 **브라우저가 리소스를 가져오는 데 소요된 시간**을 결정할 수 있습니다. ### Sandboxed Frame Timing + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (일반적으로 페이지 콘텐츠, 상태 코드로 인한) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Summary:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API는 요청을 수행하는 데 걸리는 시간을 측정하는 데 사용할 수 있습니다. 다른 시계를 사용할 수 있습니다. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/)이 없는 경우, 페이지와 그 하위 리소스가 네트워크를 통해 로드되는 데 필요한 시간을 공격자가 측정할 수 있는 것으로 관찰되었습니다. 이 측정은 일반적으로 iframe의 `onload` 핸들러가 리소스 로드 및 JavaScript 실행이 완료된 후에만 트리거되기 때문에 가능합니다. 스크립트 실행으로 인한 변동성을 우회하기 위해 공격자는 ` ``` ### #ID + error + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary**: 페이지에 올바른 콘텐츠에 접근할 때 오류가 발생하고, 어떤 콘텐츠에 접근할 때 올바르게 로드되도록 할 수 있다면, 시간을 측정하지 않고 모든 정보를 추출하는 루프를 만들 수 있습니다. - **Code Example**: 비밀 콘텐츠가 포함된 페이지를 **Iframe** 안에 **삽입**할 수 있다고 가정해 보겠습니다. 피해자가 **Iframe**을 사용하여 "_**flag**_"가 포함된 파일을 **검색**하도록 만들 수 있습니다(예: CSRF를 악용). Iframe 내부에서 _**onload event**_는 **항상 최소한 한 번은 실행됩니다**. 그런 다음, **URL**의 **iframe**을 변경할 수 있지만 URL의 **hash**의 **내용**만 변경합니다. 예를 들어: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 첫 번째 URL이 **성공적으로 로드되었다면**, URL의 **hash** 부분을 **변경할 때** **onload** 이벤트는 **다시 트리거되지 않습니다**. 그러나 페이지가 **로드**할 때 어떤 종류의 **오류**가 발생했다면, **onload** 이벤트는 **다시 트리거됩니다**. 그런 다음, **정상적으로** 로드된 페이지와 접근할 때 **오류**가 있는 페이지를 **구별**할 수 있습니다. ### Javascript Execution - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary:** 페이지가 **민감한** 콘텐츠를 **반환**하거나 사용자가 **제어할 수 있는** 콘텐츠를 반환하는 경우, 사용자는 **부정적인 경우에 유효한 JS 코드를 설정**할 수 있으며, 각 시도마다 **`