XSS(교차 사이트 스크립팅, Cross-Site Scripting)는 웹 애플리케이션의 보안 취약점 중 하나로, 공격자가 악의적인 스크립트를 다른 사용자의 브라우저에서 실행할 수 있도록 하는 공격 기법이다.
XSS는 주로 웹 애플리케이션이 사용자 입력을 적절히 검증하지 않고 그대로 출력할 때 발생한다.
Case 1. Reqeust Parameter에 있는 Script 내용이 에러 페이지에서 실행됨
문제
아래와 같이 파라미터에 <script>alert(location.host)</script>를 넣으면, 에러 페이지에서 script가 실행되었다.
스크립트를 실행시킴으로써 서버나 유저 정보를 탈취할 수 있기 때문에 스크립트가 실행되지 않도록 수정해야했다.
Front에서 요청을 보낼 때 인코딩 처리가 되어 있었다. 즉 "<"가 아닌 인코딩된 값으로 서버에 보내진다.
하지만 공격자가 직접 주소창에 <script>를 써서 요청을 보낼 수 있고, 이 경우 인코딩되지 않은 상태로 서버에 보내진다.
원인
에러가 나면 에러 페이지에 요청 보냈던 URL이 출력되는데, Escape 처리가 되어있지 않아 Script가 실행되었다.
해결
Exception 페이지에서 StringEscapeUtils.escapeHtml을 이용해 Escape 처리를 했다.
화면에서 Script가 실행되지 않는 것을 알 수 있다.
Case 2. Request Parameter에 스크립트 내용을 (")로 감싸서 보내 실행됨
문제
위 case와 다르게, 이번 URL은 <, > 가 없고 " 가 인코딩된 형태인 %22로 존재한다.
아래와 같이 Script가 실행되어, 유저의 정보를 탈취할 수 있다.
원인
서버에 파라미터에 대한 validation이 존재하지 않아서, 파라미터로 온 "-alert(location.host)-"가 그대로 JSP의 javascript 단으로 전달되어 실행되었다.
해결
파라미터 validation을 걸어 유효하지 않은 값의 경우 400 Bad Reqeust를 보냄으로써, 잘못된 파라미터가 JSP 화면단까지 가지 않도록 수정하였다.