flawopen.com/XSS/XSS 유형
반사형·저장형·DOM 기반 XSS는 어떻게 다른가요?
반사형, 저장형, DOM 기반 XSS는 신뢰할 수 없는 데이터가 브라우저의 안전하지 않은 컨텍스트에 도달하는 서로 다른 경로입니다. 서로 겹칠 수도 있습니다. 값의 출처, 저장 여부, 렌더링 코드, 영향을 받는 사용자를 확인하세요.
세 가지 유형
요청 값이 컨텍스트에 맞게 인코딩되지 않은 채 응답에 들어가 브라우저에서 마크업이나 스크립트로 해석됩니다. 공격자가 조작된 링크를 보낼 수 있지만 근본 결함은 요청 데이터의 안전하지 않은 렌더링입니다. 렌더링 지점의 출력을 수정하세요.
신뢰할 수 없는 콘텐츠가 저장된 뒤 댓글이나 프로필 필드에서 다른 사용자에게 안전하지 않게 렌더링됩니다. 저장 값이나 렌더링 경로를 수정할 때까지 해당 콘텐츠를 보는 방문자가 같은 안전하지 않은 컨텍스트에 노출될 수 있습니다.
클라이언트 JavaScript가 location.hash, 쿼리 매개변수 또는 서버 응답 같은 신뢰할 수 없는 source를 읽어 innerHTML 같은 안전하지 않은 DOM sink에 씁니다. 값이 서버에 도달하지 않을 수도 있지만 필수는 아닙니다. DOM 기반 XSS는 클라이언트 source-to-sink 경로를 뜻하며 반사형·저장형 전달과 겹칠 수 있습니다. 클라이언트 데이터 흐름을 고치세요.
수정에서 구분이 중요한 이유
XSS는 렌더링 sink에서 컨텍스트에 맞는 출력 인코딩이나 안전한 DOM API를 사용해 수정하세요. 반사형·저장형은 서버 렌더링이 흔하지만 클라이언트 렌더링도 안전하지 않은 sink를 만들 수 있습니다. DOM 기반 XSS는 텍스트에 innerHTML 대신 textContent를 사용하고, rich HTML이 필요하면 명시적 정책을 가진 유지 관리되는 sanitizer를 사용하세요. 서버 인코딩은 클라이언트 source-to-sink 흐름 검토를 대신하지 않습니다.
이 분류는 서로 겹칠 수 있습니다
반사형과 저장형은 입력이 페이지에 전달되는 방식과 지속 저장 여부를 설명합니다. DOM 기반은 클라이언트 측 source-to-sink 경로를 설명합니다. 서로 배타적인 분류가 아닙니다. 저장된 프로필 텍스트를 클라이언트 코드가 innerHTML에 삽입하면 저장형이면서 DOM 기반 XSS일 수 있습니다.
DOM 기반 XSS: 위험한 sink와 텍스트 전용 렌더링
const value = new URLSearchParams(location.search).get("q") ?? "";
target.innerHTML = value;
const value = new URLSearchParams(location.search).get("q") ?? "";
target.textContent = value;