# XSS (Cross Site Scripting)
## Metodologie
1. Kontroleer of **enige waarde wat jy beheer** (_parameters_, _pad_, _koptekste_?, _koekies_?) **reflekteer** in die HTML of **gebruik** word deur **JS** kode.
2. **Vind die konteks** waar dit reflekteer/gebruik word.
3. As dit **reflekteer**
1. Kontroleer **watter simbole jy kan gebruik** en berei die payload voor, afhangende daarvan:
1. In **rauwe HTML**:
1. Kan jy nuwe HTML-tags skep?
2. Kan jy gebeurtenisse of eienskappe gebruik wat die `javascript:` protokol ondersteun?
3. Kan jy beskermings omseil?
4. Word die HTML-inhoud geïnterpreteer deur enige kliënt-kant JS-enjin (_AngularJS_, _VueJS_, _Mavo_...), jy kan 'n [**Kliëntkant Sjabloon Inspuiting**](../client-side-template-injection-csti.md) misbruik.
5. As jy nie HTML-tags kan skep wat JS-kode uitvoer nie, kan jy 'n [**Hangende Markup - HTML scriptless inspuiting**](../dangling-markup-html-scriptless-injection/index.html) misbruik?
2. Binne 'n **HTML-tag**:
1. Kan jy na die rauwe HTML-konteks ontsnap?
2. Kan jy nuwe gebeurtenisse/eienskappe skep om JS-kode uit te voer?
3. Ondersteun die eienskap waar jy vasgevang is JS-uitvoering?
4. Kan jy beskermings omseil?
3. Binne **JavaScript-kode**:
1. Kan jy die ``** etikette van 'n HTML-bladsy, binne 'n `.js`-lêer of binne 'n attribuut wat die **`javascript:`** protokol gebruik:
- As dit weerspieël word tussen **``** etikette, selfs al is jou invoer binne enige soort aanhalings, kan jy probeer om `` in te voeg en uit hierdie konteks te ontsnap. Dit werk omdat die **blaaier eers die HTML-etikette sal ontleed** en dan die inhoud, daarom sal dit nie opgemerk dat jou ingevoegde `` etiket binne die HTML-kode is nie.
- As dit weerspieël word **binne 'n JS-string** en die laaste truuk werk nie, sal jy moet **uitgaan** van die string, **uitvoer** jou kode en **herbou** die JS-kode (as daar enige fout is, sal dit nie uitgevoer word nie):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- As dit weerspieël word binne sjabloon letterlik kan jy **JS-uitdrukkings insluit** met die `${ ... }` sintaksis: `` var greetings = `Hello, ${alert(1)}` ``
- **Unicode-kodering** werk om **geldige javascript kode** te skryf:
```javascript
alert(1)
alert(1)
alert(1)
```
#### Javascript Hoisting
Javascript Hoisting verwys na die geleentheid om **funksies, veranderlikes of klasse te verklaar nadat hulle gebruik is sodat jy scenario's kan misbruik waar 'n XSS onverklaarde veranderlikes of funksies gebruik.**\
**Kyk na die volgende bladsy vir meer inligting:**
{{#ref}}
js-hoisting.md
{{#endref}}
### Javascript Funksie
Verskeie webbladsye het eindpunte wat **die naam van die funksie om uit te voer as parameter aanvaar**. 'n Algemene voorbeeld om in die natuur te sien is iets soos: `?callback=callbackFunc`.
'n Goeie manier om uit te vind of iets wat direk deur die gebruiker gegee is, probeer om uitgevoer te word, is **om die param waarde te wysig** (byvoorbeeld na 'Vulnerable') en in die konsole te kyk vir foute soos:
.png>)
As dit kwesbaar is, kan jy dalk **'n waarskuwing aktiveer** deur net die waarde te stuur: **`?callback=alert(1)`**. Dit is egter baie algemeen dat hierdie eindpunte **die inhoud sal valideer** om slegs letters, syfers, punte en onderstrepings toe te laat (**`[\w\._]`**).
Tog, selfs met daardie beperking is dit steeds moontlik om 'n paar aksies uit te voer. Dit is omdat jy daardie geldige karakters kan gebruik om **enige element in die DOM te benader**:
.png>)
Sommige nuttige funksies hiervoor:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
Jy kan ook probeer om **Javascript funksies** direk te **trigger**: `obj.sales.delOrders`.
E however, gewoonlik is die eindpunte wat die aangeduide funksie uitvoer eindpunte sonder veel interessante DOM, **ander bladsye in die dieselfde oorsprong** sal 'n **meer interessante DOM** hê om meer aksies uit te voer.
Daarom, om hierdie **kwesbaarheid in 'n ander DOM** te **misbruik**, is die **Same Origin Method Execution (SOME)** uitbuiting ontwikkel:
{{#ref}}
some-same-origin-method-execution.md
{{#endref}}
### DOM
Daar is **JS kode** wat **onveilig** gebruik maak van **data wat deur 'n aanvaller beheer word** soos `location.href`. 'n Aanvaller kan dit misbruik om arbitrêre JS kode uit te voer.
{{#ref}}
dom-xss.md
{{#endref}}
### **Universele XSS**
Hierdie soort XSS kan **oral** gevind word. Hulle hang nie net af van die kliënt se uitbuiting van 'n webtoepassing nie, maar op **enige** **konteks**. Hierdie soort **arbitrêre JavaScript uitvoering** kan selfs misbruik word om **RCE** te verkry, **arbitrêre** **lêers** in kliënte en bedieners te **lees**, en meer.\
Sommige **voorbeelde**:
{{#ref}}
server-side-xss-dynamic-pdf.md
{{#endref}}
{{#ref}}
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
{{#endref}}
## WAF omseil kodering beeld
.jpg>)
## Invoeging binne ruwe HTML
Wanneer jou invoer **binne die HTML bladsy** weerspieël word of jy kan ontsnap en HTML kode in hierdie konteks inspuit, is die **eerste** ding wat jy moet doen om te kyk of jy `<` kan misbruik om nuwe etikette te skep: Probeer net om daardie **karakter** te **weerspieël** en kyk of dit **HTML gekodeer** of **verwyder** is of of dit **weerspieël word sonder veranderinge**. **Slegs in die laaste geval sal jy in staat wees om hierdie geval te benut**.\
Vir hierdie gevalle hou ook **in gedagte** [**Kliëntkant Sjabloon Inspuiting**](../client-side-template-injection-csti.md)**.**\
_**Let wel: 'n HTML kommentaar kan gesluit word met\*\*\*\*\*\***\***\*`-->`\*\***\***\*of \*\*\*\*\*\***`--!>`\*\*_
In hierdie geval en as geen swart/whitelisting gebruik word nie, kan jy payloads soos gebruik:
```html