26 KiB
DOM XSS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?またはPEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つけてください
- 公式PEASS&HackTricks swagを手に入れましょう
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm.**
- ハッキングトリックを共有するために hacktricks repo と hacktricks-cloud repo にPRを提出してください。
DOMの脆弱性
DOMの脆弱性は、攻撃者が制御するソース(location.search
、document.referrer
、document.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
イベントも発火しません。これは、img
や iframe
のような代替要素を使用する必要があることを意味します。
この種の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()
Cookie manipulation
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.
Link manipulation
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 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたいですか?または、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう、私たちの独占的なNFTコレクション**
- 公式PEASS&HackTricks swagを手に入れましょう
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitterで私をフォローする🐦@carlospolopm.
- ハッキングトリックを共有するために、PRをhacktricks repo とhacktricks-cloud repo に提出してください。