# XSS (Cross Site Scripting)
/
**Dica de recompensa por bugs**: **inscreva-se** no **Intigriti**, uma plataforma premium de recompensa por bugs criada por hackers, para hackers! Junte-se a nós em [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoje, e comece a ganhar recompensas de até **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## Metodologia
1. Verifique se **qualquer valor que você controla** (_parâmetros_, _caminho_, _cabeçalhos_?, _cookies_?) está sendo **refletido** no HTML ou **usado** pelo código **JS**.
2. **Encontre o contexto** onde está refletido/usado.
3. Se **refletido**
1. Verifique **quais símbolos você pode usar** e, dependendo disso, prepare o payload:
1. Em **HTML puro**:
1. Você pode criar novas tags HTML?
2. Você pode usar eventos ou atributos que suportam o protocolo `javascript:`?
3. Você pode contornar proteções?
4. O conteúdo HTML está sendo interpretado por algum motor JS do lado do cliente (_AngularJS_, _VueJS_, _Mavo_...), você poderia abusar de uma [**Injeção de Template do Lado do Cliente**](../client-side-template-injection-csti.md).
5. Se você não pode criar tags HTML que executam código JS, você poderia abusar de uma [**Marcação Pendente - Injeção sem scripts HTML**](../dangling-markup-html-scriptless-injection/)?
2. Dentro de uma **tag HTML**:
1. Você pode sair para o contexto de HTML puro?
2. Você pode criar novos eventos/atributos para executar código JS?
3. O atributo onde você está preso suporta execução de JS?
4. Você pode contornar proteções?
3. Dentro do código **JavaScript**:
1. Você pode escapar da tag ``** de uma página HTML, dentro de um arquivo `.js` ou dentro de um atributo usando o protocolo **`javascript:`**:
* Se refletido entre as tags **``**, mesmo que sua entrada esteja dentro de qualquer tipo de aspas, você pode tentar injetar `` e escapar deste contexto. Isso funciona porque o **navegador primeiro analisa as tags HTML** e depois o conteúdo, portanto, não perceberá que sua tag `` injetada está dentro do código HTML.
* Se refletido **dentro de uma string JS** e o último truque não está funcionando, você precisará **sair** da string, **executar** seu código e **reconstruir** o código JS (se houver algum erro, ele não será executado:
* `'-alert(1)-'`
* `';-alert(1)//`
* `\';alert(1)//`
* Se refletido dentro de literais de template, você pode **incorporar expressões JS** usando a sintaxe `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
* **Codificação Unicode** funciona para escrever **código javascript válido**:
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
#### Elevação de Javascript
Elevação de Javascript refere-se à oportunidade de **declarar funções, variáveis ou classes depois de serem usadas, para que você possa abusar de cenários onde um XSS está utilizando variáveis ou funções não declaradas.**\
**Confira a seguinte página para mais informações:**
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md)
{% endcontent-ref %}
### Função Javascript
Várias páginas da web têm endpoints que **aceitam como parâmetro o nome da função a ser executada**. Um exemplo comum de se ver na prática é algo como: `?callback=callbackFunc`.
Uma boa maneira de descobrir se algo fornecido diretamente pelo usuário está tentando ser executado é **modificando o valor do parâmetro** (por exemplo, para 'Vulnerable') e procurando no console por erros como:
![](<../../.gitbook/assets/image (651) (2).png>)
Caso esteja vulnerável, você poderia ser capaz de **disparar um alerta** apenas enviando o valor: **`?callback=alert(1)`**. No entanto, é muito comum que esses endpoints **validem o conteúdo** para permitir apenas letras, números, pontos e sublinhados (**`[\w\._]`**).
No entanto, mesmo com essa limitação, ainda é possível realizar algumas ações. Isso porque você pode usar esses caracteres válidos para **acessar qualquer elemento no DOM**:
![](<../../.gitbook/assets/image (662).png>)
Algumas funções úteis para isso:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
Você também pode tentar **acionar funções Javascript** diretamente: `obj.sales.delOrders`.
No entanto, geralmente os endpoints que executam a função indicada são endpoints sem um DOM interessante, **outras páginas na mesma origem** terão um **DOM mais interessante** para realizar mais ações.
Portanto, para **abusar dessa vulnerabilidade em um DOM diferente**, a exploração **Same Origin Method Execution (SOME)** foi desenvolvida:
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
{% endcontent-ref %}
### DOM
Há **código JS** que está usando **inseguramente** alguns **dados controlados por um atacante** como `location.href`. Um atacante poderia abusar disso para executar código JS arbitrário.
{% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md)
{% endcontent-ref %}
### **Universal XSS**
Esse tipo de XSS pode ser encontrado **em qualquer lugar**. Eles não dependem apenas da exploração do cliente de uma aplicação web, mas em **qualquer** **contexto**. Esse tipo de **execução arbitrária de JavaScript** pode até ser abusado para obter **RCE**, **ler** **arquivos arbitrários** em clientes e servidores, e mais.\
Alguns **exemplos**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %}
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %}
## WAF bypass encoding image
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg)
## Injetando dentro do HTML bruto
Quando sua entrada é refletida **dentro da página HTML** ou você pode escapar e injetar código HTML neste contexto, a **primeira** coisa que você precisa fazer é verificar se pode abusar de `<` para criar novas tags: Apenas tente **refletir** esse **caractere** e verifique se ele está sendo **codificado em HTML** ou **deletado** ou se é **refletido sem alterações**. **Apenas no último caso você poderá explorar este caso**.\
Para esses casos também **lembre-se** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Nota: Um comentário HTML pode ser fechado usando**** ****`-->`**** ****ou**** ****`--!>`**_
Neste caso e se nenhum sistema de lista negra/branca estiver sendo usado, você poderia usar payloads como:
```javascript