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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
DOM 脆弱性
DOM 脆弱性は、攻撃者が制御する ソース(location.search
、document.referrer
、または document.cookie
など)からのデータが安全でない方法で シンク に転送されるときに発生します。シンクは、悪意のあるデータが与えられた場合に有害なコンテンツを実行またはレンダリングできる関数やオブジェクト(例:eval()
、document.body.innerHTML
)です。
- ソース は、攻撃者によって操作可能な入力であり、URL、クッキー、ウェブメッセージが含まれます。
- シンク は、悪意のあるデータが悪影響を及ぼす可能性のある危険なエンドポイントであり、スクリプトの実行などを引き起こす可能性があります。
リスクは、データが適切な検証やサニタイズなしにソースからシンクに流れるときに発生し、XSS のような攻撃を可能にします。
note
最新のソースとシンクのリストは 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
一般的なシンク:
オープンリダイレクト | 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
イベントも発火しません。これは、img
やiframe
のような代替要素を使用する必要があることを意味します。
この種のXSSはおそらく最も見つけにくいものであり、JSコードの内部を調べ、制御できる値を持つオブジェクトを使用しているかどうかを確認し、その場合は任意のJSを実行する方法があるかどうかを確認する必要があります。
それらを見つけるためのツール
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- 潜在的なシンクに到達するすべてのデータをチェックするブラウザ拡張: https://github.com/kevin-mizu/domloggerpp
例
オープンリダイレクト
出典: 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()
Cookie manipulation
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 policy の enforcement において key role を果たします。異なるオリジンからの2つのページが document.domain
を 同じ値 に設定すると、制限なしに相互作用できます。ブラウザは document.domain
に割り当て可能な値に対して特定の limits を課しますが、実際のページオリジンに無関係な値の割り当てを防ぐための例外も存在します。通常、ブラウザは child または parent domains の使用を許可します。
Sinks:
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:
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またはクライアントサイドのロジックで利用されます。この脆弱性は、攻撃者がURLを構築するために悪用でき、他のユーザーがそのURLを訪れると、クライアントサイドのUIの外観や動作を変更することができます。
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
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。