24 KiB
DOM XSS
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
- 사이버 보안 회사에서 일하시나요? 회사를 HackTricks에서 광고하고 싶으신가요? 아니면 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요? SUBSCRIPTION PLANS를 확인해보세요!
- The PEASS Family를 발견해보세요. 독점적인 NFT 컬렉션입니다.
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter에서 팔로우하세요 🐦@carlospolopm.
- 해킹 트릭을 공유하려면 PR을 hacktricks repo 및 hacktricks-cloud repo 에 제출하세요.
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 해킹을 처음부터 전문가까지 배워보세요!
- 사이버 보안 회사에서 일하시나요? 회사를 HackTricks에서 광고하거나 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요? SUBSCRIPTION PLANS를 확인해보세요!
- The PEASS Family를 발견해보세요. 독점적인 NFT 컬렉션입니다.
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter에서 저를 팔로우하세요 🐦@carlospolopm.
- 해킹 트릭을 공유하려면 PR을 hacktricks repo 및 hacktricks-cloud repo 에 제출하세요.