본문 바로가기

CS/보안

XSS (Cross-Site-Scripting)

반응형

이번 글은 오늘 제가 현 프로젝트를 진행하면서 제 사수 분께서 열심히 설명해 주셨던 XSS에 관한 내용을 정리해 보려고 합니다. 

 

  • XSS (Cross-Site-Scipting) 이란?

XSS는 "크로스 사이트 스크립팅"이라고 불리며 웹사이트에 악성 스크립트를 주입하는 행위 입니다.  여기서 말하는 악성 스크립트란 말 그대로 사용자의 로그인 정보를 빼낸다거나, 사용자가 접속하려는 사이트가 아닌 다른 사이트로 접속하게 하는 등 사용자와 사용자가 접속하려는 서버 사이에서 악의적인 의도를 갖는 스크립트(Script)를 웹 사이트 내에 주입하는 행위를 의미합니다.

 

그럼 어떻게 악성 스크립트를 웹 사이트에 주입할 수 있는 걸까요??

 

간단한 예시를 들어 보겠습니다.

 

사용자가 다음과 같은 페이지에서 특정 글을 확인하기 위해 그 글을 클릭하는 단순한 상황을 생각해 보려고 합니다. 

이때 "상세 페이지", 그러니까 첫번째 글에 해당하는 페이지로 이동한다고 했을 때 보통 DB에는 그 글에 관한 Sequence 값을 가지고 호출할 것입니다. 이때 만약 "/detail.jsp? seq=10"과 같이 GET 방식으로 데이터 조회를 요청할 때 해당 시퀀스 값이 html에 삽입되어 있다면 문제가 발생하게 됩니다. 

 

<div ng-init="getDetailInfo(${seq})">상세페이지 조회</div>

 

위의 예시는 AngularJS에 문법이니 코드를 이해하려고 하기보다는 HTML 내에 GET 방식으로 요청할 때 넣었던 seq값 이 삽입되었다는 사실에 주목하면 될 것 같습니다.

 

만약 이런 경우에 악의적인 목적을 가진 사람이 다음과 같이 URL을 변경한다면 어떻게 될까요?

 

/detail.jsp? seq="><script> 쿠키(또는 세션) 정보를 가져올 수 있는 스크립트 내용 </script>

 

이런 경우라면 HTML내에 seq값이 삽입되어 있기 때문에 위의 스크립트 가 실행되고 이때 사용자는 사용자 정보, 즉 쿠키나 세션 정보를 빼내 악의적인 목적에 사용할 수 있게 됩니다. 

 

그럼 이런 무서운 XSS 공격을 방지하기 위해서는 어떤 해결 방법이 있을 까요??

 

Spring에서는 XSS 공격에 대응하기 위해  Naver에서 개발한'lucy-xss-servlet-filter'라는 서블릿 필터 기반의 라이브러리를 제공하고 있습니다. 

 

개발자가 직접 경우의 수를 고려해 들어오는 데이터를 인코딩 되도록 코드를 만들 수 있지만 html 태그는 무수하게 많으므로 놓치는 부분이 존재할 수 있기 때문에 라이브러리 사용을 권장하고 있습니다.

 

 

 

 

lucy filter의 XSS 공격 방지 방법은 간단하게 정리하자면 ' < ', ' "" ' 과 같은 문자들이 전부 필터를 거치게 되어 악성 스크립트가 실행되거나 DB에 저장되더라고 스크립트 형태로 저장되지 못하도록 방지하는 것입니다. 

 

XSS에 관한 내용과 해결 방법에 대한 더 자세한 설명은 아래의 링크를 참고해 보면 좋을 것 같습니다. :)

 

 

Lucy XSS Filter

XSS 공격이 가능한 HTML 요소를 신뢰할 수 있는 코드로 변환하거나 삭제하는 기능을 제공한다. 공격이 가능하지 않은 HTML 요소는 허용을 한다. 4.1. 설정 파일 Lucy-XSS Filter의 필터링 규칙은 화이트리

naver.github.io

 

반응형

'CS > 보안' 카테고리의 다른 글

공개키와 비공개키  (0) 2022.02.24
HTTPS와 HTTP의 차이와 SSL 디지털 인증서  (0) 2022.02.22