FlawOpen

flawopen.com/XSS/Content-type sniffing

MIME sniffing XSS: MIME 혼동이 브라우저에 도달하는 방식

참고 페이지
핵심 답변

브라우저는 응답의 Content-Type을 사용해 바이트를 처리하는 방법을 결정합니다. 앱이 사용자가 제어하는 파일을 누락되거나 잘못된 유형으로 제공하면 MIME sniffing이 일부 응답의 동작을 바꿀 수 있습니다. 올바른 유형과 X-Content-Type-Options: nosniff를 보내고 업로드 파일을 앱 origin과 분리하세요. 이 헤더는 브라우저 해석 위험을 줄이지만 파일을 정제하거나 업로드 검증을 대체하지는 않습니다.

업로드가 문서 경계를 넘는 방식

앱이 사용자 파일을 받아 인증된 자체 origin에서 Content-Type이 없거나 잘못된 상태로 다시 제공한다고 가정해 보세요. 브라우저가 응답을 HTML 문서로 해석하면 파일의 마크업이 사이트 origin에서 활성화될 수 있습니다. 사용자가 파일을 열 때 저장형 XSS 또는 콘텐츠 혼동 위험이 발생합니다. 확장자와 업로드 요청에 표시된 유형은 실제 바이트 형식을 증명하지 않습니다.

유형을 명시하고 다운로드를 격리하세요

위험 — 모호한 헤더로 사용자 파일을 인라인 제공
HTTP/1.1 200 OK
Content-Type: application/octet-stream
// X-Content-Type-Options 없음
// 인증 앱과 동일한 origin
더 안전 — 올바른 유형, nosniff, 격리된 다운로드
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Content-Disposition: attachment; filename="download.txt"

바이트와 일치하는 서버 선택 Content-Type을 사용하고 업로더가 주장한 유형을 그대로 쓰지 마세요. X-Content-Type-Options: nosniff는 문서 응답의 MIME sniffing을 끄고 MIME 유형이 잘못된 script 또는 stylesheet 요청을 차단합니다. 이것만으로 XSS가 모두 해결되지는 않습니다. 업로드는 별도 origin에서 제공하고 다운로드에는 Content-Disposition: attachment를 우선 사용하며 크기, 권한, 파일 검증을 적용하세요. 이미지 등 인라인 미디어는 검증된 유형으로 반환하고 실제 브라우저 응답을 테스트하세요.

자주 묻는 질문

nosniff가 모든 업로드 파일을 안전하게 제공하게 해 주나요?

아니요. 브라우저의 MIME 해석과 script/style 요청 검사를 제어하지만 파일을 검증하거나 정제하지 않고, 잘못된 Content-Type도 수정하지 않으며 같은 origin의 업로드를 격리하지도 않습니다. 신뢰할 수 없는 파일에는 별도 origin과 attachment 다운로드를 사용하세요.

참고 자료

함께 보기 크로스 사이트 스크립팅(XSS, CWE-79): 동작 원리와 언어별 방어 방법 — flawopen.com CSP와 출력 이스케이프: 둘 다 필요할까요? React의 dangerouslySetInnerHTML은 안전할까? DOMPurify면 innerHTML을 안전하게 만들 수 있나요? Markdown 렌더링은 XSS로부터 안전한가요? Svelte는 기본적으로 XSS를 막을까? SVG 업로드는 XSS 위험이 있나요?