DOM XSS

Support HackTricks

DOM 脆弱性

DOM 脆弱性は、攻撃者が制御する ソースlocation.searchdocument.referrer、または document.cookie など)からのデータが安全でない方法で シンク に転送されるときに発生します。シンクは、悪意のあるデータが与えられた場合に有害なコンテンツを実行またはレンダリングできる関数やオブジェクト(例:eval()document.body.innerHTML)です。

  • ソース は、攻撃者によって操作可能な入力であり、URL、クッキー、ウェブメッセージを含みます。

  • シンク は、悪意のあるデータが悪影響を及ぼす可能性のある危険なエンドポイントであり、スクリプトの実行などを引き起こす可能性があります。

リスクは、データが適切な検証やサニタイズなしにソースからシンクに流れるときに発生し、XSS のような攻撃を可能にします。

より最新のソースとシンクのリストは https://github.com/wisec/domxsswiki/wiki で見つけることができます。

一般的なソース:

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

一般的なシンク:

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()

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

someDOMElement.action

someDOMElement.onevent

JSON.parse()

sessionStorage.setItem()

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()

history.replaceState()

WebSocket

executeSql()

postMessage()

``

``

innerHTML シンクは、現代のブラウザでは script 要素を受け入れず、svg onload イベントも発火しません。これは、imgiframe のような代替要素を使用する必要があることを意味します。

この種の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()

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

DOMベースのクッキー操作の脆弱性は、スクリプトが攻撃者によって制御可能なデータをクッキーの値に組み込むときに発生します。この脆弱性は、クッキーがサイト内で利用される場合、ウェブページの予期しない動作を引き起こす可能性があります。さらに、クッキーがユーザーセッションの追跡に関与している場合、セッション固定攻撃を実行するために悪用される可能性があります。この脆弱性に関連する主なシンクは次のとおりです:

Sinks:

document.cookie

JavaScript Injection

From: 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 manipulation

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

Document-domain manipulation vulnerabilities は、スクリプトが攻撃者が制御できるデータを使用して document.domain プロパティを設定する場合に発生します。

document.domain プロパティは、ブラウザによる same-origin policyenforcement において key role を果たします。異なるオリジンからの2つのページが document.domain同じ値 に設定すると、制限なしに相互作用できます。ブラウザは document.domain に割り当て可能な値に対して特定の limits を課しますが、実際のページオリジンに無関係な値の割り当てを防ぐための例外も存在します。通常、ブラウザは child または parent domains の使用を許可します。

Sinks:

document.domain

WebSocket-URL poisoning

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

WebSocket-URL poisoning は、スクリプトが 制御可能なデータをWebSocket接続のターゲットURLとして利用する 場合に発生します。

Sinks:

WebSocket コンストラクタは、WebSocket-URL poisoning 脆弱性を引き起こす可能性があります。

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

DOMベースのリンク操作脆弱性 は、スクリプトが 攻撃者が制御可能なデータを現在のページ内のナビゲーションターゲットに書き込む 場合に発生します。例えば、クリック可能なリンクやフォームの送信URLなどです。

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajaxリクエスト操作

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

Ajaxリクエスト操作の脆弱性は、スクリプトがXmlHttpRequestオブジェクトを使用して発行されるAjaxリクエストに攻撃者が制御可能なデータを書き込むときに発生します。

Sinks:

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

ローカルファイルパス操作

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

ローカルファイルパス操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをファイル処理APIにfilenameパラメータとして渡すときに発生します。この脆弱性は、攻撃者が他のユーザーが訪れた場合にユーザーのブラウザが任意のローカルファイルを開いたり書き込んだりするURLを構築するために悪用される可能性があります。

Sinks:

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

クライアントサイドSQLインジェクション

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

クライアントサイドSQLインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータをクライアントサイドのSQLクエリに安全でない方法で組み込むときに発生します。

Sinks:

executeSql()

HTML5-storage manipulation

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

HTML5ストレージ操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをウェブブラウザのHTML5ストレージlocalStorageまたはsessionStorage)に保存するときに発生します。このアクション自体は本質的にセキュリティの脆弱性ではありませんが、アプリケーションがその後保存されたデータを読み取り、安全でない方法で処理する場合、問題が生じます。これにより、攻撃者はストレージメカニズムを利用して、クロスサイトスクリプティングやJavaScriptインジェクションなどの他のDOMベースの攻撃を実行することが可能になります。

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPathインジェクション

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

DOMベースのXPathインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータをXPathクエリに組み込むときに発生します。

Sinks:

document.evaluate()
someDOMElement.evaluate()

クライアントサイドJSONインジェクション

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

DOMベースのJSONインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータをJSONデータ構造として解析され、その後アプリケーションによって処理される文字列に組み込むときに発生します

Sinks:

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

Web-message manipulation

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

Web-messageの脆弱性は、スクリプトが攻撃者が制御可能なデータをウェブメッセージとしてブラウザ内の別のドキュメントに送信するときに発生します。脆弱なWeb-message操作のは、PortSwiggerのWeb Security Academyで見つけることができます。

Sinks:

postMessage()メソッドを使用してウェブメッセージを送信する場合、メッセージを受信するためのイベントリスナーが受信データを安全でない方法で処理すると、脆弱性が発生する可能性があります。

DOM-data manipulation

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

DOMデータ操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをDOM内のフィールドに書き込むときに発生します。これは、可視UIまたはクライアントサイドのロジックで利用されます。この脆弱性は、攻撃者が他のユーザーが訪問した場合に、クライアントサイドのUIの外観や動作を変更するURLを構築するために悪用される可能性があります。

Sinks:

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()

サービス拒否

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

DOMベースのサービス拒否脆弱性は、スクリプトが攻撃者が制御可能なデータを問題のあるプラットフォームAPIに安全でない方法で渡すときに発生します。これには、呼び出されるとユーザーのコンピュータが過剰なCPUまたはディスクスペースを消費する可能性のあるAPIが含まれます。このような脆弱性は、ブラウザがlocalStorageにデータを保存しようとする試みを拒否することによってウェブサイトの機能を制限したり、忙しいスクリプトを終了させたりするなど、重大な副作用を引き起こす可能性があります。

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering
HackTricksをサポートする

Last updated