mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 22:18:27 +00:00
318 lines
26 KiB
Markdown
318 lines
26 KiB
Markdown
# DOM XSS
|
||
|
||
<details>
|
||
|
||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または**最新バージョンのPEASSを入手したり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||
* [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れましょう
|
||
* **[💬](https://emojipedia.org/speech-balloon/) Discordグループ**に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||
* **ハッキングトリックを共有するには、** [**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud) **にPRを提出してください。**
|
||
|
||
</details>
|
||
|
||
## DOMの脆弱性
|
||
|
||
DOMの脆弱性は、攻撃者が制御する**ソース**(`location.search`、`document.referrer`、`document.cookie`など)からのデータが安全でない状態で**シンク**に転送されると発生します。シンクは、悪意のあるデータが与えられると有害なコンテンツを実行またはレンダリングできる関数やオブジェクト(例:`eval()`、`document.body.innerHTML`)です。
|
||
|
||
- **ソース**は、攻撃者によって操作可能な入力であり、URL、クッキー、Webメッセージなどが含まれます。
|
||
- **シンク**は、スクリプトの実行などの有害な効果をもたらす可能性のある危険なエンドポイントです。
|
||
|
||
データが適切な検証やサニタイズなしにソースからシンクに流れると、XSSなどの攻撃が可能になります。
|
||
|
||
{% hint style="info" %}
|
||
**ソースとシンクのより最新のリストは、** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) **で見つけることができます。**
|
||
{% endhint %}
|
||
|
||
**一般的なソース:**
|
||
```javascript
|
||
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
|
||
```
|
||
**一般的なシンク:**
|
||
|
||
| [**オープンリダイレクト**](dom-xss.md#open-redirect) | [**Javascript Injection**](dom-xss.md#javascript-injection) | [**DOMデータ操作**](dom-xss.md#dom-data-manipulation) | **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` | **\`\`**[**ローカルファイルパス操作**](dom-xss.md#local-file-path-manipulation) | `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リクエスト操作**](dom-xss.md#ajax-request-manipulation) | `FileReader.readAsFile()` | `someDOMElement.backgroundImage` | `constructor()` |
|
||
| `XMLHttpRequest.setRequestHeader()` | `FileReader.root.getFile()` | `someDOMElement.cssText` | `init()` |
|
||
| `XMLHttpRequest.open()` | `FileReader.root.getFile()` | `someDOMElement.codebase` | `index()` |
|
||
| `XMLHttpRequest.send()` | [**リンク操作**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
|
||
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
|
||
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**クライアントサイドJSONインジェクション**](dom-xss.md#client-side-sql-injection) |
|
||
| **\`\`**[**HTML5ストレージ操作**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
|
||
| `sessionStorage.setItem()` | [**XPathインジェクション**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` |
|
||
| `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` |
|
||
| **``**[**`サービス拒否`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Cookie操作**](dom-xss.md#cookie-manipulation) |
|
||
| `requestFileSystem()` | **\`\`**[**ドキュメントドメイン操作**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` |
|
||
| `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URLポイズニング**](dom-xss.md#websocket-url-poisoning) |
|
||
| [**クライアントサイドSQLインジェクション**](dom-xss.md#client-side-sql-injection) | [**Webメッセージ操作**](dom-xss.md#web-message-manipulation) | `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/mozilla/eslint-plugin-no-unsanitized)
|
||
|
||
## 例
|
||
|
||
### オープンリダイレクト
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
|
||
|
||
**DOM内のオープンリダイレクト脆弱性**は、スクリプトが、攻撃者が制御できるデータを、異なるドメイン間でのナビゲーションを開始できるシンクに書き込む場合に発生します。
|
||
|
||
リダイレクションが発生するURLの先頭部分を制御できる場合、**`javascript:alert(1)`**などの任意のコードを実行することが可能であることを理解することが重要です。
|
||
|
||
シンク:
|
||
```javascript
|
||
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](https://portswigger.net/web-security/dom-based/cookie-manipulation)
|
||
|
||
DOMベースのクッキー操作の脆弱性は、スクリプトが攻撃者によって制御可能なデータをクッキーの値に組み込む場合に発生します。この脆弱性により、クッキーがサイト内で使用される場合、ウェブページの予期しない動作が発生する可能性があります。さらに、クッキーがユーザーセッションの追跡に関与している場合、セッション固定攻撃を実行するために悪用される可能性があります。この脆弱性に関連する主要なシンクは次のとおりです:
|
||
|
||
シンク:
|
||
```javascript
|
||
document.cookie
|
||
```
|
||
### JavaScript Injection
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection)
|
||
|
||
DOMベースのJavaScriptインジェクション脆弱性は、スクリプトが、攻撃者によって制御される可能性のあるデータをJavaScriptコードとして実行するときに作成されます。
|
||
|
||
Sinks:
|
||
```javascript
|
||
eval()
|
||
Function() constructor
|
||
setTimeout()
|
||
setInterval()
|
||
setImmediate()
|
||
execCommand()
|
||
execScript()
|
||
msSetImmediate()
|
||
range.createContextualFragment()
|
||
crypto.generateCRMFRequest()
|
||
```
|
||
### ドキュメントドメインの操作
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation)
|
||
|
||
**ドキュメントドメインの操作に関する脆弱性** は、スクリプトが攻撃者が制御できるデータを使用して `document.domain` プロパティを設定すると発生します。
|
||
|
||
`document.domain` プロパティは、ブラウザによる **同一オリジンポリシー** の **強制** において **重要な役割** を果たします。異なるオリジンからの2つのページがそれぞれ `document.domain` を **同じ値** に設定すると、制限なしに相互作用できます。ブラウザは `document.domain` に割り当て可能な値に一定の **制限** を課していますが、実際のページのオリジンに完全に関連のない値の割り当てを防ぐための例外が存在します。通常、ブラウザは **子ドメイン** または **親ドメイン** の使用を許可します。
|
||
|
||
シンク:
|
||
```javascript
|
||
document.domain
|
||
```
|
||
### WebSocket-URL poisoning
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](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](https://portswigger.net/web-security/dom-based/link-manipulation)
|
||
|
||
**DOMベースのリンク操作の脆弱性**は、スクリプトが現在のページ内のナビゲーションターゲットに**攻撃者が制御可能なデータを書き込む**場合に発生します。これは、クリッカブルリンクやフォームの送信URLなどです。
|
||
|
||
Sinks:
|
||
```javascript
|
||
someDOMElement.href
|
||
someDOMElement.src
|
||
someDOMElement.action
|
||
```
|
||
### Ajax request manipulation
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
|
||
|
||
**Ajaxリクエストの操作脆弱性**は、スクリプトが`XmlHttpRequest`オブジェクトを使用して発行されるAjaxリクエストに**攻撃者が制御可能なデータを書き込む**場合に発生します。
|
||
|
||
Sinks:
|
||
```javascript
|
||
XMLHttpRequest.setRequestHeader()
|
||
XMLHttpRequest.open()
|
||
XMLHttpRequest.send()
|
||
jQuery.globalEval()
|
||
$.globalEval()
|
||
```
|
||
### ローカルファイルパスの操作
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation)
|
||
|
||
**ローカルファイルパスの操作の脆弱性** は、スクリプトが `filename` パラメータとして **攻撃者が制御可能なデータをファイル処理API** に渡すときに発生します。この脆弱性は、攻撃者がURLを構築して悪意のあるローカルファイルを開いたり書き込んだりする可能性があるため、別のユーザーが訪れると、**ユーザーのブラウザが任意のローカルファイルを開いたり書き込んだりする** 可能性があります。
|
||
|
||
シンク:
|
||
```javascript
|
||
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](https://portswigger.net/web-security/dom-based/client-side-sql-injection)
|
||
|
||
**クライアントサイドSQLインジェクション脆弱性**は、スクリプトが**攻撃者が制御可能なデータを安全でない方法でクライアントサイドSQLクエリに組み込む**場合に発生します。
|
||
|
||
Sinks:
|
||
```javascript
|
||
executeSql()
|
||
```
|
||
### HTML5ストレージの操作
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
|
||
|
||
**HTML5ストレージの操作に関する脆弱性** は、スクリプトが攻撃者が制御可能なデータをWebブラウザのHTML5ストレージ(`localStorage`または`sessionStorage`)に保存するときに発生します。この行動自体がセキュリティ上の脆弱性であるわけではありませんが、アプリケーションがその後その保存されたデータを安全でない方法で処理すると問題が発生します。これにより、攻撃者がストレージメカニズムを利用して、クロスサイトスクリプティングやJavaScriptインジェクションなどの他のDOMベースの攻撃を実行する可能性があります。
|
||
|
||
シンク:
|
||
```javascript
|
||
sessionStorage.setItem()
|
||
localStorage.setItem()
|
||
```
|
||
### XPath injection
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](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:
|
||
```javascript
|
||
document.evaluate()
|
||
someDOMElement.evaluate()
|
||
```
|
||
### クライアントサイドJSONインジェクション
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
|
||
|
||
**DOMベースのJSONインジェクション脆弱性**は、スクリプトが**攻撃者が制御可能なデータを含む文字列をJSONデータ構造として解析し、その後アプリケーションによって処理される**場合に発生します。
|
||
|
||
Sinks:
|
||
```javascript
|
||
JSON.parse()
|
||
jQuery.parseJSON()
|
||
$.parseJSON()
|
||
```
|
||
### Webメッセージの操作
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation)
|
||
|
||
**Webメッセージの脆弱性**は、スクリプトが**攻撃者が制御可能なデータをブラウザ内の別のドキュメントにWebメッセージとして送信する**場合に発生します。脆弱なWebメッセージの操作の**例**は、[PortSwiggerのWebセキュリティアカデミー](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source)で見つけることができます。
|
||
|
||
シンク:
|
||
|
||
`postMessage()`メソッドを使用してWebメッセージを送信すると、メッセージを受信するためのイベントリスナーが受信したデータを安全でない方法で処理すると脆弱性が発生する可能性があります。
|
||
|
||
### DOMデータの操作
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation)
|
||
|
||
**DOMデータの操作の脆弱性**は、スクリプトが**DOM内のフィールドに攻撃者が制御可能なデータを書き込む**場合に発生します。この脆弱性は、攻撃者が別のユーザーが訪れると、クライアントサイドUIの外観や動作を変更できるURLを構築することができます。
|
||
```javascript
|
||
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](https://portswigger.net/web-security/dom-based/denial-of-service)
|
||
|
||
**DOMベースのサービス拒否の脆弱性**は、スクリプトが**攻撃者が制御可能なデータを安全でない方法で問題のあるプラットフォームAPIに渡す**ときに発生します。これには、呼び出されるとユーザーのコンピューターが**過剰なCPUやディスクスペースを消費する可能性があるAPI**が含まれます。このような脆弱性には、ブラウザが`localStorage`にデータを保存しようとする試みを拒否したり、ビジーなスクリプトを終了したりすることで、重大な副作用が発生する可能性があります。
|
||
|
||
シンク:
|
||
```javascript
|
||
requestFileSystem()
|
||
RegExp()
|
||
```
|
||
## Dom Clobbering
|
||
|
||
{% content-ref url="dom-clobbering.md" %}
|
||
[dom-clobbering.md](dom-clobbering.md)
|
||
{% endcontent-ref %}
|
||
|
||
<details>
|
||
|
||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションです。
|
||
* [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れましょう。
|
||
* **💬** [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加**するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||
* **ハッキングテクニックを共有するためにPRを** [**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
|
||
|
||
</details>
|