hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
2023-07-07 23:42:27 +00:00

27 KiB
Raw Blame History

DOM XSS

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

DOMの脆弱性

ソース

ソースは、潜在的に攻撃者が制御可能なデータを受け入れるJavaScriptプロパティです。ソースの例としては、location.searchプロパティがあります。これは、攻撃者が比較的簡単に制御できるクエリ文字列からの入力を読み取ります。基本的に、攻撃者が制御できるプロパティはすべて潜在的なソースです。これには、参照URLdocument.referrer文字列によって公開される)、ユーザーのクッキー(document.cookie文字列によって公開される、およびWebメッセージが含まれます。

シンク

シンクは、攻撃者が制御可能なデータが渡されると、望ましくない効果を引き起こす可能性のあるJavaScript関数またはDOMオブジェクトです。たとえば、eval()関数はシンクです。なぜなら、それに渡される引数をJavaScriptとして処理するからです。HTMLのシンクの例としては、document.body.innerHTMLがあります。これは、攻撃者が悪意のあるHTMLを注入し、任意のJavaScriptを実行する可能性があります。

基本的に、DOMベースの脆弱性は、ウェブサイトがデータをソースからシンクに渡し、それがクライアントのセッションの文脈で安全でない方法でデータを処理するときに発生します。

{% 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インジェクション 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インジェクション 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操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをCookieの値に書き込むときに発生します。
これは、ページが予期しない方法で動作するようにするために悪用されることがありますCookieがWebで使用される場合またはセッション固定攻撃を実行するために使用されることがありますCookieがユーザーのセッションを追跡するために使用される場合

シンクス

document.cookie

JavaScriptのインジェクション

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

方法

DOMベースのJavaScriptインジェクションの脆弱性は、スクリプトが攻撃者が制御可能なデータをJavaScriptとして実行するときに発生します。

シンクス

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

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

元記事: https://portswigger.net/web-security/dom-based/document-domain-manipulation

方法

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

document.domain プロパティは、ブラウザが同一オリジンポリシー強制に使用します。もし異なるオリジン2つのページが明示的に同じ document.domain の値を設定した場合、それらの2つのページは制限なく相互作用することができます。
ブラウザは一般的にdocument.domainに割り当てることができる値に制限を設けており、ページの実際のオリジンとは異なる値の使用を防止する場合があります。しかし、これは常に発生するわけではなく、通常は子ドメインまたは親ドメインの使用を許可します。

シンクス

document.domain

WebSocket-URLの毒化

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

方法

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

シンクス

WebSocketコンストラクタは、WebSocket-URLの毒化の脆弱性につながる可能性があります。

リンク操作

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

方法

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

シンクス

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajaxリクエストの操作

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

方法

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

シンクス

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クエリに組み込む場合に発生します。

シンクス

executeSql()

HTML5ストレージの操作

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

方法

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

シンクス

sessionStorage.setItem()
localStorage.setItem()

XPathインジェクション

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

方法

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

シンクス

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メッセージとして送信する場合に発生します。
https://portswigger.net/web-security/dom-based/controlling-the-web-message-sourceにおける脆弱なWebメッセージの操作の

シンクス

Webメッセージを送信するためのpostMessage()メソッドは、メッセージを受信するイベントリスナーが受信したデータを安全でない方法で処理する場合に脆弱性を引き起こす可能性があります。

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 🎥