Tag Archive

#xss

이 태그가 포함된 글을 최신순으로 모아봤어요.

21
posts
BLOG2026-08-06
[🥇 Gold 4] 취약점을 찾는 게 아니라 막는 문제 — DreamHack PATCH-1 풀이
blog

[🥇 Gold 4] 취약점을 찾는 게 아니라 막는 문제 — DreamHack PATCH-1 풀이

122줄짜리 Flask 메모 API 에 심어 둔 취약점을 전부 패치해야 flag 가 나오는 문제. f-string SQLi 두 곳, format() 이 만들어 낸 Jinja2 SSTI 와 저장형 XSS, 메모 소유자 검증 누락, 소스에 박힌 secret_key 까지 여섯 군데를 로컬에서 재현해 놓고 고쳤다. 공격만 막고 끝나면 안 되고 SLA(기능 회귀) 도 같이 통과해야 한다.
#dreamhack#ctf#web+8
 
BLOG2026-08-05
[🥇 Gold 1] 허용된 속성 세 개로 window.CONFIG 를 만들어 낸다 — DreamHack Guest book v0.2 풀이
blog

[🥇 Gold 1] 허용된 속성 세 개로 window.CONFIG 를 만들어 낸다 — DreamHack Guest book v0.2 풀이

htmlentities 뒤에서 태그를 재조립하던 v0.1 의 버그는 그대로 두고, DOMDocument 화이트리스트만 덧붙인 방명록. 남은 것은 a 태그의 id·name·href 뿐인데 페이지 하단에 location.href = window.CONFIG.main 이 있었다. DOM Clobbering 으로 그 전역을 만들어 내고, 이를 막으려 걸어 둔 config.js 의 Object.freeze 는 경로를 한 칸 미는 RPO 로 걷어냈다.
#dreamhack#ctf#web+5
 
BLOG2026-07-29
[🥇 Gold 2] 이스케이프가 끝난 뒤에 태그를 만들면 소용이 없다 — DreamHack Guest book 풀이
blog

[🥇 Gold 2] 이스케이프가 끝난 뒤에 태그를 만들면 소용이 없다 — DreamHack Guest book 풀이

배포 파일이 함수 하나뿐인 방명록 문제. htmlentities 로 꼼꼼히 막아 놓고, 그 다음 줄에서 정규식으로 다시 a 태그를 조립한다. PHP 7.x 의 htmlentities 는 기본값이 ENT_COMPAT 라 홑따옴표를 건드리지 않고, 그 한 글자가 href 를 닫아 이벤트 핸들러를 붙일 자리를 연다. 정규식이 첫 닫는 괄호에서 끊기는 탓에 괄호 없는 JS 만 써야 한다.
#dreamhack#ctf#web+6
 
BLOG2026-07-21
[🥇 Gold 4] "/index.php/"조차 무해한 코드가 됐다 — DreamHack Relative Path Overwrite Advanced 풀이
blog

[🥇 Gold 4] "/index.php/"조차 무해한 코드가 됐다 — DreamHack Relative Path Overwrite Advanced 풀이

include() 대상 파일명 필터는 완벽해 보였다 — "..", ":", "/"를 전부 막으니 직접적인 LFI는 불가능하다. 그런데 그 필터는 GET 파라미터 하나만 검사할 뿐, 페이지가 상대경로로 불러오는 스크립트 파일까지는 신경 쓰지 않았다. Apache의 rewrite 규칙 하나가 확장자를 슬쩍 빠뜨리는 버그를 갖고 있었고, 그 덕에 스크립트 요청은 항상 404로 떨어져 우리가 요청한 URL을 그대로 반사하는 페이지에 도달한다. 문제는 반사된 텍스트 맨 앞에 우리가 손댈 수 없는 "/index.php/"가 항상 붙는다는 것 — 그런데 JavaScript 문법에서는 이 문자열이 우연히도 "아무 일도 하지 않는 정규식 리터럴"로 파싱된다는 걸 발견하면서 퍼즐이 풀렸다.
#dreamhack#ctf#web+5
 
BLOG2026-07-20
[🥈 Silver 1] 필터를 뚫지 않고 굶겨 죽였다 — DreamHack Relative Path Overwrite 풀이
blog

[🥈 Silver 1] 필터를 뚫지 않고 굶겨 죽였다 — DreamHack Relative Path Overwrite 풀이

XSS 필터가 걸린 페이지를 만나면 반사적으로 필터를 통과하는 페이로드부터 찾게 된다. 이 문제는 그 방향이 아니었다 — 필터 자체를 구현한 스크립트 파일을 아예 로드되지 못하게 만들면, 필터 로직은 실행조차 되지 않는다. PHP의 상대경로 include와 브라우저의 상대경로 script src가 서로 다른 기준점을 가진다는 점을 이용해, 필터 스크립트를 페이지 자기 자신으로 뒤바꿔치기했다.
#dreamhack#ctf#web+3
 
BLOG2026-07-13
[🥈 Silver 1] base 태그로 nonce 스크립트를 통째로 훔치다 — DreamHack CSP Bypass Advanced 풀이
blog

[🥈 Silver 1] base 태그로 nonce 스크립트를 통째로 훔치다 — DreamHack CSP Bypass Advanced 풀이

script-src 'self' 'nonce-…' 에 반영 XSS. 앞선 CSP Bypass는 /vuln이 입력을 raw로 돌려줘 자기-스크립트-가젯으로 풀렸지만, Advanced는 /vuln을 HTML로 감싸 그 길을 막았다. CSP에 base-uri가 없다는 틈을 파고들어, base 태그로 페이지의 정품 nonce 스크립트를 공격자 서버로 재해석시켜 임의 JS를 실행했다.
#dreamhack#ctf#web+5
 
BLOG2026-07-12
[🥈 Silver 1] nonce를 몰라도 XSS가 터진다 — DreamHack DOM XSS 풀이
blog

[🥈 Silver 1] nonce를 몰라도 XSS가 터진다 — DreamHack DOM XSS 풀이

CSP가 script-src에 nonce와 strict-dynamic을 걸어 인라인 스크립트도 onerror도 다 막는다. nonce는 매 응답마다 회전해서 값을 훔칠 수도 없다. 하지만 원시 HTML 주입점이 nonce가 붙은 jquery 스크립트보다 앞에 있어서, base 태그로 그 스크립트의 로드 origin을 내 서버로 돌려버리면 nonce 값을 몰라도 이미 붙은 nonce를 재활용해 내 JS가 실행된다. document.cookie를 동일출처 /memo에 적재해 회수했다.
#dreamhack#ctf#web+6
 
BLOG2026-07-07
[🥈 Silver 2] nonce는 뚫지 않고, 유출은 fetch를 안 쓴다 — DreamHack CSP Bypass 풀이
blog

[🥈 Silver 2] nonce는 뚫지 않고, 유출은 fetch를 안 쓴다 — DreamHack CSP Bypass 풀이

script-src 'self' 'nonce-X'가 걸린 반사형 XSS. 인라인 스크립트는 nonce가 없어 콘솔에서 바로 막히지만, /vuln 자신이 입력을 그대로 돌려주는 걸 이용해 <script src="/vuln?param=...">로 스스로를 "동일 출처 스크립트"로 위장시키면 nonce 없이 실행된다. 유출도 fetch/img가 아니라 top-level navigation으로 — CSP가 애초에 막지 않는 경로다. 목적지는 외부 서버가 아니라 같은 앱의 전역 메모장.
#dreamhack#ctf#web+5
 
BLOG2026-06-26
[🥉 Bronze 2] 대소문자 한 끗으로 뚫는 XSS 필터 — DreamHack XSS Filtering Bypass 풀이
blog

[🥉 Bronze 2] 대소문자 한 끗으로 뚫는 XSS 필터 — DreamHack XSS Filtering Bypass 풀이

script·on·javascript: 를 지우는 필터가 있는데도, 검사는 소문자로 하고 치환은 원본 그대로 한다는 한 줄 차이 때문에 <sCrIpt> 가 그대로 살아남는다. 봇이 들고 방문하는 flag 쿠키를 동기 XHR로 /memo에 흘려 회수한 과정을 정리했다. location.href 비동기 전송이 driver.quit 레이스에 걸려 실패했던 삽질까지 담았다.
#dreamhack#ctf#web+6
 
BLOG2026-06-06
[🥇 Gold 1] 깨진 정규식 한 줄이 XSS를 연다 — DreamHack Fast XSS 풀이
blog

[🥇 Gold 1] 깨진 정규식 한 줄이 XSS를 연다 — DreamHack Fast XSS 풀이

FastAPI의 TemplateResponse에 임의 kwarg를 주입해 응답 헤더를 손에 넣는다. 템플릿은 autoescape라 body로는 막히지만, uvicorn의 헤더 "이름" 검증 정규식이 문자클래스 조기 종료 버그로 깨져 있어 헤더 이름에 CRLF를 넣을 수 있었다. 응답 분리로 web 오리진에 <script>를 심어 어드민 봇의 FLAG 쿠키를 탈취했다. Theori OSR CTF 출제작.
#dreamhack#ctf#web+5
 
BLOG2026-06-05
[🥇 Gold 3] CSP nonce를 예측해서 박아 넣다 — DreamHack Dream Lectures 풀이
blog

[🥇 Gold 3] CSP nonce를 예측해서 박아 넣다 — DreamHack Dream Lectures 풀이

강의 신청 사이트의 reason 필드가 autoescape false로 그대로 렌더된다. 진짜 벽은 CSP nonce인데, 이 nonce가 16비트 LFSR로 생성되고 매 응답 헤더에 평문으로 샌다. 한 번 새어 나온 nonce로 LFSR을 복원해 다음 값을 예측하고, apply 한 요청 안에서 봇이 페이지를 읽는 타이밍에 맞춰 script nonce를 박아 CSP를 통과시킨 뒤 navigation으로 플래그를 빼냈다.
#dreamhack#ctf#web+6
 
BLOG2026-05-29
[💎 Diamond 4] jsdom ≠ Chrome 파서 차이로 터지는 mutation XSS — DreamHack web-dreamshop 풀이
blog

[💎 Diamond 4] jsdom ≠ Chrome 파서 차이로 터지는 mutation XSS — DreamHack web-dreamshop 풀이

프론트엔드 번들에 jsdom을 끼워 DOMPurify로 sanitize하는 순간, "검사한 DOM"과 "렌더하는 DOM"이 달라져 mutation XSS가 열린다. vue-router의 %2F 디코드와 axios protocol-relative 처리로 admin 봇의 요청 호스트를 탈취하고, 그 위에 mXSS를 얹어 admin 권한으로 FLAG를 "구매"하는 DreamHack 다이아4 web 문제 풀이.
#dreamhack#ctf#web+7
 
BLOG2026-04-01
[⭐⭐⭐] TAB 하나로 필터 열 개를 뚫다 — DreamHack XSS Filtering Bypass Advanced 풀이
blog

[⭐⭐⭐] TAB 하나로 필터 열 개를 뚫다 — DreamHack XSS Filtering Bypass Advanced 풀이

script, javascript, document, location, (, )까지 10개 이상의 키워드를 차단하는 XSS 필터. 그런데 javas\tcript처럼 TAB 문자(\t)를 키워드 중간에 끼우면 필터는 통과하고 브라우저는 그대로 실행한다. WHATWG URL 스펙이 정의한 정규화 동작과 Python 문자열 필터 사이의 갭을 파고들어 쿠키를 탈취하고 FLAG를 획득하는 과정을 단계별로 정리한다.
#dreamhack#ctf#web+4