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
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를 우선 사용하며 크기, 권한, 파일 검증을 적용하세요. 이미지 등 인라인 미디어는 검증된 유형으로 반환하고 실제 브라우저 응답을 테스트하세요.
자주 묻는 질문
아니요. 브라우저의 MIME 해석과 script/style 요청 검사를 제어하지만 파일을 검증하거나 정제하지 않고, 잘못된 Content-Type도 수정하지 않으며 같은 origin의 업로드를 격리하지도 않습니다. 신뢰할 수 없는 파일에는 별도 origin과 attachment 다운로드를 사용하세요.