DOM XSS

Reading time: 16 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

DOM 脆弱性

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

  • ソース は、攻撃者によって操作可能な入力であり、URL、クッキー、ウェブメッセージが含まれます。
  • シンク は、悪意のあるデータが悪影響を及ぼす可能性のある危険なエンドポイントであり、スクリプトの実行などを引き起こす可能性があります。

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

note

最新のソースとシンクのリストは https://github.com/wisec/domxsswiki/wiki で確認できます。

一般的なソース:

javascript
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

一般的なシンク:

オープンリダイレクトJavascriptインジェクションDOMデータ操作jQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``ローカルファイルパス操作someDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Ajaxリクエスト操作FileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()リンク操作someDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLクライアントサイドJSONインジェクション
``HTML5ストレージ操作someDOMElement.actionsomeDOMElement.oneventJSON.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.domainhistory.pushState()WebSocket-URLポイズニング
クライアントサイドSQLインジェクションWebメッセージ操作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)**のような任意のコードを実行することが可能であることを理解することが重要です。

シンク:

javascript
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:

javascript
document.cookie

JavaScript Injection

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

DOMベースのJavaScriptインジェクション脆弱性は、攻撃者が制御できるデータをJavaScriptコードとして実行するスクリプトが実行されるときに作成されます。

Sinks:

javascript
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:

javascript
document.domain

WebSocket-URL ポイズニング

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

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

Sinks:

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

リンク操作

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

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

Sinks:

javascript
someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajaxリクエスト操作

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

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

Sinks:

javascript
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:

javascript
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:

javascript
executeSql()

HTML5-storage manipulation

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

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

Sinks:

javascript
sessionStorage.setItem()
localStorage.setItem()

XPathインジェクション

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

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

Sinks:

javascript
document.evaluate()
someDOMElement.evaluate()

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

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

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

Sinks:

javascript
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またはクライアントサイドのロジックで利用されます。この脆弱性は、攻撃者がURLを構築するために悪用でき、他のユーザーがそのURLを訪れると、クライアントサイドのUIの外観や動作を変更することができます。

Sinks:

javascript
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:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする