> For the complete documentation index, see [llms.txt](https://docs.cooku222.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cooku222.kr/security/web-hacking/etc.-reference/webhacking-reference-xs-leaking-flags-with-css-a-ctfd-0day-1.md).

# \[WebHacking Reference] XS-Leaking flags with CSS: A CTFd 0day (1)

XS-Leaks를 사용하면 사용자간 응답의 내용을 확인할 수 없지만, 응답의 부작용 및 기타 비트가 사이트 간에 노출되는 것을 볼 수 있음.\
한 가지 간단한 예는 다른 사이트에 대한 창 참조가 다른 페이지가 접근할 수 있는 .length 속성을 갖는 프레임 카운팅(frame Counting)이다.

* 이는 공격자에게 응답 내부에 몇 개의 iframes가 있는지 알려줌. 아직 흥미롭게 들리지는 않지만, XS-Search를 사용하면 이러한 동작을 매우 잘 활용할 수 있음.
* 이를 위해서는 대상 웹사이트에서 검색 기능이 필요하며, 이를 통해 결과가 서로 다른 감지 가능한 사이드 채널을 생성함. 그런 다음 공격자는 XS-Leak이 trigger될 때까지 문자열을 문자별로 검색하여 비정상적인 결과를 표시함. 그런 다음 이를 검색어에 추가하고 다음 문자로 계속 진행하여 결국 전체 문자열을 유출할 수 있음.

```
git clone git@github.com:CTFd/CTFd.git && cd CTFd
docker-compose up
```

* 도커로 구축하면 실행 가능..<br>

CTFd 인스턴스의 꽃(원문엔 crown jewel이라고 했는데 좀 의역하면 꽃? 핵심? 이런 의미인듯?)중 하나는 flag이다. flag은 항상 비밀로 유지되어야 하며(당연함.. 답이니까), flag과 관련된 기능을 목표로 삼아 높은 영향력을 발휘해야 함.\
첫 번째는 문제 편집기 내부에서 flag를 직접 보는 것이다.(근데 이건 관리자 권한 있어야 가능한 거 같다.. 화면 보면 admin 경로로 이동했기 때문이다)

<figure><img src="https://blog.kakaocdn.net/dna/OL8NT/btsOCjpjgct/AAAAAAAAAAAAAAAAAAAAAPJEaz1rNEx3qzd5o1Q79zDOtgglCMID9aYf_YyO4xm8/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=ZAQfTGo4McKLAsEySWSB6wsmf54%3D" alt="" height="863" width="862"><figcaption><p>flag를 직접 검색한 결과</p></figcaption></figure>

배경에서 /api/v1/flags/1에 대한 요청(\[url]/api 값 구조인듯) 이 이 챌린지의 플래그를 가져옴. 그러나, 여기에는 플래그에 대한 명확한 검색 기능이 없는 것 같음. 챌린지 테이블에는 검색 표시줄이 있지만 플래그 콘텐츠는 검색하지 않고 이름, ID, 카테고리 및 유형만 검색한다. 이 기능은 취약점은 없는 듯함.\
\
다음으로, Submissions라는 관리 기능에서도 플래그를 찾을 수 있다. 여기서 관리자는 올바른 플래그 제출과 잘못된 플래그 제출을 검색하여 일반적인 실수나 남용을 발견할 수 있음.&#x20;

<figure><img src="https://blog.kakaocdn.net/dna/bmaK13/btsOBkbtt6H/AAAAAAAAAAAAAAAAAAAAAOzhi8VVlxf_5iqBKQLzVtpUYJdSYoh-4Qw9gkljLuiK/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=al9DiX%2FEeGq2P%2FYGftHZtHwSBy8%3D" alt="" height="847" width="1180"><figcaption><p>CTFd의 올바른(정답) 제출 페이지에서 "CTF{" 검색 후 한 가지 결과가 표시됩니다.</p></figcaption></figure>

사용자가 문제를 해결한 후에는 제출물이 이 테이블에 표시된다.\
?field=preved에 대한 \&q= 쿼리 매개변수 필터링을 사용하여 검색할 수 있음.\
정답인지 오답인지 구분할 수 있는가?\
-> 정답이 아닌 쿼리는 빈 테이블을 반환합니다:

<figure><img src="https://blog.kakaocdn.net/dna/F8o59/btsOCw9OAc9/AAAAAAAAAAAAAAAAAAAAAG_3584-9YncXZPHIljbKwawjSyCMLtdRxOtoXP0nblB/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=E7nzU4ZJuIhxlfD7qNceXCnKBJ4%3D" alt="" height="855" width="1677"><figcaption><p>CTFd의 정답 제출 페이지에서 "CTFX"를 검색해도 결과가 나타나지 않음..</p></figcaption></figure>

두 응답 모두에 iframe이 없으므로 프레임 카운팅을 사용할 수 없음.\
유일한 변경 사항은 추가 \<td> 항목으로 쿼리가 일치하지 않을 때를 대비한 특별한 '404 error' 페이지를 얻는 것이 이상적이며, 이 페이지에는 더 큰 변경 사항이 포함될 가능성이 있음.\
하지만 정답을 50개 이상 추가하면 결과가 더 흥미로워지기 시작한다. 이 시점에서 테이블이 너무 커져서 페이지화된 청크로만 볼 수 있음:

<figure><img src="https://blog.kakaocdn.net/dna/bIOhg8/btsOAJ30Ioq/AAAAAAAAAAAAAAAAAAAAABRbUOT9xIlh82cHAIhuKosNnSPTp-PaXa2YpC4hPCC2/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=w7hAgoQQ%2BEFAwSqy0qEbobMgzuE%3D" alt="" height="422" width="1845"><figcaption></figcaption></figure>

두 번째 페이지는 주소 표시줄에서 \[url]?page=2를 사용하여 가져옴.\
하지만 지금 \&q= 매개변수를 변경하면 다음과 같이

<figure><img src="https://blog.kakaocdn.net/dna/qgA1r/btsOAKBMZDT/AAAAAAAAAAAAAAAAAAAAAHPy5t-i-cO59fEc2mV8vw5b9ZhU5hd6FqG0tSrlCK0b/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=jtqMmTjt%2FRkvyW8HnhwnV31PvRg%3D" alt="" height="855" width="1481"><figcaption></figcaption></figure>

404 에러를 볼 수 있다.\
\- 이전엔 빈 화면 뜨던게 이번엔 에러 창이 뜬다. 그럼 우리가 flag 값도 leak 할 수 있지 않을까?&#x20;

```
HTTP/1.1 200 OK

vs.

HTTP/1.1 404 NOT FOUND
```

+) XS-Leaks 위키에는 요청이 성공했는지(200) 실패했는지(404)를 감지하는 "오류 이벤트"에 대한 전체 섹션이 있음. <스크립트> 태그와 온에러/온로드 핸들러를 사용하여 성공적으로 로드되었는지 여부를 확인하는 것이 매우 유망해 보임.\
-> 응답은 유효한 JavaScript 여야 하지만 HTML 응답은 유효하지 않고, 두 경우 모두 오류 이벤트가 발생함\
-> 두 요청 모두 302 redirect 후 /login함. 사이트간 요청 인증 진행 x\
-> 웹 초창기에는 쿠키가 항상 전송되었지만, 현대에는 이러한 백그라운드 요청(제3자 컨텍스트)에서 쿠키가 전송되지 않도록 하는 SameSite와 같은 보호 기능이 존재함. CTFd는 기본적으로 SameSite=lax cookie를 사용하므로 주소 표시줄이 요청의 출처(상위 컨텍스트)와 일치하는 경우에만 전송됨.\
-> 우리는 window\.open ()와 같은 API를 사용하여 최상위 컨텍스트에서 URL을 열 수 있으며, 이는 인증 쿠키를 올바르게 전송하지만 오류나 로드 이벤트를 탐색하는 것을 허용하지 않음. 많은 일반적인 XS-Leak 기술은 Lax 쿠키를 통해 방지됨. \
\
\=> 크롬에서는 브라우저의 기록에 200개의 응답이 저장되지만 404개의 응답은 저장되지 않는다. 이는 일치하는 쿼리는 최상위 컨텍스트에서 방문한 후 기록에 저장되지만 일치하지 않는 쿼리는 저장되지 않는다는 뜻이다. 하지만 단순히 공격자의 사이트에서 기록을 유출할 수는 없다.\
&#x20;

#### Leaking history

XS-Leaks 위키는 "CSS 트릭"에서 언급하는데, CSS :visited selector를 사용하면 방문한 URL에 대해 다른 스타일을 적용할 수 있습니다.\
\
이렇게 하면 링크에서 색상을 추출하거나 배경을 추가하여 필터링 요청을 트리거할 수 있음:\
url(...) 스타일 -> 시도해 볼 수는 있지만 최신 브라우저에서는 작동하지 않음.\
"Privacy and :vised Selector" 에서는 이 Selector에 적용할 수 있는 스타일에 대한 규칙이 있는 이유와 일부 API가 이 selector 가 전혀 적용되지 않은 것처럼 거짓말을 하고 색상을 반환하여 공격자가 상호작용 없이 기록을 유출할 수 없는 이유를 설명함.\
하지만 사용자는 표시된 창에서 다른 색상을 감지할 수 없더라도 여전히 다른 색상을 볼 수 있음.\
-> 이를 통해 사용자가 요소의 색상을 유출하는 명령을 따르는 공격이 가능함.&#x20;

<figure><img src="https://blog.kakaocdn.net/dna/bJ14JQ/btsOB13xrB2/AAAAAAAAAAAAAAAAAAAAACILN4ZTh2G2yEgfL9Vj7m73d35Dah-LMbm9rBK-144h/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=XGDPouHPqgzzo3TROmtW2MKBuuU%3D" alt="" height="548" width="1856"><figcaption><p>query "CTF{f}"에 보라색(이미 클릭했다는 의미의...)이 하나 있는 anchor tag 목록</p></figcaption></figure>

브라우저 기록에 저장하기 위해 가능한 모든 항목이 최상위 컨텍스트에서 방문되었는지 확인해야 함(쉽게 말해 보라색인지 아닌지.. 이미 본 사이트인지 아닌지).\
이를 위해 window\.open ()를 사용할 수 있지만, 이를 위해서는 각 팝업에 대한 사용자 상호작용이 필요함.\
대신 팝업 창을 한 번 열고 사용자 상호작용 없이 .location =를 여러 번 사용하여 기존 팝업에서 로드된 URL을 변경할 수 있음.\
&#x20;

***

{% embed url="<https://jorianwoltjer.com/blog/p/hacking/xs-leaking-flags-with-css-a-ctfd-0day>" %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cooku222.kr/security/web-hacking/etc.-reference/webhacking-reference-xs-leaking-flags-with-css-a-ctfd-0day-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
