목차
- XSS(Cross-Site Scripting)란?
- XSS의 세 가지 유형
XSS(Cross-Site Scripting)란?
XSS란 크로스 사이트 스크립팅, 사이트 간의 스크립팅을 의미한다.
웹 애플리케이션의 취약점을 악용해 악성 스크립트를 다른 사용자에게 삽입하는 공격 기법이다.
공격자가 신뢰할 수 있는 사이트에 악성 코드를 삽입하면, 이 웹 페이지를 이용하는 사용자는 자신도 모르게 악성 스크립트가 실행될 수 있고, 이 때 사용자 쿠키, 세션 정보, 민감 데이터가 탈취당할 수 있다.
악성 스크립트를 삽입한다는 게 무슨 뜻일까?
악성 스크립트를 삽입한다는 것은 공격자가 웹 페이지에 원래는 없던 자바 스크립트를 포함시키는 것을 의미한다. 예를 들어 다음과 같은 방법들로 삽입할 수 있다.
1. 사용자 입력을 통한 삽입: 게시글, 댓글에 아래와 같은 스크립트 코드를 입력할 수 있다. 이렇게 작성된 게시글을 다른 사람들이 열람하면 스크립트 문이 실행된다.
<script>alert('You have been hacked!');</script>
2. URL을 통한 삽입: url의 쿼리 파라미터로 요청을 보냈을 때, 웹 페이지가 이 파라미터(ex. 검색어)를 화면에 띄우면 스크립트가 실행될 수있다.
현대 웹 프레임워크에서의 xss 공격 방어

실제로 리엑트 기반 웹 서비스에 XSS 공격을 해보면, 실패하는 것을 볼 수 있다.
이는 많은 웹 프레임워크들이 기본적으로 XSS 공격에 대한 대응을 해주기 때문이다.
리엑트의 경우에는 React-DOM이 브라우저에 사용자에게 받은 데이터를 출력할 때 자동으로 이스케이프처리를 해준다. 예를 들어 < 문자는 < 로 > 문자는 > 로 이스케이프해주기에 <script> 는 <script> 로 변환되어 스크립트가 실행되지 않는다.
그렇다고 화면에 < 등으로 보이지는 않는다. 브라우저가 HTML을 받으면 이스케이프된 코드를 렌더링할 때 다시 원래 문자로 변환하기 때문이다.
XSS의 세 가지 유형
- Stored XSS(저장형 XSS)
- Refrected XSS(반사형 XSS)
- DOM-based XSS(DOM 기반 XSS)
Stored XSS (저장형 XSS)
공격자가 악성 스크립트를 웹 사이트 데이터베이스에 저장하고, 해당 데이터를 다른 사용자가 열람할 때 스크립트가 실행된다.
동작 과정
- 공격자가 댓글에 악성 스크립트문을 작성하고 저장시킨다.
- 사용자가 댓글을 열람한다.
- 악성 스크립트가 실행된다.
Reflected XSS (반사형 XSS)
URL 파라미터에 악성 스크립트를 삽입하여 요청하면 서버가 즉시 이 데이터를 반환해서 클라이언트 화면에 반영할 때 발생한다. 따라서 공격자가 특정 URL을 뿌리고, 사용자가 이를 클릭하면 공격이 성사된다.
동작 과정
- 공격자는 특정 URL 파라미터에 특정 값을 넣으면 화면에 그 값이 반영됨을 인지한다.
- 공격자가 URL 파라미터에 악성스크립트를 넣는다.
- 공격자는 URL을 뿌린다.
- 사용자가 URL을 클릭한다.
- URL에 있던 악성 스크립트가 화면에 들어가면서 스크립트가 실행된다.
DOM-based XSS (DOM 기반 XSS)
클라이언트 측에서 실행되는 자바스크립트 코드가 직접적으로 악성 스크립트를 처리하는 공격이다.
웹 페이지의 자바 스크립트에서 URL등에서 정보를 받아 화면에 띄우는 코드가 존재하면 발생한다.
document.write(window.location.hash);
위 코드와 같이 url 값을 js에서 받아 화면에 출력하는 경우,
<http://vulnerable-site.com/#>alert('Hacked');
위 주소를 접속하면 스크립트가 실행될 수 있다.
동작 과정
- 공격자가 URL에 악성스크립트를 심는다.
- 사용자가 이 URL을 클릭한다.
- URL에 있던 악성 스크립트를 자바스크립트가 받아, 동적으로 페이지 내용을 변경하는 과정에서 악성스크립트가 실행된다.