Webview Attacks

Reading time: 7 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

Guide on WebView Configurations and Security

Overview of WebView Vulnerabilities

Android विकास का एक महत्वपूर्ण पहलू WebViews का सही प्रबंधन करना है। यह गाइड WebView उपयोग से संबंधित जोखिमों को कम करने के लिए प्रमुख कॉन्फ़िगरेशन और सुरक्षा प्रथाओं को उजागर करता है।

WebView Example

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("<url here>")

Ofc, एक संभावित हमलावर को कभी भी URL को नियंत्रित करने में सक्षम नहीं होना चाहिए जिसे एक एप्लिकेशन लोड करने जा रहा है।

JavaScript और Intent Scheme हैंडलिंग

  • JavaScript: WebViews में डिफ़ॉल्ट रूप से अक्षम होता है, इसे setJavaScriptEnabled() के माध्यम से सक्षम किया जा सकता है। सावधानी बरती जानी चाहिए क्योंकि उचित सुरक्षा उपायों के बिना JavaScript को सक्षम करने से सुरक्षा कमजोरियाँ उत्पन्न हो सकती हैं।
  • Intent Scheme: WebViews intent स्कीम को संभाल सकते हैं, यदि सावधानी से प्रबंधित नहीं किया गया तो यह शोषण की संभावना पैदा कर सकता है। एक उदाहरण की कमजोरी में एक एक्सपोज़्ड WebView पैरामीटर "support_url" शामिल था जिसे क्रॉस-साइट स्क्रिप्टिंग (XSS) हमलों को निष्पादित करने के लिए शोषित किया जा सकता था।

Vulnerable WebView

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
<script>
alert(javascriptBridge.getSecret())
</script>
  • जोखिमों को कम करने के लिए, 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)

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें