DOM XSS

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

DOMの脆弱性

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

  • ソースは、攻撃者によって操作可能な入力であり、URL、クッキー、Webメッセージなどが含まれます。

  • シンクは、スクリプトの実行などの有害な効果をもたらす可能性のある危険なエンドポイントです。

データが適切な検証やサニタイズなしにソースからシンクに流れると、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を実行する方法があるかどうかを見る必要があります。

これらを見つけるためのツール

オープンリダイレクト

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

シンク:

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

ドキュメントドメインの操作

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

ドキュメントドメインの操作に関する脆弱性 は、スクリプトが攻撃者が制御できるデータを使用して document.domain プロパティを設定すると発生します。

document.domain プロパティは、ブラウザによる 同一オリジンポリシー強制 において 重要な役割 を果たします。異なるオリジンからの2つのページがそれぞれ document.domain同じ値 に設定すると、制限なしに相互作用できます。ブラウザは document.domain に割り当て可能な値に一定の 制限 を課していますが、実際のページのオリジンに完全に関連のない値の割り当てを防ぐための例外が存在します。通常、ブラウザは 子ドメイン または 親ドメイン の使用を許可します。

シンク:

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ポイズニングの脆弱性につながる可能性があります。

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

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

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax request manipulation

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

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

シンク:

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ストレージの操作

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

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

シンク:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

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

DOM-based XPath-injection vulnerabilities occur when a script incorporates attacker-controllable data into an XPath query.

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メッセージの操作

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

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

シンク:

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

DOMデータの操作

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

DOMデータの操作の脆弱性は、スクリプトがDOM内のフィールドに攻撃者が制御可能なデータを書き込む場合に発生します。この脆弱性は、攻撃者が別のユーザーが訪れると、クライアントサイド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()

サービス拒否

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

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

シンク:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)

Last updated