IT 성장기 (교육이수)/모의해킹 스터디 (2024.04-09)

[정보보안] XSS 취약점의 정의와 종류

eezy 2024. 7. 3. 14:55

웹 취약점인 Cross Site Scripting (크사) 에 대해 알아 보자. 

 

XSS의 정의와 종류

목차

 

1. XSS 정의

2. Stored XSS

3. Reflected XSS

4. DOM based XSS

5. XSS 취약점 방지

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

XSS 의 정의

XSS란?

XSS : Cross Site Scripting 의 약자로 X는 Cross의 영어 심볼을 따와 XSS로 불리게 되었다. 

 

이는 웹 사이트에서 공격자가 입력한 악성 스크립트가 사용자 측에서 실행되는 취약점으로, 사용자 입력값에 대한 검증이 미흡하거나 출력 시 필터링 되지 않을 경우 발생한다. 

 

공격자가 삽입한 스크립트가 사용자 측에서 어떻게 동작하는지에 따라, 아래와 같이 3가지 분류로 나눌 수 있다. 

 

XSS 의 정의

 

Stored XSS

Stored 방식은 공격자의 악성 스크립트가 서버에 저장된 후, 저장된 값을 출력하는 페이지에서 발생하는 취약점이다. 흔히 게시판과 같이, 글을 작성하여 서버에 저장 후, 글 열람을 통해 서버에서 데이터를 불러오는 과정에서 발생한다. 프로세스는 아래 다이어그램과 같다. 

 

 

Stored XSS의 동작 과정을 예시와 함께 알아 보자. 아래는 게시판에서 글을 작성하는 페이지이다. Test를 위해, 다음과 같은 글을 작성해보았다. 이 과정은, 웹에서 어떠한 특수 문자를 허용하고 있는지 확인하는 과정이다. 

게시판에 작성한 글 게시판 글을 열람 시, 웹의 응답 값
게시판의 취약점 확인

 

웹의 응답 값에서 게시판의 Contents 항목에는, <'"> 특수 문자가 모두 html entity로 치환되는 것을 확인할 수 있다. 특수문자가 html entity로 치환되는 경우, 평문으로 스크립트를 삽입하여 실행하는 것을 어렵게 한다. 데이터베이스에서 정보를 불러오는 과정을 다음과 같이 유추해 볼 수 있다. 

  1. 데이터베이스에서 데이터를 조회 : 
    • 클라이언트 요청 (작성된 글 클릭) 에 따라 데이터베이스에서 데이터를 조회한다. 
    • 조회된 데이터를 서버에서 불러온다.
  2. 서버에서 HTML로 인코딩 : 
    • 서버는 데이터베이스에서 가져온 데이터를 HTML로 렌더링하기 전에 인코딩한다.
    • 인코딩 중 html 에서 특별한 의미를 가지는 특수문자를 html entity로 변환하여, 실행되지 않도록 한다. 

다만, 제목에는 입력한 <'"> 값이 그대로 노출되는 것을 확인할 수 있다. 그렇다면 제목에 다음과 같은 스크립트를 삽입하여 작동시킬 수 있다.

제목에 원하는 스크립트 삽입 후 저장 글을 조회 시, 스크립트 실행

 

Reflected XSS

사용자가 요청한 악성스크립트가 사용자 측에서 반사(Reflected)되어 동작하는 취약점으로, 공격자의 악성스크립트가 별도로 저장되지 않고 사용자의 화면에 즉시 출력 된다. 

Stored 방식과의 차이점을 아래와 같이 정리해 볼 수 있다. Stored는 게시글이 저장된 곳을 사용하는 모든 사용자에게 영향을 줄 수 있지만, Reflected는 스크립트가 저장되지 않기 때문에 해당 스크립트가 반영된 요청을 하는 유저에게만 영향을 준다. 

 

구분 Stored Reflected
서버에 데이터 저장 O X
데이터 출력 위치 저장되는 곳과 동일 입력 위치와 출력 위치가 다름
공격 예시 댓글, 리뷰, 게시판 폼 데이터, 악성 링크, 검색어

 

Reflected XSS

 

 

Reflected XSS의 동작 과정을 예시와 함께 알아 보자. 아래는 게시판에서 글을 작성하는 페이지이다. Test를 위해, 다음과 같은 글을 작성해보았다. 이 과정은, 웹에서 <> 를 html entity로 치환하여, 꺾쇠를 사용하지 않고 스크립트를 실행하는 방법으로 실행해보았다. 

 

아래 응답값에서 볼 수 있듯이 검색 키워드가 <script>alert('검색어');</script> 로 실행되는 것을 볼 수 있다. 글에 위 스크립트를 완성하는 방식으로 삽입하여, 원하는 스크립트가 실행되도록 할 수 있다. 

게시글 작성 및 검색어 완성 두 번째 게시글의 스크립트가 실행되는 응답 값

 

DOM Based XSS

 

DOM : Document Object Model

 

DOM은 HTML, XML 문서의 프로그래밍 인터페이스이다. 이는 문서의 구조화된 표현(structured representation)을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 그들이 문서 구조, 스타일, 내용 등을 변경할 수 있게 한다. 

 

일반적인 DOM-based XSS 발생 조건

  1. 클라이언트 측 자바스크립트: 페이지가 로드된 후 자바스크립트가 URL 파라미터 값을 읽어 DOM에 동적으로 삽입하는 경우
  2. 안전하지 않은 DOM 조작: 자바스크립트가 사용자 입력을 검증하거나 인코딩하지 않고 DOM에 직접 삽입하는 경우

Stored XSS과 Reflected XSS는 서버에서 악성스크립트가 실행되고 공격이 이뤄지는 반면에 DOM Based XSS는 서버와 상호작용 없이 브라우저에서 악성스크립트가 실행되고 공격이 이뤄지는 점이 가장 큰 차이점이다.

 

아래 사이트를 예시로 보자. 해당 사이트는 DOM Based XSS가 작동한다 볼 수 없다. URL을 아래와 같이 변조하여, id 입력 란에, 내가 원하는 스크립트를 넣어 해당 값이 내 화면에 출력되게 할 수 있다. 하지만, 실제로 스크립트가 작동하지 않는 것으로 보아, 페이지의 Javascript가 user 파라미터를 읽고 DOM에 삽입한다고 볼 수 없다. 

 

URL : http://attacker.com/mypage.php?user=<script>alert(1);<script>

 

실제 작동하는 DOM Based XSS 와의 차이점을 아래 예시로 알아 보았다. 동일하게 구현된 페이지에서, 아래와 같이 스크립트를 삽입하였다. 

<img src="x" onerror="
    var placeholderValue = document.getElementsByName('info')[0].placeholder;
    alert(placeholderValue);
">

GET /scriptBasic/mypage.php?user=yjj"><img+src="x"+onerror="var+placeholderValue=document.getElementsByName('info')[0].placeholder;alert(placeholderValue);"><" HTTP/1.1

 

WEB 에서 Flag Here... 가 위치한 곳의 데이터를 찾아, 해당 내용을 Alert로 화면에 출력하도록 하였다. Javascript가 URL 파라미터를 읽고 DOM의 값을 읽고 동적으로 조작하는 것을 볼 수 있다. 

Response 값 WEB의 작동

 

XSS 취약점 방지

 

XSS 취약점이 발생하지 않도록 방지하는 방법은 아래와 같다. 

 

  1. 특수문자를 HTML Entity로 모두 치환하고, 화이트리스트를 기반으로 허용할 TAG를 평문으로 변환한다.
  2. 살려둔 TAG 내에 악의적인 event handler 있는지 블랙 리스트 기반으로 필터링 한다.

 

<참조 링크>

https://www.fis.kr/ko/major_biz/cyber_safety_oper/attack_info/security_news?articleSeq=3408

 

한국재정정보원

재정활동 디지털 플랫폼‘디브레인(dBrain)’운영 공공기관

www.fis.kr

 

https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model/Introduction

 

DOM 소개 - Web API | MDN

이 문서는 DOM에 대한 개념을 간략하게 소개하는 문서이다: DOM 이 무엇이며, 그것이 어떻게 HTML, XML 문서들을 위한 구조를 제공하는지, 어떻게 DOM 에 접근하는지, API 가 어떻게 사용되는지에 대한

developer.mozilla.org