웹개발

XSS(Cross Site Scripting)란?

티베트 모래여우 2020. 10. 9. 12:23
반응형

XSS(Cross Site Scripting)란?

XSS는 크로스 사이트 스크립팅, 즉 사이트 간 스트립팅이라는 이름의 웹 취약점입니다.

웹 사이트의 어드민(관리자)이 아닌 악의적인 목적을 가진 제 3자가 악성 스크립트를 삽입하여 의도하지 않은 명령을 실행시키거나 세션 등을 탈취할 수 있는 취약점입니다.

이름처럼 대부분 자바스크립트를 이용한 공격이 이루어지며 SQL Injection과 함께 웹 취약점 중 가장 기초적인 취약점으로 알려져 있습니다만 워낙 공격패턴이 다양하고 변화가 많이 이루어지기 때문에 사실상 완벽한 방어가 힘들고 지금까지도 굉장히 위험한 취약점 중 하나입니다. 비유하자면 인류의 영원한 적이라고 평가받는 감기 바이러스와 비슷하겠네요.

기초적인 취약점이라고 해서 만만히 봐선 안됩니다.


위험성

XSS로 발생할 수 있는 피해는 다음과 같습니다.

1. 쿠키 및 세션정보 탈취

- XSS에 취약한 웹 게시판 등에 쿠키나 세션 정보를 탈취하는 스크립트를 삽입하여 해당 게시글을 열람하는 유저들의 쿠키 및 세션 정보를 탈취할 수 있으며 이는 공격자가 탈취한 정보를 바탕으로 인증을 회피하거나 특정 정보를 열람할 수 있는 권한을 가지게 해 줍니다.

2. 악성 프로그램 다운 유도

- XSS 자체는 악성 프로그램을 다운로드 시킬 수 없지만 스크립트를 통해 악성 프로그램을 다운받는 사이트로 리다이렉트 시켜서 악성 프로그램을 다운받도록 유도할 수 있습니다.

3. 의도하지 않은 페이지 노출

- XSS를 이용해 <img>태그 등을 삽입하여 원본 페이지와는 전혀 관련 없는 페이지를 노출시키거나 페이지 자체에 수정을 가해 노출된 정보를 악의적으로 편집할 수 있습니다.


공격 종류

Reflected XSS

- 공격자가 악성 스크립트를 클라이언트에게 직접 전달하여 공격하는 방식입니다.

특히 URL에 스크립트를 포함시켜 공격하는 경우가 대표적이며 URL이 길면 클라이언트가 의구심을 가질 수 있기 때문에 Shorten URL(URL 단축)을 이용해 짧은 URL로 만들어 공격하기도 합니다.

서버에 스크립트를 저장하지 않기 때문에 서버에서 이루어지는 필터링을 피할 수 있는 공격 방식입니다.

Stored XSS

- 공격자가 악성 스크립트를 서버에 저장시킨 다음 클라이언트의 요청/응답 과정을 통해 공격하는 방식입니다.

여기서 스크립트를 서버에 저장하는 행위는 게시글 쓰기 등의 행동을 지칭합니다.

보통 서버에서 필터링을 하기 때문에 공격을 우회하기 어렵지만 한 번 성공하면 관리자 입장에서는 눈치채기 힘들고 광범위한 피해를 줄 수 있다는 것이 특징입니다.

● DOM Based XSS

- 피해자의 브라우저가 html 페이지를 분석하여 DOM을 생성할 때 악성 스크립트가 DOM의 일부로 구성되어 생성되는 공격입니다. 서버의 응답 내에는 악성 스크립트가 포함되지 않지만 브라우저의 응답 페이지에 정상적인 스크립트가 실행되면서 악성 스크립트가 추가되서 실행되는 특징이 있습니다.


공격 구문 예시

공격시에는 아래와 같은 구문들을 공격 목적에 맞게 작성하여 게시판, 쪽지, 메일 등의 기능을 통해 업로드합니다.

아래 예시들에서는 alert문으로 공격 코드를 대체하였습니다.

<script>alert("hi")</script>

가장 기본적인 구문으로 대놓고 script 태그를 넣어 alert를 실행시키는 구문입니다.

이 구문이 실행된다면 해당 사이트는 XSS에 대한 대책이 전혀 없는 것이라 봐도 무방합니다.

<scr<script>ipt>alert("hi");</scr</script>ipt>

<script> 태그를 일차적으로 필터링하는 것을 우회하기 위한 구문입니다.

중첩된 script 태그가 필터링되면 갈라져있던 script 태그가 결합되면서 구문이 실행됩니다.

<a onmouseover="alert('hi')">

a 태그를 이용한 공격입니다. onmouseover 이벤트를 통해 공격을 실행합니다.

<img src=# onerror="alert('hi')">

img 태그를 이용한 공격입니다.

고의적으로 없는 src주소를 지정하고 onerror 이벤트를 통해 공격을 실행합니다.

<ruby onmouseover="alert('hi')"></ruby>

잘 사용되지 않는 태그를 이용한 공격입니다. 해당 태그가 필터에서 누락된 경우 공격을 실행할 수 있습니다.

※ 위의 구문들은 맛보기 수준의 예시입니다.

이 외에도 XSS 공격 방법, 우회 방법은 정말 많으니 한번 구글링을 통해 찾아보시기를 권합니다.


대응 방법

기본적인 대응 방법은 아래와 같습니다.

· 입력 값의 길이 제한(이메일, 아이디, 패스워드 등 목적에 맞게)

· replace 등의 함수를 이용한 치환

· '<', '>' 와 같이 태그에 사용되는 기호를 엔티티코드로 변환

· 입력 값에 대한 꼼꼼한 유효성 검사(반드시 서버에서 수행)

· 불가피하게 HTML 태그 사용을 허용해야 할 경우 화이트리스트를 만들어 특정 태그 입력만 허용

XSS에 대응하는 방법은 이 외에도 여러가지가 있으나 맨 위에서 말씀드렸듯 XSS는 공격패턴이 다향하고 변화무쌍하기 때문에 완벽하게 방어하기는 힘듭니다. 꾸준한 감시와 관리가 받쳐주지 않는다면 누구도 XSS에서 안전할 수 없다..라고 생각할 수 있겠네요.

귀찮다고 보안에 신경을 안쓰면 안됩니다.

반응형