[Web Hacking] XSS(Cross-Site Scripting) : Base #1

2024. 2. 11. 04:04정보 보안/Web

 

XSS(Cross Site Scripting)

 

  XSS란 크사 혹은 크스스라고도 불리며 웹 해킹 공격 기법 중 한 종류이다. XSS는 다른 웹 해킹 공격 기법과는 다르게 클라이언트, 즉 사용자를 타깃으로 공격한다. XSS는 스크립트를 게시판이나 URL에 악의적인 의도로 삽입하여 피해자의 쿠키 혹은 세션을 탈취한다거나 피해자가 의도치 않은 명령을 실행하도록 만든다.

 

  XSS는 대표적으로 세 가지 종류의 공격 방법이 존재하며 다음과 같다.

 

  • Stored XSS (저장형 XSS)
  • Reflected XSS (반사형 XSS)
  • DOM Based XSS

 

Stored XSS(저장형 XSS)

 

  Stored XSS는 공격자가 악의적인 스크립트를 웹 서버에 저장하여 피해자의 웹 브라우저에서 스크립트가 작동되도록 하는 공격이다. 예시로 웹 사이트의 게시판에서 사용 가능하며 게시글 내용 혹은 제목에 스크립트를 삽입하여 사용자가 해당 게시글을 읽기 위해 웹 서버에 요청하게 되면 게시글에 삽입된 악의적인 스크립트가 작동된다.

 

=> Stored XSS : 공격자는 웹 서버에 스크립트를 저장하고 피해자는 저장된 스크립트가 포함된 웹 페이지를 요청하게 되면 공격자가 심어 놓은 스크립트가 작동하여 피해 발생

 

Stored XSS

 

 

Reflected XSS

 

  Reflected XSS는 악의적인 스크립트를 URL에 삽입하여 사용자에게 노출시킨다. 사용자는 노출된 URL을 클릭하게 되면 URL에 삽입된 스크립트가 작동하게 된다. Reflected XSS 공격의 스크립트는 주로 URL의 파라미터에 삽입되며 이는 곧 GET 메서드를 사용하는 웹 페이지에서 발생한다는 의미이다.

 

=> Reflected XSS : 공격자는 스크립트를 삽입한 URL을 피해자에게 노출시키고 피해자가 노출된 URL을 클릭하여 웹 서버에 요청을 하게 되면 삽입된 스크립트가 작동하여 피해 발생

 

Reflected XSS

 

 

DOM Based XSS 

 

  DOM Based XSS는 DOM 구조에 접근하여 요소를 추가한다거나 수정하기 위해 Javascript로 악성 스크립트를 삽입하여 클라이언트 웹 브라우저에서 작동하도록 만든다. Stored XSS 및 Reflected XSS는 스크립트 작동으로 인한 출력 결과가 응답 페이지 HTML에서 분명하게 나타나기 때문에 위험 징후를 발견할 수 있지만, DOM Based XSS는 웹 사이트의 코드를 조사하지 않고는 발견하기 힘들다. 이로 인해 전문 기술 지식을 갖추지 않은 이상 DOM Based XSS 공격에 쉽게 노출이 될 수 있다.

 

DOM (Document Object Model)란?

좌 : HTML, 우 : DOM

 

  HTML은 태그의 집합으로 이루어져 있으며 트리 구조로 객체가 형성된다. 이러한 트리 구조를 DOM(Document Object Model)이라 한다. DOM 구조에 접근하기 위해서는 Javascript와 같은 스크립트 언어를 사용해야 하며 이를 통해 DOM 구조에 요소를 추가한다거나 제거할 수 있다.

 

 

DOM Based XSS vs Reflected XSS

 

  DOM Based XSS는 Reflected XSS와 같이 동적 요청에 의해 웹 페이지를 구성하는 과정에서 발생한다는 공통점은 있지만 Reflected XSS는 서버 측에서 동적 웹 페이지를 구성하는 환경에서 발생하고, DOM Based XSS는 클라이언트 측에서 동적 웹 페이지를 구성하는 환경에서 발생한다.

 

  공통점

  • 동적 요청에 의해 웹 페이지를 구성하는 과정에서 발생

 

  차이점

  • 동적 웹 페이지를 구성하는 환경이 다름
  • Reflected XSS는 서버 측에서 동적 웹 페이지를 구성 (사용자 입력 값이 서버 측에 전달되어 동적 웹 페이지 구성)
  • DOM Based XSS는 클라이언트 측에서 동적 웹 페이지를 구성 (사용자 입력 값이 서버 측에 전달되지 않고 클라이언트 측 브라우저에서 동적 웹 페이지 구성됨)