본문 바로가기

Security

DOM-Based-XSS에 대하여

 

DOM을 설명하기에 앞서서 먼저 BOM에 대해서 잠깐 말씀드리겠습니다.

대부분 서비스는 웹 브라우저를 바탕으로 실행이 되는데, 이 브라우저와 관련된 객체들의 집합을 Browser Object Model , BOM이라고 부릅니다.

이 BOM으로 브라우저와 관련된 기능들을 구성하는데 DOM이 이 BOM 중의 하나입니다.

 

DOM은 Document object model의 약자입니다. Document는 문서이고, Object는 객체로 번역이 됩니다. 

그래서 번역하면 문서 객체 모델이라고 번역할 수 있습니다.

 

그럼 이 문서객체란 무엇이냐면 html 태그나 body태그 같은 html문서의 태그들을 JavaScript가 이용할 수 있는 객체(object)로 만들면 그것을 문서 객체라고 합니다.

그리고 모델이라는 단어 이 문서객체를 ‘인식하는 방식’이라고 해석할 수 있습니다.

 

그래서 DOM은 넓은 의미로는 웹 브라우저가 HTML 페이지를 인식하는 방식을 의미하고, 

좁은 의미로 본다면 document 객체와 관련된 객체의 집합을 의미합니다.

 

이 DOM은 오른쪽그림처럼 tree 자료구조의 형태입니다. 다들 아시겠지만 위의 root node에서 아래로 퍼져나가는 형태입니다.

 

오른쪽 그림은 DOM에 포함된 태그들을 더 자세히 본 그림입니다. 각각의 태그에 자식 노드들과 속성들이 트리 형태로 자료 구조를 형성하고 있는 것을 볼 수 있습니다.

그래서 우리는 DOM 객체에 일단 접근하고 키워드를 통하고 통해서 필요한 노드에 접근하고 우리가 필요로 하는 작업들을 할 수 있습니다.

 

결론적으로 DOM 문서의 구조화된 표현을 제공하며 Javascript 이용해 DOM 문서 구조, 스타일, 내용 등을 변경할 있게 도와줍니다.

 

그래서 우리가 자바 스크립트로 구현한 모든 동작들이 대체로 DOM을 수정하기 위한 것이라고 말할 수 있습니다. 

JavaScript 브라우저가 읽고 어떤 작업을 있는 언어. DOM 바로 작업이 이루어지는 장소 것입니다.

 

 

웹 사이트는 JavaScript를 이용해 DOM의 노드/객체 그리고 속성 등을 변경할 수 있습니다.

그 자체로는 문제가 되지 않지만, 보안을 고려하지 않고 사용한다면 취약점이 발생할 수 있습니다.

뒷부분 DOM-based의 취약점을 이해하기 위해서 source와 sink의 개념을 간단히 설명하겠습니다.

SOURCE 란 잠재적으로 공격자에 의해 제어될 수 있는 데이터를  받아들이는 Javascript의 속성을 말하며 예시는 아래와 같습니다.

그리고 SINK 란 잠재적으로 위험한 Javascript 함수 또는 DOM 객체로, 공격자의 데이터를 전달받아 수행될 때 예기치 않은 결과를 도출할 수 있는 요소들입니다.

그래서 기본적으로 DOM-based의 취약점은 웹사이트가 데이터를 source로부터 sink로 전달하고,

client session context에서 안전하지 않은 방식으로 해당 데이터를 처리하기 때문에 발생합니다.

 

다음으로 DOM-based XSS가 발생하는 경우에 대해 말씀드리겠습니다. 

DOM-based XSS는 Javascript 코드가 공격자가 제어할 수 있는 SOURCE로부터 전송된 데이터(ex. URL)를 받은 후,

그 데이터를 동적으로 코드를 지원하는 SINK(ex. eval())에 전달하는 경우 발생합니다.

그래서 DOM Based XSS는 피해자의 브라우저에서 DOM 환경을 수정하여 클라이언트 측 코드가 

예상치 못한 방식으로 공격 구문이 실행되는 XSS(Cross Site Scripting) 공격입니다. 

, 페이지 자체(HTTP 응답) 변경되지 않지만, 페이지에 포함된 클라이언트 코드는 DOM환경에서 발생한  악의적인 변조로 인해 공격 구문이 실행됩니다.

 

DVWA 환경에서 간단한 실습을 해보았습니다. 첫번째 사진 보시면 페이지에서 4가지 언어를 선택할 수 있고

Select 버튼을 클릭하면, URL의 default라는 이름의 매개변수 값이 설정된 것을 확인할 수 있습니다.

URL에 설정된 default 라는 이름의 매개변수 값을 whitehat으로 수정해서 전송해보았습니다.

전송한 결과 드롭다운 목록에 선택된 값이 URL 매개변수에 입력된 whitehat으로 변경된 것을 확인할 수 있습니다.

, default 매개변수에 설정된 값으로 페이지를 구성한다는 사실을 확인할 있습니다.

 

아래 사진은 default 매개변수에다가 드롭다운 목록에 쿠키 정보를 작성하게 하는 스크립트를 작성하여 전송한 결과입니다.

DOM 구조가 수정되어 쿠키 정보가 드롭박스에 표시되는 모습을 확인할 있었습니다.

 

해당 기능(드롭다운 목록 설정)이 구현된 소스코드를 개발자 옵션을 통해 살펴본 결과

default 매개변수에 입력된 값을 통해 클라이언트 측에서 JavaScript 이용하여 페이지를 구성한다는 사실을 확인할 있었습니다.

'Security' 카테고리의 다른 글

Dreamhack 드림핵 - amocafe  (6) 2024.02.07
Dreamhack 드림핵 - CSRF Advanced  (1) 2024.01.28
Dreamhack 드림핵 - random-test  (1) 2024.01.28
Dreamhack 드림핵 - simple_sqli  (4) 2024.01.28
Dreamhack 드림핵 - [wargame.kr] tmitter  (1) 2024.01.28