1. XSS란?
Cross Site Scripting은 약자로 CSS로 볼 수 있지만 CSS가 이미 Cascading Style Sheets의 약자로 사용하고 있기 때문에 XSS라고 부른다.
XSS는 게시판이나 웹 메일 등에 자바 스크립트와 같은 스크립트 코드를 삽입하여 해커가 의도한 기능을 수행하게할 수 있다. 대부분의 웹 해킹 공격 기법과는 다르게 사용자를 대상으로 한 공격이다.
XSS 공격은 다음 세가지로 분류할 수 있다.
- Reflected XSS
- Stored XSS
- DOM Based XSS
Reflected XSS, Stored XSS 에 대해서 살펴 보겠다.
2. Reflected XSS
- 웹 어플리케이션의 지정된 파라미터를 사용할 때 발생하는 취약점을 이용한 공격 방법이다.
- 검색어 같은 쿼리 스트링을 URL에 담아 전송했을 때 서버가 필터링을 거치지 않고 쿼리에 포함된 스크립트를 응답 페이지에 담아 전송함으로써 발생한다.
- 공격용 스크립트가 대상 웹사이트에 있지 않고 다른 매체 (사이트, 이메일)에 포함될 수 있다.
- 데이터베이스에 스크립트가 저장되지 않고 응답 페이지로 바로 클라이언트에 전달된다는 차이점이 있다.
3. Stored XSS
- 해커가 작성한 스크립트가 서버에 저장되고 , 해당 페이지를 접근하면 다른 사용자가 그 스크립트를 호출하게하는 방법이다.
- 예를 들면 악의적인 스크립트를 작성하여 게시물로 등록하고, 다른 사용자가 해당 게시물로 들어왔을 때 해당 스크립트가 실행되게할 수 있다.
이미지 태그에 onerror라는 속성에 악성 스크립트를 심어두면 이미지가 없을 경우 해당 스크립트가 실행되게할 수 있다.
<img onerror="alert(document.cookie"> 세션 정보를 훔쳐가거나 할 수 있음.
4. XSS 공격 방지
4.1 XSS 취약점이 있는 innerHTML 사용을 자제한다.
- HTML5에서 innerHtml을 통해 주입한 스크립트는 실행되지 않는다.
- textContent, innerText를 사용해서 사용자 데이터를 출력하면 스크립트가 실행되지 않는다.
4.2 html입력이 가능한 경우 서버단에서 치환 처리
4.3 vue.js에서 v-html 같은 경우는 보안 취약점이 발생할 수 있다. 신뢰할 수 있는 컨텐츠에서만 HTML 사용
4.4 쿠키에 HttpOnly 옵션 활성화
- 스크립트를 통해서 쿠키 접근 불가
- 악의적인 클라이언트가 쿠키에 저장된 정보(세션 ID, 토큰)에 접근하는 것을 차단한다.
- LocalStorage에 세션ID와 같은 민감한 정보를 저장하지 않는다.
4.5 XSS 특수 문자를 치환한다.
from | & | < | > | " | ' | / |
to | & | < | > | " | ' | / |
- Spring에서는 오픈소스인 Lucy XSS Servlet Filter 사용
- @RequestBody에 전달되는 JSON 요청에 대해서는 처리해주지 않음.