DOM XSS
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
DOM 脆弱性は、攻撃者が制御する ソース(location.search
、document.referrer
、または document.cookie
など)からのデータが安全でない方法で シンク に転送されるときに発生します。シンクは、悪意のあるデータが与えられた場合に有害なコンテンツを実行またはレンダリングできる関数やオブジェクト(例:eval()
、document.body.innerHTML
)です。
ソース は、攻撃者によって操作可能な入力であり、URL、クッキー、ウェブメッセージを含みます。
シンク は、悪意のあるデータが悪影響を及ぼす可能性のある危険なエンドポイントであり、スクリプトの実行などを引き起こす可能性があります。
リスクは、データが適切な検証やサニタイズなしにソースからシンクに流れるときに発生し、XSS のような攻撃を可能にします。
より最新のソースとシンクのリストは https://github.com/wisec/domxsswiki/wiki で見つけることができます。
一般的なソース:
一般的なシンク:
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()
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()
XMLHttpRequest.setRequestHeader()
FileReader.root.getFile()
someDOMElement.cssText
init()
XMLHttpRequest.open()
FileReader.root.getFile()
someDOMElement.codebase
index()
jQuery.globalEval()
someDOMElement.href
someDOMElement.outerHTML
$.parseHTML()
localStorage.setItem()
document.evaluate()
document.writeln()
$.parseJSON()
executeSql()
postMessage()
``
``
innerHTML
シンクは、現代のブラウザでは script
要素を受け入れず、svg onload
イベントも発火しません。これは、img
や iframe
のような代替要素を使用する必要があることを意味します。
この種のXSSはおそらく最も見つけにくいものであり、JSコードの内部を調べ、制御できる値を持つオブジェクトを使用しているかどうかを確認し、その場合は任意のJSを実行するために悪用する方法があるかどうかを確認する必要があります。
潜在的なシンクに到達するすべてのデータをチェックするブラウザ拡張: https://github.com/kevin-mizu/domloggerpp
出典: https://portswigger.net/web-security/dom-based/open-redirection
DOMにおけるオープンリダイレクトの脆弱性は、スクリプトが攻撃者が制御できるデータを、ドメイン間のナビゲーションを開始できるシンクに書き込むときに発生します。
リダイレクトが発生するURLの開始部分を制御できる場合、javascript:alert(1)
のような任意のコードを実行することが可能であることを理解することが重要です。
シンク:
From: https://portswigger.net/web-security/dom-based/cookie-manipulation
DOMベースのクッキー操作の脆弱性は、スクリプトが攻撃者によって制御可能なデータをクッキーの値に組み込むときに発生します。この脆弱性は、クッキーがサイト内で利用される場合、ウェブページの予期しない動作を引き起こす可能性があります。さらに、クッキーがユーザーセッションの追跡に関与している場合、セッション固定攻撃を実行するために悪用される可能性があります。この脆弱性に関連する主なシンクは次のとおりです:
Sinks:
From: https://portswigger.net/web-security/dom-based/javascript-injection
DOMベースのJavaScriptインジェクション脆弱性は、攻撃者が制御できるデータをJavaScriptコードとして実行するスクリプトが実行されるときに作成されます。
Sinks:
From: https://portswigger.net/web-security/dom-based/document-domain-manipulation
Document-domain manipulation vulnerabilities は、スクリプトが攻撃者が制御できるデータを使用して document.domain
プロパティを設定する場合に発生します。
document.domain
プロパティは、ブラウザによる same-origin policy の enforcement において 重要な役割 を果たします。異なるオリジンからの2つのページが document.domain
を 同じ値 に設定すると、制限なしに相互作用できます。ブラウザは document.domain
に割り当て可能な値に対して特定の 制限 を課しますが、実際のページオリジンに完全に無関係な値の割り当てを防ぐための例外も存在します。通常、ブラウザは child または parent domains の使用を許可します。
Sinks:
From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
WebSocket-URL poisoning は、スクリプトが 制御可能なデータをWebSocket接続のターゲットURLとして利用する 場合に発生します。
Sinks:
WebSocket
コンストラクタは、WebSocket-URL poisoning 脆弱性を引き起こす可能性があります。
From: https://portswigger.net/web-security/dom-based/link-manipulation
DOMベースのリンク操作脆弱性 は、スクリプトが 攻撃者が制御可能なデータを現在のページ内のナビゲーションターゲットに書き込む 場合に発生します。例えば、クリック可能なリンクやフォームの送信URLなどです。
Sinks:
From: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ajaxリクエスト操作の脆弱性は、スクリプトがXmlHttpRequest
オブジェクトを使用して発行されるAjaxリクエストに攻撃者が制御可能なデータを書き込むときに発生します。
Sinks:
From: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
ローカルファイルパス操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをファイル処理APIにfilename
パラメータとして渡すときに発生します。この脆弱性は、攻撃者が他のユーザーが訪れた場合にユーザーのブラウザが任意のローカルファイルを開いたり書き込んだりするURLを構築するために悪用される可能性があります。
Sinks:
From: https://portswigger.net/web-security/dom-based/client-side-sql-injection
クライアントサイドSQLインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータを安全でない方法でクライアントサイドSQLクエリに組み込むときに発生します。
Sinks:
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
HTML5ストレージ操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをウェブブラウザのHTML5ストレージ(localStorage
またはsessionStorage
)に保存するときに発生します。このアクション自体は本質的にセキュリティの脆弱性ではありませんが、アプリケーションがその後保存されたデータを読み取り、安全でない方法で処理する場合、問題が生じます。これにより、攻撃者はストレージメカニズムを利用して、クロスサイトスクリプティングやJavaScriptインジェクションなどの他のDOMベースの攻撃を実行することが可能になります。
Sinks:
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
DOMベースのXPathインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータをXPathクエリに組み込むときに発生します。
Sinks:
From: https://portswigger.net/web-security/dom-based/client-side-json-injection
DOMベースのJSONインジェクション脆弱性は、スクリプトが攻撃者が制御可能なデータをJSONデータ構造として解析され、その後アプリケーションによって処理される文字列に組み込むときに発生します。
Sinks:
From: https://portswigger.net/web-security/dom-based/web-message-manipulation
Web-messageの脆弱性は、スクリプトが攻撃者が制御可能なデータをウェブメッセージとしてブラウザ内の別のドキュメントに送信するときに発生します。脆弱なWeb-message操作の例は、PortSwiggerのWeb Security Academyで見つけることができます。
Sinks:
postMessage()
メソッドを使用してウェブメッセージを送信する場合、メッセージを受信するためのイベントリスナーが受信データを安全でない方法で処理すると、脆弱性が発生する可能性があります。
From: https://portswigger.net/web-security/dom-based/dom-data-manipulation
DOMデータ操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをDOM内のフィールドに書き込むときに発生します。これは、可視UIまたはクライアントサイドのロジックで利用されます。この脆弱性は、攻撃者が他のユーザーが訪問した場合に、クライアントサイドのUIの外観や動作を変更するURLを構築するために悪用される可能性があります。
Sinks:
From: https://portswigger.net/web-security/dom-based/denial-of-service
DOMベースのサービス拒否脆弱性は、スクリプトが攻撃者が制御可能なデータを問題のあるプラットフォームAPIに安全でない方法で渡すときに発生します。これには、呼び出されるとユーザーのコンピュータが過剰なCPUまたはディスクスペースを消費する可能性のあるAPIが含まれます。このような脆弱性は、ブラウザがlocalStorage
にデータを保存しようとする試みを拒否することによってウェブサイトの機能を制限したり、忙しいスクリプトを終了させたりするなど、重大な副作用を引き起こす可能性があります。
Sinks:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)