hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md

26 KiB
Raw Blame History

DOM XSS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

DOMの脆弱性

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

  • ソースは、攻撃者によって操作可能な入力であり、URL、クッキー、Webメッセージなどが含まれます。
  • シンクは、悪意のあるデータが有害な効果(スクリプトの実行など)をもたらす可能性のある危険なエンドポイントです。

データが適切な検証やサニタイズなしにソースからシンクに流れると、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

一般的なシンク:

オープンリダイレクト Javascript Injection 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 ``Cookie操作
requestFileSystem() ``ドキュメントドメイン操作 document.implementation.createHTMLDocument() document.cookie
RegExp() document.domain history.pushState() WebSocket-URLポイズニング
クライアントサイドSQLインジェクション Webメッセージ操作 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ベースのCookie操作の脆弱性は、スクリプトが攻撃者によって制御可能なデータをクッキーの値に組み込む場合に発生します。この脆弱性により、クッキーがサイト内で使用される場合、ウェブページの予期しない動作が発生する可能性があります。さらに、クッキーがユーザーセッションを追跡するために使用される場合、セッション固定攻撃を実行するために悪用される可能性があります。この脆弱性に関連する主要なシンクは次のとおりです

シンク:

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 occurs when a script utilizes controllable data as the target URL for a WebSocket connection.

Sinks:

The WebSocket constructor can lead to WebSocket-URL poisoning vulnerabilities.

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

DOM-based link-manipulation vulnerabilities arise when a script writes attacker-controllable data to a navigation target within the current page, such as a clickable link or the submission URL of a form.

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に保存するときに発生します。この行動自体がセキュリティ上の脆弱性であるわけではありませんが、アプリケーションがその後その保存されたデータを安全でない方法で処理すると問題が発生します。これにより、攻撃者がストレージメカニズムを利用して他のDOMベースの攻撃、例えばクロスサイトスクリプティングやJavaScriptインジェクションを実行する可能性があります。

シンク:

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データ構造として解析し、その後アプリケーションによって処理される場合に発生します。

シンク:

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

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥