본문 바로가기

웹개발

XSS (Cross Site Scripting)

XSS(Cross Site Scripting)란?

SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

 

공격 방법에 따라 Stored XSS와 Reflected XSS로 나뉜다.

- Stored XSS

사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식

 

- Reflected XSS

보통 URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식

크로스 사이트 스크립팅이란 이름 답게, 자바스크립트를 사용하여 공격하는 경우가 많다.

공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파된다.

 

xss 위험성

1. 쿠키 정보 및 세션 ID 획득

공격자는 XSS에 취약한 페이지 및 게시판에 XSS 공격을 수행함으로 써 해당 페이지를 이용하는 사용자의 쿠키 정보나 세션 ID를 획득할 수 있다.

만약 세션 ID 등을 쿠키에 포함하는 경우, XSS 공격을 통해서 페이지 사용자의 세션 ID를 획득해 공격자가 불법적으로 정상 사용자인 척 가장할 수 있다.

 

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

XSS 취약점이 있는 웹 서버에 다양한 악성 데이터를 포함시킨 후, 사용자의 브라우저가 악성 데이터를 실행하게 할 수 있다. 공격자는 아직 패치되지 않은 취약점에 대한 공격 코드가 실행되도록해 사용자의 시스템을 통제할 수 있다.

 

3. 악성코드 다운로드

XSS 공격은 악성 스크립트 자체로 악성 프로그램을 다운로드할 수는 없다.

하지만, 사용자가 악성 스크립트가 있는 URL을 클릭하도록 유도해 악성 프로그램을 다운받는 사이트로 Redirect 하거나 x트로이 목마 프로그램을 다운로드 하도록 유도할 수 있다.

더보기

트로이 목마 (악성코드) 란?

 

정상적인 프로그램으로 위장하여 시작부터 끝까지 램에 상주하며 시스템 내부 정보를 공격자의 컴퓨터로 빼돌리는 특징이 있다. 직접 전파가 아닌 주로 웹하드, P2P, 메일 등의 간접적 방식으로 전파되며, 트로이 목마가 숨어 있는 파일을 설치하는 순간 감염이 진행된다.

 

4. 거짓 페이지 노출

XSS 공격에 취약한 페이지일 경우, <script> 태그 뿐만 아니라 <img>와 같은 그림을 표시하는 태그를 사용해 원래 페이지와는 전혀 관련이 없는 페이지를 표시할 수 있다.

 

xss 기법

1. 스크립트 태그

가장 대표적인 xss 기법으로, 스크립트 태그로 자바스크립트를 실행하는 방법이다.

 

<script>
	alert('XSS');
</script>

 

# 대응방안

Alttext=Replace(Alttext,"<script>","A")
Alttext=Replace(Alttext,"</script>","B")
//각각 <script>,</script> 를 A,B 로 치환할 수 있다.

 

2. 자바스크립트 링크

링크 태그로 자바스크립트를 실행한다.

브라우저에서 about: 링크와 같이, javascript: 로 시작하는 링크는 스크립트를 실행시킨다.

스크립트 태그와 같이, javascript: 를 필터링하는 경우가 많아 많은 사이트에서 막는다.

<a href="javascript:alert('XSS')">XSS</a>

 

3. 이벤트 속성

이벤트 속성을 사용한다. 이벤트 속성으로 스크립트를 실행할 수 있다. 주로 on 으로 시작하는 속성이 이벤트 속성이다.

자주 사용되는 이벤트 속성으로는 onload onerror onclick 등이 있다. 

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

 

4. 블랙리스트 우회

알려지지 않은 태그와 속성들을 사용한다.

<ruby oncopy="alert('XSS')">XSS</ruby>

 

5. 내용 난독화

따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고, HTML 인코드를 하여 난독화한다.

일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한다.

 

XSS 방지법

XSS 공격은 IPS, IDS, 방화벽 등으로도 방지할 수가 없다.

더보기
  • IPS : 침입 방지 시스템(IPS)은 네트워크 트래픽에서 잠재적인 위협을 모니터링하고 보안 팀에 경고, 위험한 연결 종료, 악성 콘텐츠 제거 또는 기타 보안 장치를 트리거하는 등 자동으로 차단 조치를 취합니다. 
  • IDS : 침입 탐지 시스템(IDS)은 네트워크 트래픽과 디바이스에서 알려진 악성 활동, 의심스러운 활동 또는 보안 정책 위반이 있는지 모니터링하는 네트워크 보안 툴입니다.
  • 방화벽 : 원치 않는 트래픽으로부터 네트워크를 보호하는 네트워크 보안 솔루션입니다. 방화벽은 사전 프로그래밍된 일련의 규칙에 따라 들어오는 악성코드를 차단합니다. 이러한 규칙은 네트워크 내의 사용자가 특정 사이트 및 프로그램에 액세스하는 것을 방지할 수도 있습니다.

때문에, 단순히 문자를 필터링하는 등의 방법만이 존재한다.

 

1. script 문자 필터링

XSS 공격은 입력값에 대한 검증이 제대로 이루어지지 않아 발생하는 취약점이다.

때문에 사용자의 모든 입력값에 대하여 서버측에서 필터링을 해주어야한다.

PHP의 eregi 함수를 이용하면 XSS 공격에 주로 사용되는 문자들을 필터링할 수 있다.

더보기

PHP의 eregi() 함수

eregi("찾는 값", "문자열", array[matches]);

  • 문자열 중에 찾는 값이 있으면 TRUE를 반환, 없으면 FALSE를 반환한다.
  • 대소문자를 구별한다.
  • 만약, 세 번째 인자(array[matches])를 사용할 경우에는 값을 찾아낸 문자열을 matches에 저장한다.

2. HTML Entities 사용

HTML Entities란 HTML 문서에서 특수 문자를 나타내는데 사용하는 코드를 의미하며, HTML에서 해당 문자를 사용하면 웹 브라우저는 그 문자를 다른 문자와는 다른 의미로 해석한다. 

  • < = &lt;
  • > = &gt;
  • " = &quot;
  • & = &amp;

우회 필터링

  1. 인코딩과 디코딩
    공격자는 악의적인 스크립트를 특수 문자나 HTML 엔티티로 인코딩하여 필터링을 우회할 수 있다.
    또한, 필터링이 이스케이프된 문자열을 디코딩하여 스크립트를 실행시킬 수도 있다.

  2. 문자열 분할
    입력 데이터를 여러 개의 작은 조각으로 나누어 필터링을 피하는 것으로 이를 통해 악의적인 코드가 필터링을 우회할 수 있다.

  3. 이스케이프 및 필터링 회피
    필터링을 우회하기 위해 특정한 이스케이프 문자를 사용하거나 필터링되지 않은 특수 문자를 이용하여 공격자가 악의적인 스크립트를 삽입할 수 있다.

  4. 다른 프로토콜 및 컨텍스트로의 이동
    공격자는 XSS 필터링을 우회하기 위해 다른 프로토콜(javascript:, data:)이나 다른 컨텍스트(href 속성, 스타일 시트 등)로 이동하여 악의적인 스크립트를 삽입할 수 있다.

  5. DOM 기반 XSS
    클라이언트 측에서 발생하는 XSS 공격으로, 서버 측 필터링이나 검증을 우회할 수 있다.

 

'웹개발' 카테고리의 다른 글

Maven과 Gradle  (0) 2024.02.29