본문 바로가기

Security/Web

XSS (Cross-site Scripting) 란?

XSS 공격이란?

공격자가 웹 서버에 구현된 웹 애플리케이션의 XSS 취약점을 이용하여 서버 측 또는 URL에 미리 삽입을 해 놓은 악성 스크립트가 애플리케이션에서 브라우저로 전달되는 데이터에 포함되어 개인의 브라우저에서 실행되면서 해킹을 하는 것을 의미한다.

 

XSS 공격 종류

① 저장 XSS 공격

 

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

 

 

② 반사 XSS 공격

 

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

 

예를 들어, 일반적으로 서버에 검색 내용을 입력하면, 검색 결과가 있는 경우에는 결과 값을 사용자에게 전달하지만,

 

 

[그림 6]과 같이 서버에서 정확한 결과가 없는 경우 서버는 브라우저에 입력한 값을

 

 

[그림 7]과 같이 그대로 HTML 문서에 포함하여 응답한다. 이 경우 HTML 페이지에 포함된 악성 스크립트가 브라우저에서 실행이 된다.

 

즉 사용자가 서버로 입력한 값을, 서버는 요청한 사용자의 브라우저로 악성스크립트를 반사시킨다.

 

이 공격은 주로 사용자에게 악성 URL을 배포하여 사용자가 클릭하도록 유도하여 클릭한 사용자를 바로 공격한다. 즉 사용자는 악성 스크립트가 포함된 링크를 클릭한 순간 바로 악성 스크립트가 사용자의 브라우저에서 실행되며 이 공격은 이메일 메시지 또는 다른 웹 사이트와 같이 다양한 경로로 피해자 시스템에게 전달된다.

 

일반적인 반사 XSS 공격 단계는 다음과 같다.

1) 공격자는 먼저 A사이트에 XSS 취약점이 있는 것을 발견한다.

2) 민감한 정보를 획득할 수 있는 공격용 악성 URL을 생성한다.

3) 공격자는 이 URL을 이메일 메시지에 포함하여 배포한다.

4) 피해자가 URL을 클릭하면, 바로 공격 스크립트가 피해자로 반사되어 A 사이트에 관련된 민감한 정보(ID/패스워드, 세션 정보)를 공격자에게 전송한다.

 

 

③ DOM 기반 XSS 공격

 

 

XSS 공격의 피해

1) 쿠키 정보/세션 ID 획득

쿠키란?

웹 서버가 HTTP 헤더 중 Set-Cooie 필드로 브라우저에게 보내는 4KB 이하의 작은 텍스트 파일이며, 로그인, 버튼 클릭 등에 대한 정보를 저장한다. 그리고 브라우저는 이 저장한 정보를 바탕으로 웹 사이트의 페이지를 클릭할 때마다 웹 서버에게 사용자의 상태를 알려주게 된다.

 

세션 쿠키란?

사용자가 웹사이트를 읽거나 방문하는 동안에만 임시로 메모리에 존재하는 쿠키로, 쿠키 생성 시 쿠키 만료시기 또는 유효성 기간이 설정되어 있지 않은 경우에 이 세션 쿠키가 만들어지고, 사용자가 브라우저를 종료하면 세션 쿠키를 삭제한다.

 

웹 애플리케이션이 세션 ID를 쿠키에 포함하는 경우 XSS 공격을 통해, 클라이언트의 합법적인 세션 ID를 획득하여 불법적으로 정상 사용자로 가장할 수 있다.

 

2) 시스템 관리자 권한 획득

공격자는 XSS 취약점이 있는 웹 서버에 다양한 악성 데이터를 포함시켜 놓은 후, 사용자의 브라우저가 악성 데이터를 실행하는 경우 자신의 브라우저에 있는 제로데이 취약점 또는 패치되지 않은 취약점을 공격하는 공격 코드가 실행되면서 사용자 시스템을 완전히 통제할 수 있다.

 

3) 악성코드 다운로드

XSS 공격은 악성 스크립트 자체로만은 악성 프로그램을 다운로드 할 수 없지만, 사용자가 악성 스크립트가 있는 URL을 클릭하도록 유도하여 악성 프로그램을 다운로드 받는 사이트로 리다이렉트하거나, 트로이목마 프로그램을 다운로드하여 설치할 수 있다.

 

XSS 예방 기술

1. 입출력값 검증 및 무효화

XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화 시켜야 한다.

 

입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.

 

출력 값을 무효화하기 위해서는 XSS 공격은 기본적으로 <script> 태그를 사용하기 때문에 XSS 공격을 차단하기 위해 태그 문자(<. >) 등 위험한 문자 입력시 문자 참조(HTML entity)로 필터링하고, 서버에서 브라우저로 전송 시 문자를 인코딩한다.

 

/*

HTML 문자 참조 : ASCII 문자를 동일한 의미의 HTML 문자로 변경하는 과정으로, 예를 들어, 문자 "<"는 동일한 의미의 HTML, "&lt"로 변경한다.

*/

 

그러므로 HTML 문서에는 &lt;script&gt;로 나타나지만 브라우저로 전송시 인코딩 되어 사용자는 <script>로 보이게 된다. 이 HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한 의미를 가지지 않으며, 단순한 문자로 처리되어 일반 문자로 인식하고 스크립트로 해석되어 실행되지는 않는다.

 

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

 

 

[그림 14]는 악성 스크립트 등 악성 데이터를 포함되어 브라우저를 공격할 수 있는 다양한 방법의 HTML 태그를 정리해 놓은 것이다. 즉 웹 애플리케이션 개발자들은 웹 문서를 코딩 시 [그림 14]에 있는 태그에 포함될 악성 데이터에 대해서 반드시 입출력 값을 검증해야 한다.

 

하지만 개발자가 많은 태그의 입력 문자를 검증하기 위해 코딩 시 일일이 작업하는 것은 많은 노력과 자원이 소모되며 인코딩 방식을 통해 방어기술을 무력화할 수 있으므로 개발자가 직접 모두 처리하는 것은 근본적으로 불가능하다. 그래서 입출력 값을 자동적으로 검증해주는 라이브러리를 사용하면 좀 더 효과적으로 대응할 수 있다.

 

2. 보안 라이브러리

1) AntiXSS

2) OWASP ESAPI 라이브러리

 

3. 브라우저 확장 프로그램

 

 

[출처] : https://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf

[Reflected XSS] : https://j-a-l.tistory.com/76

'Security > Web' 카테고리의 다른 글

File Upload 취약점 ( + root me )  (0) 2020.01.25
Directory Indexing 이란? ( + root me )  (0) 2020.01.24
Command Injection 이란? ( + root me )  (0) 2020.01.24
Open Redirect 란? ( + root me )  (0) 2020.01.24