Tag Archive

#ssrf

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

16
posts
BLOG2026-08-15
[🥈 Silver 3] 탭 한 글자로 지워진 admin 을 되살린다 — DreamHack My Best Friend 풀이
blog

[🥈 Silver 3] 탭 한 글자로 지워진 admin 을 되살린다 — DreamHack My Best Friend 풀이

인사만 돌려주는 express 서비스가 내부 Private API 를 SSRF 로 호출한다. admin 이라는 문자열과 퍼센트·물음표·샵을 전부 막아 놨지만, 단어 한가운데에 탭 문자를 끼우면 필터는 다른 단어로 보고 통과시키고 axios 가 URL 을 파싱하는 순간 그 탭이 사라지면서 admin 이 되살아난다. express 기본 쿼리 파서가 중복 키를 배열로 묶어 주는 성질까지 얹으면 플래그가 떨어진다.
#dreamhack#ctf#web+6
 
BLOG2026-08-07
[🥉 Bronze 1] IPv6 로 들어가서 IPv4 로 도착하기 — DreamHack Where-is-localhost 풀이
blog

[🥉 Bronze 1] IPv6 로 들어가서 IPv4 로 도착하기 — DreamHack Where-is-localhost 풀이

입력은 반드시 IPv6 여야 하고, 도착한 요청의 출발지는 반드시 IPv4 루프백이어야 한다. 서로 배타적으로 보이는 두 조건을 `::ffff:127.0.0.1` 하나가 동시에 만족시킨다. 파이썬 ipaddress 에게는 version 6 이고 리눅스 커널에게는 127.0.0.1 이기 때문이다. tcpdump 로 루프백에 흐르는 패킷이 실제로 IPv4 라는 것까지 확인했다.
#dreamhack#ctf#web+6
 
BLOG2026-07-30
[🥈 Silver 1] 필터가 보는 문자열과 파일시스템이 받는 문자열은 다르다 — DreamHack Dream Gallery 풀이
blog

[🥈 Silver 1] 필터가 보는 문자열과 파일시스템이 받는 문자열은 다르다 — DreamHack Dream Gallery 풀이

URL을 받아 이미지를 가져와 주는 갤러리. urlopen 앞에 필터가 세 겹 있는데, file:// 접두어 검사는 슬래시를 하나 줄이면 빗나가고 flag 문자열 검사는 퍼센트인코딩으로 빗나간다. Flask가 쿼리스트링을 한 번 풀고 url2pathname이 또 한 번 풀기 때문에, 필터가 검사하는 문자열과 open에 도달하는 경로가 애초에 같지 않다.
#dreamhack#ctf#web+6
 
BLOG2026-07-29
[🥈 Silver 2] 콜론 하나로 빈 호스트를 만들어 file:// 을 통과시킨다 — DreamHack web-HTTP-CLI 풀이
blog

[🥈 Silver 2] 콜론 하나로 빈 호스트를 만들어 file:// 을 통과시킨다 — DreamHack web-HTTP-CLI 풀이

URL 을 받아 대신 긁어다 주는 43줄짜리 TCP 서비스. 호스트 화이트리스트는 눈에 잘 띄는데, 정작 대부분의 시도를 죽이는 건 그 위에 있는 튜플 언패킹이다. netloc 을 콜론으로 쪼갠 결과가 원소 2개가 아니면 검사에 닿기도 전에 ValueError 로 날아간다. netloc 을 콜론 하나로만 채우면 호스트가 빈 문자열이 되고, urllib 은 빈 호스트를 로컬로 보고 파일을 열어 준다.
#dreamhack#ctf#web+6
 
BLOG2026-07-29
[🥈 Silver 2] 검사기는 문자열을 보고 curl 은 URL 을 파싱한다 — DreamHack curling 풀이
blog

[🥈 Silver 2] 검사기는 문자열을 보고 curl 은 URL 을 파싱한다 — DreamHack curling 풀이

"simple api server" 라는 한 줄 설명이 전부인 문제. 46줄짜리 Flask 앱이 url 파라미터를 받아 curl 로 대신 요청해 주는데, 호스트 화이트리스트가 접두사 비교라서 URL 의 userinfo 를 끼워 넣으면 통과하고, 엔드포인트 차단은 문자열 끝만 봐서 물음표 하나에 무너진다. 두 구멍을 한 줄에 겹쳐 놓으면 서버가 자기 자신에게 요청을 보내고 플래그를 뱉는다.
#dreamhack#ctf#web+6
 
BLOG2026-07-20
[🥈 Silver 2] 검사한 곳과 실제로 간 곳이 다를 수 있다 — DreamHack crawling 풀이
blog

[🥈 Silver 2] 검사한 곳과 실제로 간 곳이 다를 수 있다 — DreamHack crawling 풀이

URL을 넣으면 그 페이지를 대신 가져와 보여주는 미니 크롤러다. 127.0.0.1 같은 내부 주소를 직접 넣으면 "전역 IP인지" 검사하는 필터가 바로 막는다. 그런데 이 필터는 딱 하나만 확인한다 — 우리가 처음 준 URL의 호스트가 가리키는 IP. requests 라이브러리는 기본적으로 HTTP 리다이렉트를 자동으로 따라간다는 사실은 전혀 고려되지 않았다. 공인 IP를 가진 내 서버가 302로 127.0.0.1의 관리자 페이지를 가리키게만 하면, 검사는 내 공인 서버를 보고 통과시키고 실제 응답은 내부 페이지에서 그대로 새어나온다.
#dreamhack#ctf#web+4
 
BLOG2026-06-30
[🥉 Bronze 3] raw socket 으로 만든 SSRF — localhost 전용 /admin 우회 — DreamHack proxy-1 풀이
blog

[🥉 Bronze 3] raw socket 으로 만든 SSRF — localhost 전용 /admin 우회 — DreamHack proxy-1 풀이

임의 host:port 로 raw 바이트를 보내고 응답을 돌려주는 /socket 이 그대로 SSRF 발판이 된다. flag 를 주는 /admin 은 remote_addr 가 127.0.0.1 일 때만 동작하는데, /socket 으로 서버 자신의 8000 포트에 생 HTTP 요청을 흘려보내면 이 검사를 통과한다. 요청에 필요한 헤더·쿠키·폼까지 직접 적어 보내 flag 를 회수했다.
#dreamhack#ctf#web+5
 
BLOG2026-06-24
[🥈 Silver 2] SSRF로 내부 포트 스캔 — netloc 문자열 필터를 0.0.0.0으로 우회 — DreamHack web-ssrf 풀이
blog

[🥈 Silver 2] SSRF로 내부 포트 스캔 — netloc 문자열 필터를 0.0.0.0으로 우회 — DreamHack web-ssrf 풀이

이미지 뷰어가 입력한 URL을 서버가 대신 가져와 보여준다. 같은 프로세스 안에 flag.txt를 서빙하는 내부 SimpleHTTPRequestHandler가 1500~1800 중 한 포트에 떠 있다. 필터는 netloc에 `127.0.0.1`/`localhost` 문자열이 있는지만 보므로, 같은 loopback을 가리키는 `0.0.0.0`으로 우회하고 포트를 전수 스캔해 flag.txt를 읽었다.
#dreamhack#ctf#web+5
 
RESEARCH2026-06-01
검증한 host ≠ 연결한 host (CVE-2026-45400): Open WebUI SSRF 파서 불일치 실험 분석
blog

검증한 host ≠ 연결한 host (CVE-2026-45400): Open WebUI SSRF 파서 불일치 실험 분석

자기호스팅 AI 플랫폼 Open WebUI의 SSRF 우회(CVE-2026-45400, CVSS 8.5)를 방어자 시점으로 추적한다. urlparse가 검증한 host와 requests/aiohttp가 실제 연결한 host가 어긋나는 파서 불일치를 로컬에서 재현하고, 정상 흐름과의 비교·페이로드 필드 해부·0.9.5 패치 분석·취약점 클래스 일반화·탐지 차단 룰까지 실험 기반으로 정리한다.
#security#ssrf#cve+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