27 KiB
DOM XSS
☁️ 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 に提出してください。
DOMの脆弱性
ソース
ソースは、潜在的に攻撃者が制御可能なデータを受け入れるJavaScriptプロパティです。ソースの例としては、
location.search
プロパティがあります。これは、攻撃者が比較的簡単に制御できるクエリ文字列からの入力を読み取ります。基本的に、攻撃者が制御できるプロパティはすべて潜在的なソースです。これには、参照URL(document.referrer
文字列によって公開される)、ユーザーのクッキー(document.cookie
文字列によって公開される)、およびWebメッセージが含まれます。
シンク
シンクは、攻撃者が制御可能なデータが渡されると、望ましくない効果を引き起こす可能性のあるJavaScript関数またはDOMオブジェクトです。たとえば、
eval()
関数はシンクです。なぜなら、それに渡される引数をJavaScriptとして処理するからです。HTMLのシンクの例としては、document.body.innerHTML
があります。これは、攻撃者が悪意のあるHTMLを注入し、任意のJavaScriptを実行する可能性があります。
基本的に、DOMベースの脆弱性は、ウェブサイトがデータをソースからシンクに渡し、それがクライアントのセッションの文脈で安全でない方法でデータを処理するときに発生します。
{% 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インジェクション | 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を実行する方法があるかどうかを確認する必要があります。
これらを見つけるためのツール
例
オープンリダイレクト
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(Cookieの操作)
From: https://portswigger.net/web-security/dom-based/cookie-manipulation
方法
DOMベースのCookie操作の脆弱性は、スクリプトが攻撃者が制御可能なデータをCookieの値に書き込むときに発生します。
これは、ページが予期しない方法で動作するようにするために悪用されることがあります(CookieがWebで使用される場合)またはセッション固定攻撃を実行するために使用されることがあります(Cookieがユーザーのセッションを追跡するために使用される場合)。
シンクス
document.cookie
JavaScriptのインジェクション
From: https://portswigger.net/web-security/dom-based/javascript-injection
方法
DOMベースのJavaScriptインジェクションの脆弱性は、スクリプトが攻撃者が制御可能なデータをJavaScriptとして実行するときに発生します。
シンクス
eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()
ドキュメントドメインの操作
元記事: https://portswigger.net/web-security/dom-based/document-domain-manipulation
方法
ドキュメントドメインの操作の脆弱性は、スクリプトが攻撃者が制御可能なデータを使用して document.domain
プロパティを設定する場合に発生します。
document.domain
プロパティは、ブラウザが同一オリジンポリシーの強制に使用します。もし異なるオリジンの2つのページが明示的に同じ document.domain
の値を設定した場合、それらの2つのページは制限なく相互作用することができます。
ブラウザは一般的にdocument.domain
に割り当てることができる値に制限を設けており、ページの実際のオリジンとは異なる値の使用を防止する場合があります。しかし、これは常に発生するわけではなく、通常は子ドメインまたは親ドメインの使用を許可します。
シンクス
document.domain
WebSocket-URLの毒化
From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
方法
WebSocket-URLの毒化は、スクリプトがWebSocket接続のターゲットURLとして制御可能なデータを使用する場合に発生します。
シンクス
WebSocket
コンストラクタは、WebSocket-URLの毒化の脆弱性につながる可能性があります。
リンク操作
From: https://portswigger.net/web-security/dom-based/link-manipulation
方法
DOMベースのリンク操作の脆弱性は、スクリプトが現在のページ内のナビゲーションターゲット(クリック可能なリンクやフォームの送信URLなど)に攻撃者が制御可能なデータを書き込む場合に発生します。
シンクス
someDOMElement.href
someDOMElement.src
someDOMElement.action
Ajaxリクエストの操作
From: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
方法
Ajaxリクエストの操作の脆弱性は、スクリプトがXmlHttpRequest
オブジェクトを使用して発行されるAjaxリクエストに攻撃者が制御可能なデータを書き込む場合に発生します。
シンクス
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クエリに組み込む場合に発生します。
シンクス
executeSql()
HTML5ストレージの操作
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
方法
HTML5ストレージの操作の脆弱性は、スクリプトがウェブブラウザのHTML5ストレージ(localStorage
またはsessionStorage
)に攻撃者が制御可能なデータを保存する場合に発生します。
この動作自体はセキュリティ上の脆弱性ではありません。ただし、アプリケーションが後でストレージからデータを読み取り、安全でない方法で処理する場合、攻撃者はストレージメカニズムを利用して、クロスサイトスクリプティングやJavaScriptインジェクションなどの他のDOMベースの攻撃を実行することができます。
シンクス
sessionStorage.setItem()
localStorage.setItem()
XPathインジェクション
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
方法
DOMベースのXPathインジェクションの脆弱性は、スクリプトが攻撃者が制御可能なデータをXPathクエリに組み込む場合に発生します。
シンクス
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メッセージとして送信する場合に発生します。
https://portswigger.net/web-security/dom-based/controlling-the-web-message-sourceにおける脆弱なWebメッセージの操作の例
シンクス
Webメッセージを送信するためのpostMessage()
メソッドは、メッセージを受信するイベントリスナーが受信したデータを安全でない方法で処理する場合に脆弱性を引き起こす可能性があります。
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の最新バージョンを入手したいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。これは、私たちの独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。