TeamH4C

[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 3 - XSS

이유갬 2022. 10. 14. 11:34

ClientSide : XSS(Cross Site Scripting)

ClientSide 취약점은 웹 페이지 이용자를 대상으로 공격할 수 있는 취약점이다.

해당 종류의 취약점을 통해 이용자 식별을 위한 쿠키 및 세션 정보를 탈취해 해당 계정으로 임의의 기능을 수행할 수 있다.

 

Cross Site Scripting 의 약어가 XSS 인 이유는?
CSS 로 해도 되는데 스타일시트를 정의하는 언어인 CSS 와 중복되므로 XSS 로 명명되었다.

 

XSS(Cross Site Scripting) 은 어떤 것일까?

 

공격자가 웹 리소스에 악성 스크립트를 삽입하여 이용자의 웹 브라우저에서 해당 스크립트를 실행하면서 발생한다.

공격자를 이를 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행한다.

해당 취약점은 SOP 보안 정책이 등장하면서 힘들어졌지만 우회하는 다양한 기술이 소개되면서 지속되는 공격이다.

 

XSS 의 발생 예시와 종류

 

XSS 공격은 이용자가 삽입한 내용을 출력하는 기능에서 발생한다.

이러한 기능의 예로는 로그인 했을 때 출력되는 "안녕하세요, OO님" 과 같은 문구 또는 게시물과 댓글이 있다.

클라이언트는 HTTP 형식으로 웹 서버에 리소스를 요청하고 서버로부터 받은 응답을 시각화하여 이용자에게 보여준다.

이때, HTML, CSS, JS 와 같은 코드가 포함된 게시글을 조회할 경우 이용자는 변조된 페이지를 보거나 스크립트가 실행될 수 있다.

XSS 는 발생 형태에 따라서 다양한 종류로 구분된다.

 

XSS의 종류

 

1. Stored XSS : XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 것

2. Reflected XSS : XSS에 사용되는 악성 스크립트가 URL 에 삽입되고 서버의 응답에 담겨오는 것

3. DOM-based XSS : XSS에 사용되는 악성 스크립트가 URL Fragment 에 삽입되는 것

4. Universal XSS : 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 것

 

XSS 스크립트의 예시

 

자바스크립트는 웹 문서의 동작을 정의한다.

이는 이용자가 버튼 클릭 시 어떤 이벤트를 발생 시킬지, 데이터 입력 시 해당 데이터를 전송하는 이벤트 등 구현이 가능하다.

이러한 기능 외에도 상호 작용 없이 이용자 권한으로 정보를 조회하거나 변경하는 등 행위가 가능하다.

-> 이러한 행위가 가능한 이유는 쿠키 및 세션이 웹 브라우저에 저장되어 있으므로!

따라서, 공격자는 자바스크립트를 통해 이용자에게 보여지는 웹 페이지 조작, 웹 브라우저의 위치를 임의의 주소로 변경 가능하다.

 

1. Stored XSS

 

:서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생한다.

대표적으로 게시글과 댓글에 악성 스크립트를 포함해 업로드하는 방식이 있다.

게시글은 불특정 다수에게 보여지므로 해당 기능에 XSS 취약점이 존재할 경우 높은 파급력을 가진다.

 

(실습)

 

게시글 본문에 악성 스크립트를 작성하고 게시글을 등록한다면 이는 데이터 베이스에 저장될 것이고 불특정 다수에게 노출 될 것이다.

이것이 바로 Stored XSS 이다.

 

2. Reflected XSS

 

서버가 악성 스크립트가 담긴 요청을 출력할 때 발생한다.

대표적으로 게시판 서비스에서 작성된 게시글을 조회하기 위한 검색창에서 스크립트를 포함하여 검색하는 방식이다.

이용자가 게시글을 검색하면 서버에서 검색 결과를 반환한다.

일부 서비스에서는 검색 결과를 응답에 포함 ( ex. title 에서 test 검색 결과는 아래와 같습니다. )

하는데, 검색 문자열에 악성 스크립트가 포함되어 있다면 발생한다.

이 취약점은 Stored XSS 와 다르게 URL 과 같은 이용자의 요청에 의해 발생한다.

따라서, 공격을 위해서는 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야 한다.

이용자에게 링크를 직접 전달하는 방법은

이용자가 눈치챌 수 있으므로 Click Jacking 또는 Open Redirect 등 다른 취약점과 연계하여 사용한다.

 

(Exercise : XSS)

- vuln(xss) page 는 이용자의 파라미터 입력값을 그대로 받고 출력한다. 이는 취약점이 발생할 수 있는 포인트다.

- memo 페이지는 파라미터에 입력값을 넣으면 출력하는데 스크립트 코드를 삽입해보니 그냥 텍스트로 출력한다. 취약점이 발생하는 포인트는 안 보인다.

- flag 페이지는 URL 이 나오는데 파라미터에 어떤 입력값을 넣고 제출하는 곳이다. 이는 이용자가 있다는 가정하에 해당 링크를 누르게 하는 것이다.

 

해당 문제의 공격에 사용할 수 있는 속성
1. location.href : 전체 URL 을 반환하거나 URL 을 업데이트 할 수 있다.
2. document.cookie : 해당 페이지에서 사용하는 쿠키를 읽고 쓴다.

 

 

결론 :

XSS 공격은 주로 이용자의 입력값이 출력되는 페이지에서 발생하며, 해당 공격을 통해서 타 이용자의 브라우저에 저장된 쿠키 및 세션 정보를 탈취 할 수 있다.

 

해결 방법 :

악성 태그를 필터링하는 HTML Sanitization 을 사용하거나 엔티티 코드로 치환하는 방법을 통해 해결 가능하다.