Iriton's log

[Dreamhack] Lv.2 DOM XSS 본문

WebHacking/WarGame

[Dreamhack] Lv.2 DOM XSS

Iriton 2023. 11. 7. 18:56

DOM이란


Document Object Model의 약자이다.

HTML의 문법은 태그의 집합으로 구성되어 있고 이러한 태그들은 트리 구조로 객체가 형성되는데

이러한 트리 구조 집합을 DOM 구조라고 한다.

 

DOM Based XSS란


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

 

Reflected XSS와 같이 동적 페이지를 구성하는 과정 상 발생하는 XSS 공격이다.

하지만 Reflected XSS는 서버 측에서 동적 페이지를 구성하는 환경에서 발생되는 XSS이다.

 

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

 

풀이


DOM XSS는 클라이언트 측에서 공격이 이루어지는 것으로 코드를 파헤칠 필요는 없다.

각 페이지의 기능과 살짝의 흐름을 파악해 보자

 

 

1. vuln(xss) page

페이지 명대로 여기서 공격이 이루어질 거 같다.

vuln?param=<img%20src=https://dreamhack.io/assets/img/logo.0a8aabe.svg>#dreamhack

URL을 살펴 보니 파라미터 값에 이미지 태그와 dreamhack이라는 문자열이 있다.

이를 조작해서 어떤 형태인지 보자

 

param 뒤에 img 태그 대신 문자열을 입력하고 #flag라고 수정해 봤다.

그럼 이렇게 변경이 된다

자유롭게 값을 입력하지 않거나 변경할 수가 있었다.

URL에서 #은 무슨 역할일까?

 

참고자료: https://developer.mozilla.org/ko/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL

 

URL이란? - Web 개발 학습하기 | MDN

이 문서에서는 URL(Uniform Resource Locator)이 무엇이며 어떻게 구성되어 있는지 설명합니다.

developer.mozilla.org

#은 local anchor로 브라우저에서 서버로 요청 시, #을 포함한 뒷문자는 전송하지 않는다.

주소 입력한 경우, 서버는 /에 대한 리소스를 내려주고, 브라우저에서는 내려온 리소스가 수행되면서 url 상의 # 이후 문자를 가져가서 처리하는 구조로 동작한다.

 

더 자세한 내용을 살펴 보기 위해 vuln의 html 파일에서 script를 살펴 보자.

클라이언트 단에서 일어나는 XSS 공격이므로 서버 단의 코드보다 script 코드가 메인이 되기 때문이다.

{% extends "base.html" %}
{% block title %}Index{% endblock %}

{% block head %}
  {{ super() }}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}

{% block content %}

  <script nonce={{ nonce }}>
    window.addEventListener("load", function() {
      var name_elem = document.getElementById("name");
      name_elem.innerHTML = `${location.hash.slice(1)} is my name !`;
    });
 </script>
  {{ param | safe }}
  <pre id="name"></pre>
{% endblock %}

script nonce는 script 태그의 화이트리스트에 스크립트를 등록하기 위한 일회용 암호 역할을 한다.

nonce로 신뢰되는 id=name인 태그를 사용하면 된다.

 

URL에 param=<script%20id="name"></script>#alert(1);//

를 주입하였더니 alert(1)이 실행되었다.

//를 이용하여 주석처리 하는 이유는 

name_ele.interHTML에서 is my name 이란 문자열이 포함이 되기 때문에 스크립트 정상 실행을 방해한다.

따라서 해당 문자열은 주석 처리해 줘야 스크립트문이 실행된다.

 

document.cookie를 바로 alert에 띄우는 건 시도해 봤는데 안 돼서

memo를 활용하기로 했다.

 

location='/memo?memo='+document.cookie//

를 # 뒤에 넣어주자

 

/vuln 페이지에서 하면 헷갈리니

good, wrong을 띄워주는 /flag에서 공격을 실행해 주자.

 

'WebHacking > WarGame' 카테고리의 다른 글

[Dreamhack] Lv.1 xss-2  (0) 2023.11.07
[Dreamhack] Lv.1 xss-1  (0) 2023.11.07
[Dreamhack] simple_sqli write-up  (0) 2023.10.10
[los.rubiya] orc write-up  (0) 2023.10.10
[los.rubiya] goblin write-up  (0) 2023.10.10
Comments