hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
2024-02-10 21:30:13 +00:00

24 KiB

DOM XSS

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

DOM 취약점

DOM 취약점은 공격자가 제어하는 소스(예: location.search, document.referrer, 또는 document.cookie)에서 안전하지 않게 싱크로 전송되는 경우 발생합니다. 싱크는 악성 데이터가 주어지면 해로운 콘텐츠를 실행하거나 렌더링할 수 있는 함수 또는 객체(예: eval(), document.body.innerHTML)입니다.

  • 소스는 공격자가 조작할 수 있는 입력으로, URL, 쿠키 및 웹 메시지를 포함합니다.
  • 싱크는 악성 데이터가 부정적인 영향(스크립트 실행과 같은)을 미칠 수 있는 잠재적으로 위험한 종단점입니다.

데이터가 적절한 유효성 검사 또는 살균 없이 소스에서 싱크로 흐를 때 XSS와 같은 공격이 가능해집니다.

{% hint style="info" %} 소스 및 싱크의 더 최신 목록은 https://github.com/wisec/domxsswiki/wiki 에서 찾을 수 있습니다. {% endhint %}

일반적인 소스:

document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database

일반적인 취약점:

오픈 리디렉션 자바스크립트 삽입 DOM 데이터 조작 jQuery
location eval() scriptElement.src add()
location.host Function() constructor scriptElement.text after()
location.hostname setTimeout() scriptElement.textContent append()
location.href setInterval() scriptElement.innerText animate()
location.pathname setImmediate() someDOMElement.setAttribute() insertAfter()
location.search execCommand() someDOMElement.search insertBefore()
location.protocol execScript() someDOMElement.text before()
location.assign() msSetImmediate() someDOMElement.textContent html()
location.replace() range.createContextualFragment() someDOMElement.innerText prepend()
open() crypto.generateCRMFRequest() someDOMElement.outerText replaceAll()
domElem.srcdoc ``로컬 파일 경로 조작 someDOMElement.value replaceWith()
XMLHttpRequest.open() FileReader.readAsArrayBuffer() someDOMElement.name wrap()
XMLHttpRequest.send() FileReader.readAsBinaryString() someDOMElement.target wrapInner()
jQuery.ajax() FileReader.readAsDataURL() someDOMElement.method wrapAll()
$.ajax() FileReader.readAsText() someDOMElement.type has()
``Ajax 요청 조작 FileReader.readAsFile() someDOMElement.backgroundImage constructor()
XMLHttpRequest.setRequestHeader() FileReader.root.getFile() someDOMElement.cssText init()
XMLHttpRequest.open() FileReader.root.getFile() someDOMElement.codebase index()
XMLHttpRequest.send() 링크 조작 someDOMElement.innerHTML jQuery.parseHTML()
jQuery.globalEval() someDOMElement.href someDOMElement.outerHTML $.parseHTML()
$.globalEval() someDOMElement.src someDOMElement.insertAdjacentHTML 클라이언트 측 JSON 삽입
``HTML5 저장소 조작 someDOMElement.action someDOMElement.onevent JSON.parse()
sessionStorage.setItem() XPath 삽입 document.write() jQuery.parseJSON()
localStorage.setItem() document.evaluate() document.writeln() $.parseJSON()
**[**`서비스 거부`**](dom-xss.md#denial-of-service)** someDOMElement.evaluate() document.title ``쿠키 조작
requestFileSystem() ``문서 도메인 조작 document.implementation.createHTMLDocument() document.cookie
RegExp() document.domain history.pushState() WebSocket-URL 독성
클라이언트 측 SQL 삽입 웹 메시지 조작 history.replaceState() WebSocket
executeSql() postMessage() `` ``

innerHTML 취약점은 현대 브라우저에서 script 요소를 허용하지 않으며, svg onload 이벤트도 발생하지 않습니다. 따라서 img 또는 iframe과 같은 대체 요소를 사용해야 합니다.

이러한 유형의 XSS는 아마도 가장 찾기 어려운 유형입니다. JS 코드 내부를 살펴보고, 제어할 수 있는 값을 사용하는지 확인한 다음, 그 경우에는 임의의 JS를 실행하기 위해 악용할 수 있는 방법이 있는지 확인해야 합니다.

이를 찾기 위한 도구

예시

오픈 리디렉션

출처: https://portswigger.net/web-security/dom-based/open-redirection

DOM에서의 오픈 리디렉션 취약점은 스크립트가 도메인 간 탐색을 시작할 수 있는 싱크에, 공격자가 제어할 수 있는 데이터를 작성하는 경우 발생합니다.

리디렉션이 발생하는 URL의 시작 부분을 제어할 수 있다면, **javascript:alert(1)**과 같은 임의의 코드를 실행할 수 있다는 점을 이해하는 것이 중요합니다.

싱크:

location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
domElem.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()

쿠키 조작

출처: https://portswigger.net/web-security/dom-based/cookie-manipulation

DOM 기반 쿠키 조작 취약점은 스크립트가 공격자에 의해 제어될 수 있는 데이터를 쿠키의 값에 통합할 때 발생합니다. 이 취약점은 쿠키가 사이트 내에서 사용될 경우 웹페이지의 예기치 않은 동작을 초래할 수 있습니다. 또한 쿠키가 사용자 세션 추적에 관여하는 경우 세션 고정 공격을 수행하기 위해 악용될 수 있습니다. 이 취약점과 관련된 주요 취약점은 다음과 같습니다:

취약점:

document.cookie

JavaScript 삽입

출처: https://portswigger.net/web-security/dom-based/javascript-injection

DOM 기반 JavaScript 삽입 취약점은 공격자가 제어할 수 있는 데이터를 JavaScript 코드로 실행하는 경우에 발생합니다.

Sinks:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Document-domain 조작

From: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Document-domain 조작 취약점은 스크립트가 공격자가 제어할 수 있는 데이터를 사용하여 document.domain 속성을 설정할 때 발생합니다.

document.domain 속성은 브라우저에 의해 동일 출처 정책강제중요한 역할을 합니다. 서로 다른 출처에서 가져온 두 페이지가 document.domain동일한 값으로 설정하면 제한 없이 상호작용할 수 있습니다. 브라우저는 document.domain에 할당 가능한 값에 일정한 제한을 두지만, 실제 페이지 출처와 완전히 관련 없는 값을 할당하는 것을 방지하는 예외가 있습니다. 일반적으로 브라우저는 하위 도메인이나 상위 도메인의 사용을 허용합니다.

Sinks:

document.domain

WebSocket-URL 독살

출처: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

WebSocket-URL 독살은 스크립트가 WebSocket 연결의 대상 URL로 제어 가능한 데이터를 사용할 때 발생합니다.

싱크:

WebSocket 생성자는 WebSocket-URL 독살 취약점으로 이어질 수 있습니다.

링크 조작

출처: https://portswigger.net/web-security/dom-based/link-manipulation

DOM 기반 링크 조작 취약점은 스크립트가 현재 페이지 내에서 탐색 대상에 공격자가 제어 가능한 데이터를 작성할 때 발생합니다. 이는 클릭 가능한 링크나 양식의 제출 URL과 같은 것입니다.

싱크:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax 요청 조작

출처: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Ajax 요청 조작 취약점은 스크립트가 XmlHttpRequest 객체를 사용하여 발행되는 Ajax 요청에 공격자가 제어 가능한 데이터를 작성할 때 발생합니다.

싱크(Sinks):

XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()

로컬 파일 경로 조작

출처: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

로컬 파일 경로 조작 취약점은 스크립트가 filename 매개변수로 공격자가 제어 가능한 데이터를 파일 처리 API에 전달할 때 발생합니다. 이 취약점은 공격자가 URL을 구성하여 다른 사용자가 방문할 경우 사용자의 브라우저가 임의의 로컬 파일을 열거나 쓸 수 있는 상황을 악용할 수 있습니다.

싱크(Sinks):

FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

클라이언트 측 SQL 인젝션

출처: https://portswigger.net/web-security/dom-based/client-side-sql-injection

클라이언트 측 SQL 인젝션 취약점은 스크립트가 안전하지 않은 방식으로 공격자가 제어 가능한 데이터를 클라이언트 측 SQL 쿼리에 통합할 때 발생합니다.

싱크(Sinks):

executeSql()

HTML5-storage 조작

출처: https://portswigger.net/web-security/dom-based/html5-storage-manipulation

HTML5-storage 조작 취약점은 스크립트가 웹 브라우저의 HTML5 저장소(localStorage 또는 sessionStorage)에 공격자가 제어할 수 있는 데이터를 저장할 때 발생합니다. 이 동작 자체는 보안 취약점이 아니지만, 애플리케이션이 저장된 데이터를 안전하지 않게 읽고 처리하는 경우 문제가 될 수 있습니다. 이로 인해 공격자는 저장 메커니즘을 악용하여 크로스 사이트 스크립팅 및 JavaScript 삽입과 같은 다른 DOM 기반 공격을 수행할 수 있습니다.

싱크(Sinks):

sessionStorage.setItem()
localStorage.setItem()

XPath 주입

출처: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM 기반 XPath 주입 취약점은 스크립트가 공격자가 제어 가능한 데이터를 XPath 쿼리에 통합할 때 발생합니다.

Sinks:

document.evaluate()
someDOMElement.evaluate()

클라이언트 측 JSON 삽입

출처: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM 기반 JSON 삽입 취약점은 스크립트가 공격자가 제어 가능한 데이터를 JSON 데이터 구조로 구문 분석하고 애플리케이션에서 처리하는 문자열에 통합하는 경우 발생합니다.

싱크(Sinks):

JSON.parse()
jQuery.parseJSON()
$.parseJSON()

웹 메시지 조작

출처: https://portswigger.net/web-security/dom-based/web-message-manipulation

웹 메시지 취약점은 스크립트가 브라우저 내에서 다른 문서로 공격자가 제어 가능한 데이터를 웹 메시지로 보내는 경우 발생합니다. 취약한 웹 메시지 조작의 예는 PortSwigger의 웹 보안 아카데미에서 찾을 수 있습니다.

취약점:

웹 메시지를 보내기 위한 postMessage() 메서드는 메시지를 수신하는 이벤트 리스너가 수신된 데이터를 안전하지 않은 방식으로 처리하는 경우 취약점을 유발할 수 있습니다.

DOM 데이터 조작

출처: https://portswigger.net/web-security/dom-based/dom-data-manipulation

DOM 데이터 조작 취약점은 스크립트가 공격자가 제어 가능한 데이터를 DOM 내의 필드에 작성하고 이를 시각적인 UI 또는 클라이언트 측 로직에서 사용하는 경우 발생합니다. 이 취약점은 공격자가 다른 사용자가 방문할 경우 클라이언트 측 UI의 모양이나 동작을 변경할 수 있는 URL을 구성하여 공격할 수 있습니다.

취약점:

scriptElement.src
scriptElement.text
scriptElement.textContent
scriptElement.innerText
someDOMElement.setAttribute()
someDOMElement.search
someDOMElement.text
someDOMElement.textContent
someDOMElement.innerText
someDOMElement.outerText
someDOMElement.value
someDOMElement.name
someDOMElement.target
someDOMElement.method
someDOMElement.type
someDOMElement.backgroundImage
someDOMElement.cssText
someDOMElement.codebase
document.title
document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()

서비스 거부

출처: https://portswigger.net/web-security/dom-based/denial-of-service

DOM 기반 서비스 거부 취약점은 스크립트가 공격자가 제어 가능한 데이터를 안전하지 않게 문제가 있는 플랫폼 API에 전달할 때 발생합니다. 이는 사용자의 컴퓨터가 과도한 양의 CPU 또는 디스크 공간을 소비할 수 있는 API를 포함합니다. 이러한 취약점은 브라우저가 localStorage에 데이터를 저장하려는 시도를 거부하거나 바쁜 스크립트를 종료함으로써 웹사이트의 기능을 제한하는 등의 중대한 부작용을 가질 수 있습니다.

싱크(Sinks):

requestFileSystem()
RegExp()

Dom Clobbering

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!