iOS WebViews
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The code of this page was extracted from here. Check the page for further details.
WebViews का उपयोग अनुप्रयोगों के भीतर इंटरैक्टिव रूप से वेब सामग्री प्रदर्शित करने के लिए किया जाता है। विभिन्न प्रकार के WebViews iOS अनुप्रयोगों के लिए विभिन्न कार्यात्मकताओं और सुरक्षा सुविधाओं की पेशकश करते हैं। यहाँ एक संक्षिप्त अवलोकन है:
UIWebView, जिसे iOS 12 से आगे अनुशंसित नहीं किया गया है क्योंकि यह JavaScript को निष्क्रिय करने के लिए समर्थन की कमी के कारण स्क्रिप्ट इंजेक्शन और Cross-Site Scripting (XSS) हमलों के प्रति संवेदनशील है।
WKWebView ऐप्स में वेब सामग्री को शामिल करने के लिए पसंदीदा विकल्प है, जो सामग्री और सुरक्षा सुविधाओं पर बेहतर नियंत्रण प्रदान करता है। JavaScript डिफ़ॉल्ट रूप से सक्षम है, लेकिन यदि आवश्यक हो तो इसे निष्क्रिय किया जा सकता है। यह स्वचालित रूप से विंडो खोलने से JavaScript को रोकने के लिए सुविधाओं का समर्थन करता है और सुनिश्चित करता है कि सभी सामग्री सुरक्षित रूप से लोड हो। इसके अतिरिक्त, WKWebView की वास्तुकला मुख्य ऐप प्रक्रिया को प्रभावित करने वाले मेमोरी भ्रष्टाचार के जोखिम को कम करती है।
SFSafariViewController ऐप्स के भीतर एक मानकीकृत वेब ब्राउज़िंग अनुभव प्रदान करता है, जिसे एक पढ़ने योग्य पता फ़ील्ड, साझा करने और नेविगेशन बटन, और सामग्री को सफारी में खोलने के लिए एक सीधा लिंक सहित इसके विशिष्ट लेआउट द्वारा पहचाना जा सकता है। WKWebView के विपरीत, SFSafariViewController में JavaScript को निष्क्रिय नहीं किया जा सकता है, जो सफारी के साथ कुकीज़ और डेटा साझा करता है, ऐप से उपयोगकर्ता की गोपनीयता बनाए रखता है। इसे ऐप स्टोर दिशानिर्देशों के अनुसार प्रमुखता से प्रदर्शित किया जाना चाहिए।
WebViews कॉन्फ़िगरेशन की जांच करते समय, दो मुख्य प्रकारों पर ध्यान केंद्रित किया जाता है: UIWebView और WKWebView। इन WebViews को बाइनरी के भीतर पहचानने के लिए, विशेष वर्ग संदर्भों और प्रारंभिककरण विधियों की खोज करते हुए आदेशों का उपयोग किया जाता है।
UIWebView Identification
यह कमांड बाइनरी में इसके संबंधित टेक्स्ट स्ट्रिंग्स को खोजकर UIWebView के उदाहरणों को खोजने में मदद करता है।
WKWebView पहचान
इसी तरह, WKWebView के लिए, यह कमांड बाइनरी में उसके उपयोग के संकेतक टेक्स्ट स्ट्रिंग्स के लिए खोजता है।
इसके अलावा, यह जानने के लिए कि WKWebView कैसे प्रारंभ किया जाता है, निम्नलिखित कमांड निष्पादित किया जाता है, जो इसके प्रारंभिककरण से संबंधित विधि हस्ताक्षर को लक्षित करता है:
WKWebView के लिए, यह बताया गया है कि जब तक आवश्यक न हो, JavaScript को बंद करना एक सर्वोत्तम प्रथा है। यह सुनिश्चित करने के लिए कि JavaScript बंद है, संकलित बाइनरी की खोज की जाती है कि javaScriptEnabled
प्रॉपर्टी false
पर सेट है:
WKWebView मिश्रित सामग्री समस्याओं की पहचान करने की क्षमता प्रदान करता है, जो UIWebView के विपरीत है। यह hasOnlySecureContent
प्रॉपर्टी का उपयोग करके जांचा जाता है ताकि यह सुनिश्चित किया जा सके कि सभी पृष्ठ संसाधन सुरक्षित कनेक्शनों के माध्यम से लोड किए गए हैं। संकलित बाइनरी में खोज इस प्रकार की जाती है:
डायनामिक विश्लेषण में WebView उदाहरणों और उनकी विशेषताओं के लिए हीप का निरीक्षण करना शामिल है। इस उद्देश्य के लिए webviews_inspector.js
नामक एक स्क्रिप्ट का उपयोग किया जाता है, जो UIWebView
, WKWebView
, और SFSafariViewController
उदाहरणों को लक्षित करती है। यह पाए गए उदाहरणों के बारे में जानकारी लॉग करती है, जिसमें URLs और JavaScript और सुरक्षित सामग्री से संबंधित सेटिंग्स शामिल हैं।
हीप निरीक्षण ObjC.choose()
का उपयोग करके WebView उदाहरणों की पहचान करने और javaScriptEnabled
और hasonlysecurecontent
विशेषताओं की जांच करने के लिए किया जा सकता है।
स्क्रिप्ट को इस तरह निष्पादित किया जाता है:
मुख्य परिणाम:
WebViews के उदाहरण सफलतापूर्वक पाए और निरीक्षण किए गए।
JavaScript सक्षम करने और सुरक्षित सामग्री सेटिंग्स की पुष्टि की गई।
यह सारांश स्थिर और गतिशील दृष्टिकोणों के माध्यम से WebView कॉन्फ़िगरेशन का विश्लेषण करने में शामिल महत्वपूर्ण चरणों और आदेशों को संक्षेप में प्रस्तुत करता है, जो JavaScript सक्षम करने और मिश्रित सामग्री पहचान जैसी सुरक्षा सुविधाओं पर केंद्रित है।
WebViews में सामग्री को संभालना एक महत्वपूर्ण पहलू है, विशेष रूप से विभिन्न प्रोटोकॉल जैसे http(s)://
, file://
, और tel://
के साथ काम करते समय। ये प्रोटोकॉल ऐप्स के भीतर दूरस्थ और स्थानीय सामग्री को लोड करने की अनुमति देते हैं। यह जोर दिया गया है कि जब स्थानीय सामग्री लोड की जा रही हो, तो उपयोगकर्ताओं को फ़ाइल के नाम या पथ को प्रभावित करने और सामग्री को संपादित करने से रोकने के लिए सावधानियाँ बरतनी चाहिए।
WebViews सामग्री लोड करने के लिए विभिन्न विधियाँ प्रदान करते हैं। UIWebView, जो अब अप्रचलित है, के लिए loadHTMLString:baseURL:
और loadData:MIMEType:textEncodingName:baseURL:
जैसी विधियों का उपयोग किया जाता है। WKWebView, दूसरी ओर, वेब सामग्री के लिए loadHTMLString:baseURL:
, loadData:MIMEType:textEncodingName:baseURL:
, और loadRequest:
का उपयोग करता है। स्थानीय फ़ाइलों को लोड करने के लिए आमतौर पर pathForResource:ofType:
, URLForResource:withExtension:
, और init(contentsOf:encoding:)
जैसी विधियों का उपयोग किया जाता है। विधि loadFileURL:allowingReadAccessToURL:
विशेष रूप से उल्लेखनीय है क्योंकि यह WebView में एक विशिष्ट URL या निर्देशिका को लोड करने की क्षमता रखती है, यदि एक निर्देशिका निर्दिष्ट की जाती है तो संवेदनशील डेटा को उजागर कर सकती है।
इन विधियों को स्रोत कोड या संकलित बाइनरी में खोजने के लिए, निम्नलिखित जैसे आदेशों का उपयोग किया जा सकता है:
Regarding file access, UIWebView इसे सार्वभौमिक रूप से अनुमति देता है, जबकि WKWebView allowFileAccessFromFileURLs
और allowUniversalAccessFromFileURLs
सेटिंग्स को फ़ाइल URL से पहुँच प्रबंधित करने के लिए पेश करता है, जिनमें से दोनों डिफ़ॉल्ट रूप से गलत हैं।
एक Frida स्क्रिप्ट उदाहरण प्रदान किया गया है ताकि WKWebView कॉन्फ़िगरेशन को सुरक्षा सेटिंग्स के लिए निरीक्षण किया जा सके:
अंत में, स्थानीय फ़ाइलों को निकालने के लिए लक्षित एक JavaScript पेलोड का उदाहरण गलत तरीके से कॉन्फ़िगर किए गए WebViews से संबंधित संभावित सुरक्षा जोखिम को दर्शाता है। यह पेलोड फ़ाइल की सामग्री को सर्वर पर भेजने से पहले हेक्स प्रारूप में एन्कोड करता है, जो WebView कार्यान्वयन में कठोर सुरक्षा उपायों के महत्व को उजागर करता है।
iOS 7 से, Apple ने WebView में JavaScript और नेटिव Swift या Objective-C ऑब्जेक्ट्स के बीच संचार के लिए APIs प्रदान की। यह एकीकरण मुख्य रूप से दो तरीकों के माध्यम से किया जाता है:
JSContext: जब एक Swift या Objective-C ब्लॉक को JSContext
के भीतर एक पहचानकर्ता से जोड़ा जाता है, तो एक JavaScript फ़ंक्शन स्वचालित रूप से बनाया जाता है। यह JavaScript और नेटिव कोड के बीच निर्बाध एकीकरण और संचार की अनुमति देता है।
JSExport Protocol: JSExport
प्रोटोकॉल को विरासत में लेकर, नेटिव प्रॉपर्टीज, इंस्टेंस मेथड्स, और क्लास मेथड्स को JavaScript के लिए उजागर किया जा सकता है। इसका मतलब है कि JavaScript वातावरण में किए गए किसी भी परिवर्तन को नेटिव वातावरण में दर्शाया जाता है, और इसके विपरीत। हालाँकि, यह सुनिश्चित करना आवश्यक है कि संवेदनशील डेटा इस विधि के माध्यम से अनजाने में उजागर न हो।
JSContext
in Objective-CObjective-C में, UIWebView
के लिए JSContext
को निम्नलिखित कोड की पंक्ति के साथ प्राप्त किया जा सकता है:
WKWebView
WKWebView
के लिए, JSContext
तक सीधी पहुँच उपलब्ध नहीं है। इसके बजाय, संदेश पासिंग postMessage
फ़ंक्शन के माध्यम से उपयोग की जाती है, जो जावास्क्रिप्ट को मूल संचार की अनुमति देती है। इन संदेशों के लिए हैंडलर इस प्रकार सेट किए जाते हैं, जो जावास्क्रिप्ट को सुरक्षित रूप से मूल एप्लिकेशन के साथ इंटरैक्ट करने की अनुमति देते हैं:
JavaScript एक स्क्रिप्ट संदेश हैंडलर को परिभाषित करके मूल स्तर के साथ इंटरैक्ट कर सकता है। यह एक वेबपेज से मूल कार्यों को कॉल करने जैसी क्रियाओं की अनुमति देता है:
native फ़ंक्शन कॉल के परिणाम को कैप्चर और मैनिपुलेट करने के लिए, कोई HTML के भीतर कॉलबैक फ़ंक्शन को ओवरराइड कर सकता है:
नैटिव साइड JavaScriptBridgeMessageHandler
क्लास में दिखाए अनुसार JavaScript कॉल को संभालता है, जहाँ संख्याओं को गुणा करने जैसी ऑपरेशनों का परिणाम प्रोसेस किया जाता है और इसे JavaScript में डिस्प्ले या आगे की मैनिपुलेशन के लिए भेजा जाता है:
(Tutorial based on the one from https://blog.vuplex.com/debugging-webviews)
iOS वेबव्यू में वेब सामग्री को प्रभावी ढंग से डिबग करने के लिए, सफारी के डेवलपर टूल्स की एक विशिष्ट सेटअप की आवश्यकता होती है क्योंकि console.log()
को भेजे गए संदेश Xcode लॉग में प्रदर्शित नहीं होते हैं। यहाँ एक सरल गाइड है, जो प्रमुख चरणों और आवश्यकताओं पर जोर देती है:
iOS डिवाइस पर तैयारी: आपके iOS डिवाइस पर सफारी वेब इंस्पेक्टर को सक्रिय करना आवश्यक है। यह सेटिंग्स > सफारी > उन्नत में जाकर और वेब इंस्पेक्टर को सक्षम करके किया जाता है।
macOS डिवाइस पर तैयारी: आपके macOS विकास मशीन पर, आपको सफारी में डेवलपर टूल्स को सक्षम करना होगा। सफारी लॉन्च करें, सफारी > प्राथमिकताएँ > उन्नत पर जाएँ, और डेवलप मेनू दिखाएँ विकल्प का चयन करें।
कनेक्शन और डिबगिंग: अपने iOS डिवाइस को अपने macOS कंप्यूटर से कनेक्ट करने और अपने एप्लिकेशन को लॉन्च करने के बाद, अपने macOS डिवाइस पर सफारी का उपयोग करके उस वेबव्यू का चयन करें जिसे आप डिबग करना चाहते हैं। सफारी के मेनू बार में डेवलप पर जाएँ, अपने iOS डिवाइस के नाम पर होवर करें ताकि वेबव्यू उदाहरणों की सूची दिखाई दे, और उस उदाहरण का चयन करें जिसे आप निरीक्षण करना चाहते हैं। इस उद्देश्य के लिए एक नया सफारी वेब इंस्पेक्टर विंडो खुलेगा।
हालांकि, सीमाओं का ध्यान रखें:
इस विधि के साथ डिबगिंग के लिए एक macOS डिवाइस की आवश्यकता होती है क्योंकि यह सफारी पर निर्भर करता है।
केवल उन एप्लिकेशनों में वेबव्यू डिबगिंग के लिए योग्य हैं जो Xcode के माध्यम से आपके डिवाइस पर लोड की गई हैं। ऐप स्टोर या एप्पल कॉन्फ़िगरेटर के माध्यम से स्थापित ऐप्स में वेबव्यू को इस तरीके से डिबग नहीं किया जा सकता।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)