개요

XSS 공격은 웹 응용프로그램에 존재하는 취약점을 기반으로 웹 서버와 클라이언트 간 통신 방식인 HTTP 프로토콜 동작과정 중에 발생합니다. XSS 공격은 웹사이트 관리자가 아닌 이가 웹페이지에 악성 스크립트를 삽입할 수 있는 취약점입니다. 주로 여러 사용자가 보는 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어집니다.

이 취약점은 웹 응용프로그램이 사용자로부터 입력받은 값을 제대로 검사하지 않고 사용할 경우 나타나며, 사용자의 정보인 ‘쿠키’, ‘세션’ 등을 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있습니다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고도 합니다.

 

공격

◆ 저장 XSS 공격
저장 XSS 공격은 웹 애플리케이션 취약점이 있는 웹 서버에 악성 스크립트를 영구적으로 저장해 놓는 방법이다. 이때 웹 사이트의 게시판, 사용자 프로필 및 코멘트 필드 등에 악성 스크립트를 삽입해 놓으면, 사용자가 사이트를 방문하여 저장되어 있는 페이지에 정보를 요청할 때, 서버는 악성 스크립트를 사용자에게 전달하여 사용자 브라우저에서 스크립트가 실행되면서 공격한다.

◆ 반사 XSS 공격
반사식 XSS 공격은 웹 애플리케이션의 지정된 변수를 이용할 때 발생하는 취약점을 이용하는 것으로, 검색 결과, 에러 메시지 등 서버가 외부에서 입력받은 값을 받아 브라우저에게 응답할 때 전송하는 과정에서 입력되는 변수의 위험한 문자를 사용자에게 그대로 돌려주면서 발생한다.

◆ DOM 기반 XSS 공격
DOM 기반 XSS 공격은 피해자의 브라우저가 HTML 페이지를 구문 분석할 때마다 공격 스크립트가 DOM 생성의 일부로 실행되면서 공격한다. 페이지 자체는 변하지 않으나, 페이지에 포함되어 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행된다.

 

피해

◆ 쿠키 / 세션 ID 정보 탈취
쿠키란 웹 서버가 HTTP 헤더 중 Set-Cookie 필드로 브라우저에게 보내는 4KB 이하의 작은 텍스트 파일이며, 사용자가 웹사이트를 이용하는 동안 사용자 브라우저에 저장된다. 사용자가 웹사이트의 페이지를 클릭할 때마다 브라우저는 웹서버에게 사용자의 상태를 다시 알려준다. 사용자 상태를 기록하기 위해 쿠키 값에 로그인, 버튼 클릭 등에 대한 정보를 저장한다. 세션 쿠키는 사용자가 웹사이트를 읽거나 방문하는 동안에만 임시로 메모리에 존재하는 쿠키이다. 쿠키 생성 시 쿠키 만료시기 또는 유효성 기간이 설정되어있지 않은 경우에 세션 쿠키가 만들어 진다. 브라우저에서는 사용자가 브라우저를 종료하면 세션 쿠키를 삭제한다. 웹 애플리케이션이 세션 ID 를 쿠키에 포함하는 경우 XSS 공격을 통해, 클라이언트의 합법적인 세션 ID 를 획득하여 불법적으로 정상 사용자처럼 가장할 수 있다.

 

◆ 시스템 관리자 권한 탈취
XSS 취약점을 이용하여 사용자 브라우저 취약점을 공격하여 PC 를 완전히 통제할 수도 있다. 공격자는 XSS 취약점이 있는 웹서버에 다양한 악성 데이터를 포함시켜 놓은 후, 사용자의 브라우저가 악성 데이터를 실행하는 경우 자신의 브라우저가 있는 제로데이 취약점 또는 패치되지 않은 취약점을 공격하는 공격 코드가 실행되면서 사용자 시스템을 완전히 통제할 수 있다. 회사 등 조직의 개인의 PC 가 해킹되는 경우, 조직의 내부 시스템으로 이동하여 내부의 중요 정보를 탈취하는 공격으로 이어질 수 있다.

 

◆ 악성 코드 다운로드
XSS 취약점을 이용하여 사용자 브라우저 취약점을 공격하여 PC 를 완전히 통제할 수도 있다. 공격자는 XSS 취약점이 있는 웹서버에 다양한 악성 데이터를 포함시켜 놓은 후, 사용자의 브라우저가 악성 데이터를 실행하는 경우 자신의 브라우저가 있는 제로데이 취약점 또는 패치되지 않은 취약점을 공격하는 공격 코드가 실행되면서 사용자 시스템을 완전히 통제할 수 있다. 회사 등 조직의 개인의 PC가 해킹되는 경우, 조직의 내부 시스템으로 이동하여 내부의 중요 정보를 탈취하는 공격으로 이어질 수 있다.

 

대응방안

XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.

XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.

입력 값 제한
먼저 사용자의 입력값을 제한하여 스크립트틀 삽입하지 못하도록 해야 한다. http://www.qubitsec.io?page=1 위와 같은 URL 에서 사용자의 입력값인 page 가 화면에 바로 뿌려지는데 이때 page 의 값을 숫자만으로 허용한다면 그 외의 입력값에는 출력되지 않기 때문에 대응이 가능해진다.

◆ 입력 값 치환
XSS 공격은 기본적으로 <script> 태그를 사용하기 때문에 XSS 공격을 차단하기 위해 태그 문자(<, >) 등 위험한 문자 입력 시 문자 참조(HTML entity)로 필터링하고, 서버에서 브라우저로 전송 시 문자를 인코딩하는 것이다. HTML 문자 참조란 ASCII 문자를 동일한 의미의 HTML 문자로 변경하는 과정이다. 예를 들어, 문자 “<”는 동일한 의미의 HTML “&lt;” 로 변경한다. HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한 의미를 가지지 않으며, 단순한 문자로 처리된다. 이렇게 인코딩하면 사용자는 <script>가 <script>로 보이지만 HTML 문서에서는 &lt;script&gt; 로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로 해석되어 실행되지는 않는다.

아래의 표는 HTML 문서에서 악성 스크립트에 포함되어 브라우저에서 실행될 수 있는 문자와 대체 문자를 정리한 것이다. 악성 스크립트는 많은 HTML 태그 안에 포함을 할 수 있으므로 반드시 아래 표에 있는 위험문자의 경우 출력값을 이스케이핑해야 한다.



(이미지 출처: 구글 이미지)

스크립트 영역에 출력 자제
이벤트 핸들러 영역에 스크립트가 삽입되는 경우 보호기법들을 우회할 수 있기 때문에 사용자의 입력을 출력하는 것을 최대한 자제해야 하며 필요한 경우 대응 방안과 함께 사용해야 한다.

PLURA V5 XSS 필터 사용
PLURA V5 XSS 필터를 사용 등록하시면 XSS 공격이 발생할 때 해당 공격자의 IP를 신속히 차단하게 됩니다. 필터 등록은 아래의 순서대로 진행하시면 됩니다. www.plura.io > login > 실시간방어 > 방어관리 > 방어등록 > 웹로그방어 > 방어상태 > ON > 등록

PLURA V5 XSS 해킹 탐지 시연 영상