<summary><strong>AWS hackleme becerilerinizi sıfırdan ileri seviyeye taşıyın</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile</strong>!</summary>
* **Şirketinizi HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
JavaScript dilinde, **Hoisting** olarak bilinen bir mekanizma, değişkenlerin, fonksiyonların, sınıfların veya importların bildirimlerinin, kodun çalıştırılmadan önce kapsamlarının en üstüne kavramsal olarak yükseltildiği şekilde tanımlanır. Bu işlem, JavaScript motoru tarafından otomatik olarak gerçekleştirilir ve motor, betiği birden fazla geçişte tarar.
İlk geçiş sırasında, motor, sözdizimi hatalarını kontrol etmek ve betiği soyut sözdizim ağacına dönüştürmek için kodu ayrıştırır. Bu aşama, hoisting'i içeren bir süreç olan bildirimleri yürütme bağlamının en üstüne taşır. Ayrıştırma aşaması, sözdizimi hataları olmadığını gösteren başarılı bir şekilde tamamlandığında, betik yürütmesi devam eder.
1.**Değer Hoisting**: Bir değişkenin değerinin, bildirim satırından önceki kapsamında kullanılmasını sağlar.
2.**Bildirim Hoisting**: Bir değişkenin bildiriminden önceki kapsamında başvurulmasına izin verir ve `ReferenceError` hatası oluşturmadan, değişkenin değeri `undefined` olur.
3. Bu tür, değişkenin gerçek bildirim satırından önceki bildirimi nedeniyle kapsam içindeki davranışı değiştirir.
4. Bildirimin yan etkileri, içeren kodun geri kalanının değerlendirilmeden önce gerçekleşir.
Ayrıntılı olarak, fonksiyon bildirimleri 1. tür hoisting davranışını sergiler. `var` anahtar kelimesi 2. tür davranışı gösterir. `let`, `const` ve `class` içeren leksikal bildirimler 3. tür davranışı gösterir. Son olarak, `import` ifadeleri, hem 1. tür hem de 4. tür davranışlarla hoisted olarak benzersizdir.
Bu nedenle, **tanımlanmamış bir nesnenin kullanıldıktan sonra JS kodu enjekte edebileceğiniz senaryolarda**, bunu **bildirerek** (böylece kodunuz hata fırlatmak yerine yürütülür):
In addition to the scenarios mentioned earlier, there are a few more scenarios where JavaScript hoisting can be exploited for XSS attacks. Let's take a look at them:
### 1. Function Declarations
When a function is declared using the `function` keyword, it is hoisted to the top of its scope. This means that even if the function is defined after it is called, it can still be executed without any errors. Attackers can take advantage of this behavior to execute malicious code.
```javascript
<script>
foo(); // This will execute the function even though it is defined later
function foo() {
alert('XSS');
}
</script>
```
### 2. Variable Declarations
Similarly, variable declarations using the `var` keyword are also hoisted to the top of their scope. This allows attackers to use variables before they are actually declared.
```javascript
<script>
alert(x); // This will display 'undefined' as the variable is hoisted but not assigned a value yet
var x = 'XSS';
</script>
```
### 3. Object Declarations
When an object is declared using the `var` keyword, the variable is hoisted but the object itself is not. However, the properties of the object can still be accessed before the object is declared.
```javascript
<script>
alert(obj.property); // This will display 'undefined' as the object is not hoisted
Unlike function declarations, function expressions are not hoisted. Therefore, if a function expression is used before it is defined, an error will occur.
foo(); // This will throw an error as the function expression is not hoisted
var foo = function() {
alert('XSS');
};
</script>
```
By understanding these additional scenarios, you can further exploit JavaScript hoisting for XSS attacks. Remember to always validate and sanitize user input to prevent such vulnerabilities.
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşmek için</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>'ı öğrenin!</strong></summary>
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.