전자금융기반시설 보안 취약점 평가기준 - WEB-SER-041

크로스사이트 스크립팅 (XSS) | 위험도: 4 (높음) | 통제구분: 5.8.4 서비스 보호

OO은행

인터넷뱅킹 게시판 시스템

취약점: 입력값 필터링 미흡

고객센터 문의 게시판

XSS 공격 시나리오

취약한 JSP 코드

위험
// ❌ 취약한 코드
<%
  String name = request.getParameter("name");
  String content = request.getParameter("content");
%>

// 입력값을 그대로 출력 (XSS 취약!)
<div>
  <h3><%= name %></h3>
  <p><%= content %></p>
</div>

브라우저 실행 결과

대기중

게시글이 표시됩니다

안전한 JSP 코드

권장
// ✅ 안전한 코드 (JSTL 사용)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" 
           prefix="c" %>

// 1. JSTL <c:out> 자동 이스케이프
<div>
  <h3><c:out value="${name}" /></h3>
  <p><c:out value="${content}" /></p>
</div>

// 또는 OWASP Encoder 사용
<%@ page import="org.owasp.encoder.Encode" %>
<%
  String safeName = Encode.forHtml(name);
  String safeContent = Encode.forHtml(content);
%>

<div>
  <h3><%= safeName %></h3>
  <p><%= safeContent %></p>
</div>

XSS 방어 체크리스트

HTML Escaping: < > " ' & 문자 변환
입력값 검증: 화이트리스트 방식
CSP 적용: script-src 'self'
HttpOnly Cookie: JS 접근 차단