XSS(Cross Site Scripting) 공격이란
사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.
XSS 공격
저장형 XSS 공격은 보안이 취약한 서버에 악의적인 사용자가 악성 스크립트를 저장함으로써 발생합니다. 비정상적인 방법이 아니라 서버에서 제공하는 게시판, 사용자 프로필에 악의적으로 동작하는 스크립트가 그대로 저장된 후 클라이언트의 브라우저로 전달되어 문제가 발생합니다.
간단한 예제 코드를 보겠습니다.
XSS 공격 시나리오
1. 게시판에 사용자 정보를 빼돌릴 수 있는 스크립트를 작성하여 올립니다.
2. 일반 사용자는 작성한 게시글을 읽으면, 서버로부터 악성 스크립트가 담긴 게시글 응답을 전달받습니다.
3. 일반 사용자의 브라우저에서 응답 메세지를 실행하면서 악성 스크립트가 실행됩니다.
4. 악성 스크립트를 통해 사용자 정보가 악의적인 사용자에게 전달됩니다.
XSS 공격 결과
1. 스크립트가 담긴 게시글을 작성합니다.
2. 일반 사용자는 게시글을 보기 위해 클릭합니다.
3. 게시글 조회 시 작성된 스크립트가 실행됩니다.
이렇게 script가 작성된 것을 확인할 수 있습니다.
XSS 방어
XSS 공격을 방버하는 방법을 알아보겠습니다.
사용자 입력 검증 및 변경
1. 사용자가 입력한 값을 그대로 저장하지 않습니다.
2. 태그를 만들 때 사용하는 <. >을 HTML에서 사용하는 특수 문자로 변경합니다.
CreateDto
preventXxs 메서드를 사용해 특수 문자로 변경합니다.
public void preventXss() {
this.title = this.title.replaceAll("<", "<");
this.title = this.title.replaceAll(">", ">");
this.description = this.description.replaceAll("<", "<");
this.description = this.description.replaceAll(">", ">");
}
public Item toEntity(User user) {
preventXss();
return Item.builder()
.title(title)
.description(description)
.minPriceWanted(minPriceWanted)
.user(user)
.build();
}
XSS 방어 결과
script가 작동하지 않음을 확인할 수 있습니다.
Thymeleaf에서의 XSS 방어 테스트
Thymeleaf의 th:text에서 기본으로 제공하는 escaping 기능을 이용합니다.
<section class="mb-5">
<p class="fs-5 mb-4" th:text="${item.description}"></p>
</section>
타임리프의 th:text를 사용하여 방어 테스트를 진행했습니다.
마치며
사용자의 입력을 검증하지 않고 그대로 사용하거나 escaping 기능이 없다면 XSS 공격에 취약한 모습을 보입니다.
JWT토큰을 LocalStorage에서 관리하면 왜 위험한지 다음 게시글에서 다루겠습니다.
'Spring' 카테고리의 다른 글
CSRF(Cross-Site Request Forgery)란? (1) | 2023.10.19 |
---|---|
LocalStorage, Cookie JWT토큰은 어디에 보관할까? (0) | 2023.10.17 |
Redis) 싱글벙글 Refresh Token을 Redis에 저장하고 사용해보자 (0) | 2023.08.04 |
Lombok - 활성화 시키는 방법 (0) | 2023.01.06 |
뷰 리졸버 - /WEB-INF/views/ + .jsp 자동 설정 (0) | 2022.12.30 |