크로스 사이트 스크립팅 (XSS)

Cross-Site Scripting (XSS)

설명

XSS는 신뢰되지 않은 입력값이 HTML 응답에 컨텍스트별 인코딩/이스케이프 없이 포함될 때 발생합니다. 브라우저는 주입된 스크립트를 정상 코드처럼 실행하므로, 공격자는 <script>, 이벤트 핸들러(onerror 등), 속성/URL/JS 컨텍스트를 악용해 임의의 JavaScript를 실행시킬 수 있습니다. 주로 검색 결과, 오류 메시지, 프로필 소개 등 사용자 입력을 그대로 출력하는 곳에서 악용됩니다.

잠재적 영향

  • 세션 탈취(Session Hijacking): 악성 스크립트로 쿠키(특히 HttpOnly 미적용 시)나 토큰을 탈취하여 계정을 가로챌 수 있음.

  • 사용자인증 우회(Account Takeover): 세션/토큰 탈취 후 계정 장악 및 권한 남용 가능.

  • 데이터 유출(Data Exfiltration): 페이지의 민감 정보(개인정보, CSRF 토큰 등)를 수집해 외부로 전송.

  • 피싱/가짜 UI(Phishing/Defacement): 화면 변조로 사용자 오인을 유도하거나 거짓 입력창 표시.

  • 추가 공격 발판(Malware/CSRF): 브라우저 내에서 추가 악성 스크립트 로드, CSRF 트리거 등 연쇄 공격 유발.

해결 방법

  • 컨텍스트별 출력 인코딩 적용: HTML 본문은 OWASP Java Encoder의 Encode.forHtml, HTML 속성은 Encode.forHtmlAttribute, URL은 Encode.forUriComponent 등을 사용. Spring HtmlUtils.htmlEscape, Apache Commons Text StringEscapeUtils.escapeHtml4도 활용 가능.

  • 템플릿 엔진의 자동 이스케이프 사용: JSP/JSTL, Thymeleaf 등에서 기본 이스케이프를 활성화하고 PrintWriter/JspWriter로 직접 결합 출력 피하기.

  • 입력 검증 및 정규화: 허용 리스트 기반으로 예상 형식(길이, 문자셋, 정규식)을 제한. 스크립트 관련 문자를 최소화.

  • 응답 헤더 강화: 적절한 Content-Type과 charset 설정, 가능한 경우 text/plain 사용. CSP(Content-Security-Policy), X-Content-Type-Options, X-Frame-Options 등 보안 헤더 적용.

  • 쿠키 보호: 세션 쿠키에 HttpOnly, Secure, SameSite 속성 설정.

  • 재사용 규칙: 콘텍스트가 바뀌면 인코딩 함수도 바꿔 적용(HTML vs Attribute vs JS vs URL).

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 요청 파라미터(bio, info)를 HTML 본문과 속성에 그대로 출력합니다. 공격자는 <script> 또는 onerror 같은 이벤트 핸들러, 속성 탈출 등을 이용해 임의의 JavaScript를 실행시킬 수 있습니다.

  • 안전한 코드: 출력 위치에 맞는 인코딩을 적용했습니다. HTML 본문에는 Encode.forHtml, 속성에는 Encode.forHtmlAttribute를 사용해 위험 문자를 안전한 엔티티로 변환하여 스크립트 실행을 차단합니다. 또한 Content-Type/charset을 명확히 설정해 브라우저 해석 혼선을 줄입니다.

참조

Last updated