230123 항해99 78일차 XSS

요니링 컴터 공부즁·2023년 2월 13일
0
  • XSSCross Site Scripting, 즉 사이트 간 스트립팅이라는 이름의 웹 취약점이다.
  • 웹 사이트의 어드민(관리자)이 아닌 악의적인 목적을 가진 제3자가 악성 스크립트를 삽입하여 의도하지 않은 명령을 실행시키거나 세션 등을 탈취할 수 있는 취약점이다.
  • 대부분 자바스크립트를 이용한 공격이 이루어지며 SQL Injection과 함께 웹 취약점 중 가장 기초적인 취약점으로 알려져 있지만 워낙 공격패턴이 다양하고 변화가 많이 이루어지기 때문에 사실상 완벽한 방어가 힘들고 지금까지도 굉장히 위험한 취약점 중 하나이다.

위험성

XSS로 발생할 수 있는 피해는 다음과 같다.

  1. 쿠키 및 세션정보 탈취
  • XSS에 취약한 웹 게시판 등에 쿠키나 세션 정보를 탈취하는 스크립트를 삽입하여 해당 게시글을 열람하는 유저들의 쿠키 및 세션 정보를 탈취할 수 있으며 이는 공격자가 탈취한 정보를 바탕으로 인증을 회피하거나 특정 정보를 열람할 수 있는 권한을 가지게 해준다.
  1. 악성 프로그램 다운 유도
  • XSS 자체는 악성 프로그램을 다운로드 시킬 수 없지만 스크립트를 통해 악성 프로그램을 다운받는 사이트로 리다이렉트 시켜서 악성 프로그램을 다운받도록 유도할 수 있다.
  1. 의도하지 않은 페이지 노출
  • XSS를 이용해 <img>태그 등을 삽입하여 원본 페이지와는 전혀 관련 없는 페이지를 노출시키거나 페이지 자체에 수정을 가해 노출된 정보를 악의적으로 편집할 수 있다.

공격 종류

Reflected XSS

  • 공격자가 악성 스크립트를 클라이언트에게 직접 전달해 공격하는 방식이다.
  • 특히 URL에 스크립트를 포함시켜 공격하는 경우가 대표적이며 URL이 길면 클라이언트가 의구심을 가질 수 있기 때문에 Shorten URL(URL 단축)을 이용해 짧은 URL로 만들어 공격하기도 한다.
  • 서버에 스크립트를 저장하지 않기 때문에 서버에서 이루어지는 필터링을 피할 수 있는 공격 방식이다.

Stored XSS

  • 공격자가 악성 스크립트를 서버에 저장시킨 다음 클라이언트의 요청/응답 과정을 통해 공격하는 방식이다.
  • 여기서 스크립트를 서버에 저장하는 행위는 게시글 쓰기 등의 행동을 지칭한다.
  • 보통 서버에서 필터링을 하기 때문에 공격을 우회하기 어렵지만 한 번 성공하면 관리자 입장에서는 눈치채기 힘들고 광범위한 피해를 줄 수 있다는 것이 특징이다.

DOM Based XSS

  • 피해자의 브라우저가 html 페이지를 분석하여 DOM을 생성할 때 악성 스크립트가 DOM의 일부로 구성되어 생성되는 공격이다. 서버의 응답 내에는 악성 스크립트가 포함되지 않지만 브라우저의 응답 페이지에 정상적인 스크립트가 실행되면서 악성 스크립트가 추가되서 실행되는 특징이 있다.

공격 구문 예시

공격시에는 아래와 같은 구문들을 공격 목적에 맞게 작성하여 게시판, 쪽지, 메일 등의 기능을 통해 업로드한다.

<script>alert("hi")</script>

가장 기본적인 구문으로 대놓고 script 태그를 넣어 alert를 실행시키는 구문이다.
이 구문이 실행된다면 해당 사이트는 XSS에 대한 대책이 전혀 없는 것이라 봐도 무방하다.

<scr<script>ipt>alert("hi");</scr</script>ipt>

<script> 태그를 일차적으로 필터링하는 것을 우회하기 위한 구문이다.
중첩된 script 태그가 필터링되면 갈라져있던 script 태그가 결합되면서 구문이 실행된다.

<a onmouseover="alert('hi')">

a 태그를 이용한 공격이다. onmouseover 이벤트를 통해 공격을 실행한다.

<img src=# onerror="alert('hi')">

img 태그를 이용한 공격이다.
고의적으로 없는 src 주소를 지정하고 onerror 이벤트를 통해 공격을 실행한다.

<ruby onmouseover="alert('hi')"></ruby>

잘 사용되지 않는 태그를 이용한 공격이다. 해당 태그가 필터에서 누락된 경우 공격을 실행할 수 있다.

대응 방법

기본적인 대응 방법은 아래와 같다.

  • 입력 값의 길이 제한(이메일, 아이디, 패스워드 등 목적에 맞게)
  • replace 등의 함수를 이용한 치환
  • '<', '>' 와 같이 태그에 사용되는 기호를 엔티티 코드로 변환
  • 입력 값에 대한 꼼꼼한 유효성 검사(반드시 서버에서 수행)
  • 불가피하게 HTML 태그 사용을 허용해야 할 경우 화이트리스트를 만들어 특정 태그 입력만 허용

XSS에 대응하는 방법은 이 외에도 여러가지가 있으나 XSS는 공격패턴이 다양하고 변화무쌍하기 때문에 완벽하게 방어하기는 힘들다. 꾸준한 감시와 관리가 받쳐주지 않는다면 누구도 XSS에서 안전할 수 없다.

참조: XSS(Cross Site Scripting)란?

0개의 댓글