# XS-Search/XS-Leaks
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\ 오늘 바로 액세스하세요: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요 HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. * **HackTricks** 및 **HackTricks Cloud** github 저장소로 PR을 제출하여 **해킹 트릭을 공유**하세요.
## 기본 정보 XS-Search는 **사이드 채널 취약점을 활용**하여 **교차 출처 정보를 추출**하는 방법입니다. 이 공격에 관여하는 주요 구성 요소는 다음과 같습니다: * **취약한 웹**: 정보를 추출하려는 대상 웹사이트. * **공격자의 웹**: 피해자가 방문하는 악의적인 웹사이트로, 악용을 호스팅하는 공격자가 생성한 웹사이트. * **포함 방법**: 취약한 웹을 공격자의 웹에 통합하는 데 사용되는 기술 (예: window.open, iframe, fetch, href가 있는 HTML 태그 등). * **누출 기술**: 포함 방법을 통해 수집된 정보를 기반으로 취약한 웹의 상태 차이를 식별하는 데 사용되는 기술. * **상태**: 공격자가 구별하려는 취약한 웹의 두 가지 잠재적인 상태. * **감지 가능한 차이점**: 공격자가 취약한 웹의 상태를 추론하는 데 의존하는 관찰 가능한 변화. ### 감지 가능한 차이점 취약한 웹의 상태를 구별하기 위해 여러 측면을 분석할 수 있습니다: * **상태 코드**: 교차 출처에서 **다양한 HTTP 응답 상태 코드**를 구별하여 서버 오류, 클라이언트 오류 또는 인증 오류를 확인합니다. * **API 사용**: 페이지 간 **Web API 사용**을 식별하여 교차 출처 페이지가 특정 JavaScript Web 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 예외 또는 특수 오류 페이지는 오류 메시지 자체에서 누출 정보를 제공하거나 존재 여부와 부재 여부를 구별함으로써 누출 정보를 제공할 수 있습니다. * **전역 제한**: 브라우저의 물리적 제한, 예를 들어 메모리 용량 또는 다른 강제 브라우저 제한,는 한계에 도달했을 때 신호를 보내어 누출 기술로 작용할 수 있습니다. * **전역 상태**: 브라우저의 **전역 상태**와의 상호 작용을 감지할 수 있으며, 예를 들어 브라우저의 히스토리 인터페이스에서 **항목 수**는 교차 출처 페이지에 대한 단서를 제공할 수 있습니다. * **성능 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/)에서 **도구에 액세스**할 수 있습니다. {% hint style="warning" %} **제외된 XS-Leaks**: 다른 XSinator 누출과 간섭할 수 있기 때문에 **서비스 워커에 의존하는 XS-Leaks를 제외**해야 했습니다. 또한, **특정 웹 응용 프로그램의 구성 오류 및 버그에 의존하는 XS-Leaks를 제외**하기로 결정했습니다. 예를 들어, Cross-Origin Resource Sharing (CORS) 구성 오류, postMessage 누출 또는 Cross-Site Scripting. 또한, 시간 기반 XS-Leaks를 제외했는데, 이는 종종 느리고 소음이 많으며 정확하지 않기 때문입니다. {% endhint %}
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\ 오늘 바로 액세스하세요: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## **시간 기반 기술** 다음 기술 중 일부는 타이밍을 사용하여 웹 페이지의 가능한 상태의 차이를 감지하는 프로세스의 일부로 사용됩니다. 웹 브라우저에서 시간을 측정하는 다양한 방법이 있습니다. **시계**: [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)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\)) {% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} [cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md) {% endcontent-ref %} 코드 예시는 **JS에서 스크립트 객체를 로드하려고 시도**하지만 **객체, 스타일시트, 이미지, 오디오**와 같은 다른 태그도 사용할 수 있습니다. 또한 **태그를 직접 삽입**하고 태그 내부에 `onload` 및 `onerror` 이벤트를 선언하는 것도 가능합니다 (JS에서 삽입하는 대신). 이 공격의 스크립트 없는 버전도 있습니다: ```html ``` 이 경우에는 `example.com/404`을 찾을 수 없을 때 `attacker.com/?error`가 로드됩니다. ### Onload Timing * **포함 방법**: HTML 요소 * **감지 가능한 차이점**: 타이밍 (일반적으로 페이지 콘텐츠, 상태 코드로 인한) * **더 많은 정보**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) * **요약:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API**는 요청을 수행하는 데 걸리는 시간을 측정하는 데 사용될 수 있습니다. 그러나 [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming)와 같은 다른 시계도 사용할 수 있습니다. 이 API는 50ms 이상 실행되는 작업을 식별할 수 있습니다. * **코드 예시**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 다른 예시: {% content-ref url="xs-search/performance.now-example.md" %} [performance.now-example.md](xs-search/performance.now-example.md) {% endcontent-ref %} #### Onload Timing + 강제 Heavy Task 이 기술은 이전 것과 비슷하지만 **공격자**는 **긍정적 또는 부정적인** 답변일 때 **일정한 시간**이 소요되도록 **강제**하고 그 시간을 측정합니다. {% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} [performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md) {% endcontent-ref %} ### unload/beforeunload Timing * **포함 방법**: 프레임 * **감지 가능한 차이점**: 타이밍 (일반적으로 페이지 콘텐츠, 상태 코드로 인한) * **더 많은 정보**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) * **요약:** [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers)를 사용하여 요청을 수행하는 데 걸리는 시간을 측정할 수 있습니다. 다른 시계도 사용할 수 있습니다. * **코드 예시**: [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 * **포함 방법**: 프레임 * **감지 가능한 차이점**: 타이밍 (일반적으로 페이지 콘텐츠, 상태 코드로 인한) * **더 많은 정보**: [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) * **요약:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API를 사용하여 요청을 수행하는 데 걸리는 시간을 측정할 수 있습니다. 다른 시계도 사용할 수 있습니다. * **코드 예시**: [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 * **포함 방법**: 프레임 * **감지 가능한 차이**: 페이지 콘텐츠 * **자세한 정보**: * **요약**: 페이지가 올바른 콘텐츠에 액세스할 때 페이지에 오류를 발생시키고, 어떤 콘텐츠에 액세스할 때는 올바르게 로드되도록 만들면 시간을 측정하지 않고 모든 정보를 추출할 수 있는 루프를 만들 수 있습니다. * **코드 예시**: 예를 들어, **Iframe**에 **비밀 콘텐츠가 있는 페이지**를 **삽입**할 수 있다고 가정해보겠습니다. 피해자가 "_**flag**_"를 포함하는 파일을 검색하도록 **Iframe**을 사용할 수 있습니다(예: CSRF를 이용). Iframe 내에서 _**onload 이벤트**_가 **적어도 한 번은 항상 실행**될 것을 알고 있습니다. 그런 다음 **URL**의 **해시** 내용만 변경하여 **iframe**의 **URL**을 변경할 수 있습니다. 예를 들어: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 첫 번째 URL이 **성공적으로 로드**된 경우, **URL의 해시** 부분을 **변경**해도 **onload** 이벤트가 다시 **트리거되지 않습니다**. 그러나 **페이지가 로드될 때 오류**가 발생한 경우, **onload** 이벤트가 다시 **트리거**됩니다. 그럼으로 **올바르게** 로드된 페이지와 액세스할 때 **오류**가 있는 페이지를 **구별**할 수 있습니다. ### Javascript 실행 * **포함 방법**: 프레임 * **감지 가능한 차이**: 페이지 콘텐츠 * **자세한 정보**: * **요약**: **페이지**가 **민감한** 콘텐츠를 **반환**하거나 사용자가 **제어**할 수 있는 **콘텐츠**를 반환하는 경우, 사용자는 **부정적인 경우에 유효한 JS 코드를 설정**하고 각 시도를 **`