iframe XSS Playground
DOMPurify sanitize 정책이 iframe 을 어디까지 허용하는지 검증하기 위한 PoC 모음. 모든 페이지는 부모 사이트에서 <iframe src=...> 로 임베드된 상황을 가정합니다.
시작하기
- 좌측에서 검증할 공격 시나리오 페이지를 선택합니다.
- 페이지 상단에 나오는
<iframe src="https://..."></iframe>스니펫을 복사합니다. - 타깃 서비스(알렌 마이노트 에디터 등)에 그 스니펫을 붙여 넣고 저장, 렌더링된 페이지에서 실제 동작을 확인합니다.
- 부모 페이지 임베드 헬퍼 에서 sandbox 정책을 바꿔가며 같은 시나리오의 차이를 비교할 수 있습니다.
시나리오 목록
Navigation
iframe 안에서 부모 창 전체를 다른 URL로 보내버린다. sandbox allow-top-navigation 유무로 차이를 확인할 수 있는 대표 시나리오.
Communication
parent.postMessage 로 부모 페이지에 메시지를 보낸다. 부모가 event.origin 검증을 안 하면 위조된 메시지를 신뢰할 수 있다.
사용자 모르게 외부 도메인으로 form 을 submit 한다. cookie 가 자동 첨부되는 사이트라면 CSRF 가 된다. sandbox 의 allow-forms 로 제어 가능.
iframe 자기 origin 안에서 수집한 정보(클릭 좌표, 키 입력, document.referrer 등)를 attacker 서버로 보낸다.
img.src 에 외부 도메인의 상태변경 GET 엔드포인트를 넣어 쿠키와 함께 요청을 보낸다. 가장 오래된 CSRF 패턴.
Phishing
iframe 안에 부모 사이트와 똑같이 생긴 로그인 폼을 보여주고 입력값을 외부로 빼낸다. 입력값은 자기 origin 으로 가니까 SOP 와 무관하게 동작한다.
iframe 을 CSS 로 화면 전체를 덮게 만든 다음 부모 사이트와 똑같은 UI를 띄워 사용자를 속인다. iframe 자체는 자기 origin 에서 자유롭게 그릴 수 있다.
Annoyance
사용자 클릭 없이 파일 다운로드를 강제로 시작한다. download 속성 + 가짜 클릭, 또는 Blob URL 이용.
window.open 으로 새 창을 띄운다. 자기 origin 으로 띄우면 다양한 피싱 UI 를 보일 수 있고, 부모와는 opener 관계로 연결된다.
소리 있는 비디오를 자동재생하거나, requestFullscreen 으로 풀스크린을 점유한다. 풀스크린은 사용자 제스처가 필요하지만 일부 우회 패턴이 알려져 있다.
Notification.requestPermission 으로 권한 프롬프트를 띄운다. 사용자가 허용하면 attacker.com 도메인에서 푸시를 보낼 수 있게 된다.
사용자가 iframe 영역에서 무언가를 복사할 때 clipboard 이벤트를 가로채 다른 내용을 덮어쓴다.
history.pushState / replaceState 로 자기 origin URL 을 마구 쌓아 부모의 뒤로가기 동작을 망가뜨린다. 자기 origin 안에서만 동작.
Probe
parent.document, parent.localStorage, 부모 쿠키 등을 시도해서 어떻게 차단되는지 보여준다. '안 되는 것' 을 직접 확인하는 페이지.
다양한 형태의 postMessage 페이로드를 부모에게 던지고, 부모에서 어떤 응답이 돌아오는지(또는 사이드 이펙트가 있는지) 관찰한다. 알렌 리스너 구조 탐색용.