1. XSS란?
XSS(Cross-site Scripting)은 공격자가 웹페이지에 스크립트를 삽입하여 웹 이용자가 해당 코드를 실행하도록 하는 취약점이다. 웹에서 사용되는 대표적인 스크립트 언어로는 자바스크립트, VB스크립트가 있다.
2. XSS 공격의 위험성
- 쿠키 정보 획득
쿠키는 사용자가 웹 사이트를 이용하는 동안 사용자 브라우저에 저장하는 파일이다. 주로 사용자의 상태를 기록하기 위해 쿠키에 로그인 및 버튼 클릭 등에 대한 정보를 저장한다. 따라서 XSS 공격을 통해 쿠키 정보를 탈취할 경우 사용자의 설정을 변경하거나 개인정보를 획득할 수 있다. 만약 쿠키에 웹 페이지 사용자의 세션 ID가 포함되어 있을 경우, XSS 공격을 통해 이를 획득해 공격자가 정상적인 사용자인 척 가장할 수 있다.
- 계정 하이재킹
공격자는 사용자들이 특정 URL에 접속하도록 유도할 수 있고, 그 URL에 접속했던 사용자의 권환을 사용하여 사용자의 시스템을 통제할 수 있다.
- 비정상적인 페이지 노출
웹 페이지 사용자들에게 기존 페이지와는 관련 없는 악성 페이지를 노출시킬 수 있다. 이를 통해 광고 등을 노출시키거나 개인정보를 탈취할 수 있다. 혹은 사용자에게 악성 스크립트가 있는 URL을 노출시켜 이를 클릭하면 악성 프로그램을 다운받는 사이트로 리다이렉트하여 사용자의 컴퓨터에 악성코드를 다운로드할 수 있다.
3. XSS 공격 방식
주로 사용자의 정보를 탈취하기 위해 특수문자나 예약어, 스크립트를 나타내는 (, ), !, @, {, }, \n, \t, \0, ', ", >, <, %, $ 등의 문자를 이용한다.
- 스크립트 태그
스크립트 태그를 삽입하여 자바스크립트를 실행한다.
<script>alert('XSS');</script>
- 자바스크립트 링크
'javascript:'로 시작하는 링크가 스크립트를 실행시킨다는 점을 이용하여 링크 태그를 삽입해 자바스크립트를 실행한다.
<a href="javascript:alert('XSS')">XSS</a>
- 이벤트 속성
주로 'on'으로 시작하는 스크립트의 이벤트 속성을 사용해 스크립트를 실행한다.
<img src="#" onerror="alert('XSS')">
- 블랙리스트 우회
알려지지 않은 태그와 속성들을 사용하여 실행한다.
<ruby oncopy="alert('XSS')">XSS</ruby>
- 내용 난독화
따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고 HTML 인코드를 하여 난독화한다. HTML 인코드를 해도 디코드된 내용이 출력된다.
4. XSS 공격 방어
XSS 공격은 주로 입력값에 대한 검증이 제대로 이루어지지 않아 발생한다. 따라서 서버 측에서는 사용자의 모든 입력값에 대한 필터링을 해주어야 한다. 특히 HTML 스팩에서 정의된 메타문자는 필터링하여 스크립트를 보호해야 한다.
필터링은 해당 데이터를 입력할 때와 출력할 때 모두 이루어져야 한다.
- 입력필터
① 사이트에 스타일이 적용되지 않는 경우
입력 데이터의 <는 <로, >는 >로 필터링하여 HTML 코드가 아닌 단순 문자로 인식하게 한다. 하지만 이 경우 모든 HTML 태그를 필터링하기 때문에 스타일을 적용시켜야 하는 사이트에는 적합하지 않다.
② 라이브러리 제작 혹은 이용
라이브러리를 제작할 경우 새로운 HTML 태그나 속성이 추가될 때마다 필터를 수정하는 것을 막기 위해 막아야 할 태그 및 속성을 설정하기보다는 허용할 태그 및 속성을 설정하는 것이 좋다.
기존에 있던 라이브러리를 사용할 경우 OWASP Antisamy나 NAVER Lucy XSS Filter, ESAPI 등과 같이 공신력있는 거대 기업에서 만든 라이브러리를 사용하는 것이 좋다.
③ BBCode 사용
주로 <와 >를 각각 [와 ]로 대체하여 만든다. 만들기 편하고 안전성이 높다.
- 출력 필터
ifram의 snadbox 옵션으로 iframe 내의 자바스크립트의 제한이 가능하다.
'2021 > web' 카테고리의 다른 글
php -'(싱글 쿼터)와 "(더블 쿼터), 그리고 중괄호 (0) | 2021.07.16 |
---|---|
웹 스터디 3주차 - MySQL(1) (0) | 2021.07.15 |
웹 스터디 3주차 - php(2) (0) | 2021.07.06 |
웹 스터디 2주차 - php(1) (0) | 2021.01.17 |
웹 해킹 2주차 - XSS game 01 (0) | 2021.01.17 |