본문 바로가기

CS

XSS(Cross Site Scripting)

XSS(Cross Site Scripting) ?

 

XSS은 웹 사이트의 어드민(관리자)이 아닌 악의적인 목적을 가진 제 3자가 악성 스크립트를 삽입하여

의도하지 않은 명령을 실행시키거나 세션 등을 탈취할 수 있는 취약점이다.

 

이름처럼 대부분 자바스크립트를 이용한 공격이 이루어지며

SQL Injection과 함께 웹 취약점 중 가장 기초적인 취약점으로 알려져 있습니다만

워낙 공격패턴이 다양하고 변화가 많이 이루어지기 때문에 

사실상 완벽한 방어가 힘들고 지금까지도 굉장히 위험한 취약점 중 하나 이다.

 


위험성

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

1. 쿠키 및 세션정보 탈취

- XSS에 취약한 웹 게시판 등에 쿠키나 세션 정보를 탈취하는 스크립트를 삽입하여 해당 게시글을 열람하는 유저들의 쿠키 및 세션 정보를 탈취할 수 있으며 이는 공격자가 탈취한 정보를 바탕으로 인증을 회피하거나 특정 정보를 열람할 수 있는 권한을 가지게 해 줍니다.

2. 악성 프로그램 다운 유도

- XSS 자체는 악성 프로그램을 다운로드 시킬 수 없지만 스크립트를 통해 악성 프로그램을 다운받는 사이트로 리다이렉트 시켜서 악성 프로그램을 다운받도록 유도할 수 있습니다.

3. 의도하지 않은 페이지 노출

- XSS를 이용해 <img>태그 등을 삽입하여 원본 페이지와는 전혀 관련 없는 페이지를 노출시키거나 페이지 자체에 수정을 가해 노출된 정보를 악의적으로 편집할 수 있습니다.

 


공격 종류

 Reflected XSS

- 공격자가 악성 스크립트를 클라이언트에게 직접 전달하여 공격하는 방식입니다.

특히 URL에 스크립트를 포함시켜 공격하는 경우가 대표적이며 URL이 길면 클라이언트가 의구심을 가질 수 있기 때문에 Shorten URL(URL 단축)을 이용해 짧은 URL로 만들어 공격하기도 합니다.

서버에 스크립트를 저장하지 않기 때문에 서버에서 이루어지는 필터링을 피할 수 있는 공격 방식입니다.

 Stored XSS

- 공격자가 악성 스크립트를 서버에 저장시킨 다음 클라이언트의 요청/응답 과정을 통해 공격하는 방식입니다.

여기서 스크립트를 서버에 저장하는 행위는 게시글 쓰기 등의 행동을 지칭합니다.

보통 서버에서 필터링을 하기 때문에 공격을 우회하기 어렵지만 한 번 성공하면 관리자 입장에서는 눈치채기 힘들고 광범위한 피해를 줄 수 있다는 것이 특징입니다.

● DOM Based XSS

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

 


XSS 공격 방지법

XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고 클라이언트에도 막을 수 있을만한 수단을 구성해 놓는 것이 좋다

 

  1. script 문자 필터링
    • 사용자의 모든 입력값에 대하여 서버측에서 필터링을 해 주어야 한다.
    • PHP의 eregi 함수를 이용하면 XSS 공격에 주요 사용되는 문자들을 필터링 할 수 있다.
    • 주로 스크립트를 실행하기 위한 특수문자를 필터링하며, <, >, ", ' 등의 문자가 있다.
  2. htmlentities 사용
    • PHP 함수 중 htmlentities라는 함수가 있다. htmlentities는 모든 특수문자를 HTML 엔티티로 변환한다.
    • HTML 엔티티는 "&약어;" 및 "$#숫자;"의 형태를 표현하는 것을 의미한다.

 

사실상 XSS공격은 완전하게 방지가 불가능하다.

굉장히 오래된 공격 기법이면서도 취약성 테스트가 비교적 간단하기 때문에 공격시도가 매우 높다.

꾸준하게 확인하며 관리하는게 제일 좋은 방법인 것 같다.

 

 

'CS' 카테고리의 다른 글

CORS (Cross Origin Resource Sharing) ?  (0) 2022.06.16
JWT란 ? (JSON Web Token)  (0) 2022.06.15
URL과 URI의 차이는 무엇일까?  (0) 2022.06.13
MVC Pattern이 뭘까?  (0) 2022.06.11
Event Loop란  (0) 2022.06.08