XSS에 대해서 알아보자

0

면접 스터디

목록 보기
5/8

XSS에 대해 정의된 공식 문서는 따로 없지만, wikipedia에 정의된 내용에 따르면 아래와 같다.

XSS(Cross-Site Scripting)이란?
사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로, 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.

위의 얘기를 간단히 말하면, 사이트 관리와 아무 연관이 없는 제 3자가 웹 페이지에 악성 스크립트를 삽입해 공격을 하는 것이다. 이렇게 삽입된 스크립트를 통해 다른 웹사이트와 정보를 교환하는 식으로 작동하기 때문에 'Cross-Site'라는 이름이 붙게 되었다.

이 공격이 위험한 이유는, 삽입하는 스크립트 내용에 따라서 쿠키나 세션, 토큰 등의 탈취가 가능하기 때문에 이를 인증이나 세션관리에 사용하고 있는 사이트에 침입하거나 심각한 피해를 입힐 가능성이 있다.

이러한 과정이 어떻게 진행이 되는지 간단한 예시를 통해서 알아보자.

XSS의 예시

먼저 사용자가 입력 폼에 스크립트 코드를 입력하면, 스크립트 내용이 DOM(Document Object Model, 문서 객체 모델)에 추가된다.
웹 브라우저는 이 스크립트 코드가 누구에 의해 작성됐는지 알 수 없기 때문에 일반적인 방식으로 그냥 실행하게 된다.

//example

// HTML
<input id='input'></input>
<button id='input-btn'>submit</button>

<div id='submitted-input'></div>

// script
document.querySelector('#input-btn').addEventListener("click", (e) => {
  const userInput = document.querySelector('#input').value

  document.querySelector('#submitted-input').innerHTML = userInput
})

위의 input에 <img src="#"XSS")"> 와 같은 스크립트 코드를 입력하면 console 창에 'XSS'문구가 출력되는 것을 볼 수 있다.

XSS 방지 방법

XSS 공격은 스크립트를 삽입하는 방식으로 발생하기 때문에 기본적으로는 스크립트 태그를 사용하게 된다. 그래서 스크립트 태그에 자주 사용되는 <, > 등과 같은 문자를 필터링 해주는 방법으로 완벽하진 않지만 어느정도 방어를 할 수 있다.
문자 입력을 그대로 표시하지 않고 입력 시 문자 참조(HTML entity)로 필터링을 한 뒤에, 서버에서 브라우저로 전송 시 문자를 인코딩한다. (HTML 문자 참조란 ASCII 코드를 동일한 의미의 HTML 문자로 변경하는 과정이며, HTML 문자는 대부분의 브라우저에서 단순한 문자로 처리된다.)

예를 들어서, <script>의 <는 동일한 의미의 HTML문자 &lt;로, >는 &gt;로 변경한다. 이렇게 바꾸면 사용자에게는 <script>로 보이지만 실제 HTML 문서에는 &lt;script&gt;로 나타난다. 이 부분이 브라우저에서는 일반 문자로 인식되어 스크립트가 실행되지 않는다.

참고 사이트
https://tecoble.techcourse.co.kr/post/2021-04-26-cross-site-scripting/

profile
우주와 같은 프로그래밍 세상

0개의 댓글