템플릿 이스케이프 우회로 인한 XSS

템플릿 XSS 보호 우회

설명

HTML 템플릿에서 사용자 입력을 안전하게 이스케이프하지 않거나, 이스케이프된 값을 다시 HTML로 해석하는 방식으로 출력하면 크로스 사이트 스크립팅(XSS)이 발생할 수 있습니다.

잠재적 영향

  • 공격자가 브라우저에서 임의의 JavaScript를 실행할 수 있습니다.
  • 세션 탈취, 피싱, 사용자 동작 위조, 민감 정보 노출로 이어질 수 있습니다.

해결 방법

  • 템플릿 엔진의 기본 자동 이스케이프 기능을 유지하세요.
  • 사용자 입력을 innerHTML이나 unsafe/raw 출력 블록에 직접 넣지 마세요.
  • HTML이 꼭 필요하면 신뢰할 수 있는 sanitizer를 통과한 제한된 마크업만 허용하세요.

예시

다음은 Handlebars에서 일반 문자열을 출력하는 예시입니다. 다른 템플릿 엔진은 해당 엔진의 이스케이프 규칙을 확인하세요.

변경 전

html
<div>{{{ userContent }}}</div>

변경 후

html
<div>{{ userContent }}</div>

설명:

  • 변경 전: 템플릿에서 자동 이스케이프를 비활성화하거나 safe 필터로 값을 직접 출력하면 사용자 제어 HTML 또는 스크립트가 브라우저에서 실행될 수 있습니다.
  • 변경 후: 일반 문자열을 {{ userContent }}로 출력해 HTML 텍스트로 이스케이프합니다. 이 방식이 JavaScript나 URL 등 모든 출력 맥락에 그대로 적합한 것은 아닙니다.

참조