26 KiB
DOM XSS
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または最新バージョンのPEASSを入手したり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見し、独占的なNFTsコレクションをご覧ください
- 公式PEASS&HackTricksスウェグを手に入れましょう
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitterで私をフォローする🐦@carlospolopm。
- ハッキングトリックを共有するには、 hacktricksリポジトリ と hacktricks-cloudリポジトリ に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ベースのクッキー操作の脆弱性は、スクリプトが攻撃者によって制御可能なデータをクッキーの値に組み込む場合に発生します。この脆弱性により、クッキーがサイト内で使用される場合、ウェブページの予期しない動作が発生する可能性があります。さらに、クッキーがユーザーセッションの追跡に関与している場合、セッション固定攻撃を実行するために悪用される可能性があります。この脆弱性に関連する主要なシンクは次のとおりです:
シンク:
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は、スクリプトがWebSocket接続のターゲットURLとして制御可能なデータを使用する場合に発生します。
Sinks:
WebSocket
コンストラクタは、WebSocket-URLポイズニングの脆弱性につながる可能性があります。
Link manipulation
From: https://portswigger.net/web-security/dom-based/link-manipulation
DOMベースのリンク操作の脆弱性は、スクリプトが現在のページ内のナビゲーションターゲットに攻撃者が制御可能なデータを書き込む場合に発生します。これは、クリッカブルリンクやフォームの送信URLなどです。
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
)に保存するときに発生します。この行動自体がセキュリティ上の脆弱性であるわけではありませんが、アプリケーションがその後その保存されたデータを安全でない方法で処理すると問題が発生します。これにより、攻撃者がストレージメカニズムを利用して、クロスサイトスクリプティングやJavaScriptインジェクションなどの他のDOMベースの攻撃を実行する可能性があります。
シンク:
sessionStorage.setItem()
localStorage.setItem()
XPath injection
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
DOM-based XPath-injection vulnerabilities occur when a script incorporates attacker-controllable data into an XPath query.
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メッセージの操作
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 %}
AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)!
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?またはPEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTsコレクションです。
- 公式PEASS&HackTricksスウェグを手に入れましょう。
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitterで私をフォローする🐦@carlospolopm。
- ハッキングテクニックを共有するためにPRを hacktricksリポジトリ と hacktricks-cloudリポジトリ に提出してください。