Intigriti 챌린지 0526 풀이

발행: (2026년 5월 23일 PM 09:37 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

음, 전형적인 XSS 챌린지네요. 삽입 지점을 찾아서 alert을 띄우면 됩니다. 꽤 직관적이고, 삽입 지점을 찾기만 하면 됩니다.

이번 달 챌린지는 회원가입, 로그인 페이지, 글을 올릴 수 있는 Testimonials 페이지, 그리고 프로필을 편집할 수 있는 프로필 페이지가 있는 커뮤니티 피드 웹사이트입니다. 테스트해볼 수 있는 잠재적인 삽입 지점이 많이 있겠죠, 분명 그 중 하나일 겁니다. 그리고 푸터에는 SCA Shield v1.0이라는 것이 언급되어 있는데, 사이드 채널 공격인가요?

소스를 살펴보니 모든 페이지 내용이 단일 app.js 스크립트로 동적으로 생성됩니다. 스크립트 전반에 걸쳐 innerHTML을 사용해 콘텐츠를 삽입하고 있는데, 놀랍게도 DOMPurify는 사용자 댓글만 정화하고 이름은 정화하지 않는 것 같습니다.
nameDiv.innerHTML = t.user_name;

우리는 삽입 지점을 찾았다고 생각하고 이름을 전형적인 XSS 스크립트로 바꿔봤지만… 작동하지 않았습니다. 푸터에 언급된 바로 그 SCA Shield가 서버 측 검증으로 우리를 차단하고 있었습니다.

다음과 같은 메시지를 받았습니다.
SCA Shield: 악성 문자 감지! 따옴표, 괄호, 점, 쉼표, 세미콜론은 엄격히 금지됩니다.

스크립트 태그를 사용할 경우에는 이렇게 나옵니다.
SCA Shield: 악성 페이로드 서명 감지!

음, 최소한 페이로드에서 제거해야 할 항목 목록을 알게 되었으니 이제 작동해야 합니다. 보이는 바에 따르면 script 같은 몇몇 태그와 관련 단어만 감지하고, style, svg 같은 태그는 그대로 사용할 수 있었습니다.

CSS keyframes를 이용한 XSS 페이로드에 대해 읽어본 적이 있어서 시도해봤고, 성공했습니다.

몇 차례 시도와 수정 끝에 다음을 발견했습니다.
@keyframes x{}

window 객체가 차단되므로 최상위 프레임을 가리키는 top을 사용합니다. 일반 페이지에서는 이것이 바로 페이지 자체가 됩니다. alert도 차단되므로 base64로 인코딩하고(atob은 차단되지 않음) 실행합니다. 이렇게 하면 동작합니다! 🎉

이제 도메인 확인을 위한 오리진 버전을 만들기 위해 몇 가지 수정을 해야 합니다. a\x61 로, (\x28 로, )\x29 로 바꾸면 다음과 같이 됩니다:
@keyframes x{}
이렇게 하면 완료됩니다!

Intigriti에 제출했더니 의도하지 않은 해결책이라고 답변을 받았습니다. 아직 의도된 해결책을 찾지는 못했지만, app.js에 존재하는 PixelAnalyticsConfig와 연관이 있을 것 같으며 첫 힌트를 보니 가능성이 높아 보이지만 아직 탐색해보지는 않았습니다.

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.