본 내용 및 실습 환경은 KISEC, 케이쉴드 주니어 교육 과정에 있음을 알려드립니다.

정의

크로스 사이트 스크립팅(Cross Site Scripting, XSS)은 공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 진행하는 것을 말합니다.

크로스 사이트 스크립팅(이하 XSS)은 스크립트 언어와 취약한 코드를 공격 대상으로 하며, 해킹의 주요 목적은 사용자의 정보를 도용하는 것이며, 로그인 입력란을 감염시켜 로그인 세부 정보와 쿠키를 탈취하는 방식으로 진행됩니다.

XSS는 2017년까지 OWASP TOP 10에 속해 있었지만, 이번에는 Injection 항목에 포함되었다.

XSS는 JavaScript를 삽입를 삽입하기에 Injection이 근본이 된다. 그렇기에 이번 2021 OWASP TOP 10에서 Injection에 포함된 것으로 볼 수 있다.

XSS 공격은 클라이언트(사용자) 대상으로 이루어진다.

XSS는 크게 Reflected와 Stored 유형으로 나눌 수 있다. 실습을 통해서 설명드리겠습니다.

실습

1. Reflected XSS

Reflected XSS는 비 지속적 (Non-persistent) 기법으로 불리기도 하며, 이유로는 공격자가 스크립트를 작성하여 요청을 보면 즉시(반사) 스크립트에 대한 결과를 Response 해주기 때문이다.

<script>alert("1");</script>
// OR
"><script>alert("1");</script>
  • 해당 코드는 ‘1’ 이라는 알림창(Alert)을 띄우는 스크립트이다.

  • 스크립트 삽입 구간이 이미 스크립트 내이면 ”>를 이용하여 스크립트를 닫고 새롭게 스크립트를 <script></script> 작성하면 된다.
<script>alert(documnet.cookie);</script> 
// OR
"><script>alert(documnet.cookie);</script> 
  • 위 코드로 쿠키 값 탈취가 가능하다.

2. Stored XSS

Stroed XSS는 지속적 (persistent) 기법으로 불리기도 하며, 이유로는 해당 악성 스크립트가 서버에 저장되어 사용자에 의해서 지속적으로 이용이 가능하기 때문에 지속적 기법이라 불린다.

Stroed XSS로 가장 많이 공격이 되는 곳은 게시판이며, 굳이 게시판이 아니더라도 사용자가 입력한 값이 데이터베이스에 저장이 되고, 저장된 값이 그대로 프론트엔드 단에 보여주는 곳에 공격이 성공할 가능성이 큽니다. XSS공격도 마찬가지로 사용자의 입력에 대한 검증이 없기 때문에 발생합니다.

  • 이처럼 게시판에 악성 스크립트를 작성해두는 것을 의미한다.

  • 사용자가 해당 게시물을 클릭하면 스크립트가 실행되는 것을 알 수 있다.

  • 이것을 응용하여 하면 피싱 사이트를 유도할 수 있다.

<script><iframe src="http://....com"></script>
  • 게시물에 해당 스크립트를 작성하면, 사용자가 클릭하는 동시에 명시해둔 사이트로 이동하게 될 것이다.

보안 대책

  • XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.

  • 외부 입력 값에 스크립트가 삽입되지 못하도록 문자변환 함수 또는 메서드를 사용하여 < > & “ 등을 안전한 함수로 치환

  • HTML태그를 허용하는 게시판에서는 허용되는 HTML 태그들을 화이트리스트로 만들어 해당 태그만 지원하도록 한다.