XSS (Cross-Site Scripting) 취약점

by Toff

   개요
이번 포스팅에서는 XSS(Cross-Site Scripting) 취약점에 대해서 알아보자. XSS 취약점은 웹 애플리케이션에 악의적인 스크립트를 실행시키는 것을 말하며 세션 탈취(권한 획득), 악의적인 페이지로 리다이렉팅, CSRF 공격 등으로 악용할 수 있다. 악의적으로 동작할 수 있는 스크립트 구문을 필터링하지 않아 취약점이 발생한다. XSS는 크게 Reflected(비지속형) XSS와 Persistent(지속형) XSS로 나뉜다.

Reflected(비지속형) XSS
Reflected XSS 는 말 그대로 비지속형(=일시적인) 취약점이다. 주로 공격자가 악의적으로 동작할 수 있는 스크립트 문을 URL에 포함하여 전달하는 방식이다. Get Method를 통해 전송되기 때문에 일시적인 반응만 일어난다. 즉 URL로 전달한 파라미터 값의 결과가 브라우저로 결과가 출력될 때 발생하는 취약점이다. 

그림 1-1 과 같이 search 를 검색했을 때 URL을 통해 값이 전달되며 결과 값이 브라우저로 출력된다.
그림 1-1 Reflected XSS

그림 1-2 은 위와 같은 환경이며 악의적으로 동작할 수 있는 스크립트 문을 필터링 하지 않아 Reflected XSS 취약점이 발생하였다.

그림 1-2 Reflected XSS 취약점 발생

Persistent(지속형) XSS
Persistent XSS는 데이터베이스에 악의적인 스크립트 값을 저장시켜 데이터베이스에서 해당 값을 불러올때마다 발생하기에 지속형 취약점이라 부른다. 주로 게시글, 회원 가입 등과 같이 데이터베이스에 직접적으로 값을 저장하는 부분에 악의적인 스크립트 값을 저장시킨다. Reflected XSS와는 다르게 해당 취약점은 한번 값을 저장하면 지속적으로 발생하기에 더욱 피해가 크다. 또한 Reflected XSS는 URL 을 통해 Get Method로 값이 삽입되는 반면 Persistent XSS는 POST Method로 값이 전달하기에 더욱 다양한 파라미터 값을 이용해 공격할 수 있다.

그림 1-3 과 같이 게시판 제목 값에 스크립트 문을 삽입하면 그림 1-4 와 같이 데이터베이스에 해당 값이 저장된다. 결론적으로 해당 게시글이 있는 게시판을 실행할때마다 그림 1-5 와 같이 스크립트 문이 계속 실행된다.
그림 1-3 게시판에 Script 문 삽입

그림 1-4 데이터베이스에 Script 문 저장


그림 1-5 Persistent XSS 취약점 발생