跳过内容

MASTG-TEST-0078: 确定原生方法是否通过 WebView 暴露

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

请通过提交 PR 来帮助我们:MASTG v1->v2 MASTG-TEST-0078:确定是否通过 WebViews 暴露了 Native 方法 (ios)

发送反馈

概述

静态分析

测试 UIWebView JavaScript 到 Native 的桥接

搜索将 native 对象映射到与 WebView 关联的 JSContext 的代码,并分析它暴露的功能,例如,不应访问敏感数据并将其暴露给 WebViews。

在 Objective-C 中,与 UIWebView 关联的 JSContext 如下获取

[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]

测试 WKWebView JavaScript 到 Native 的桥接

通过搜索 WKScriptMessageHandler 并检查所有暴露的方法,验证是否存在 JavaScript 到 native 的桥接。然后验证方法的调用方式。

以下来自 "Where's My Browser?" 的示例演示了这一点。

首先,我们看到如何启用 JavaScript 桥

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")
    }
}

添加名称为 "name"(或上述示例中的 "javaScriptBridge")的脚本消息处理程序会导致 JavaScript 函数 window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage 在使用用户内容控制器的所有 web 视图的所有帧中定义。然后,它可以像这样从 HTML 文件中使用

function invokeNativeOperation() {
    value1 = document.getElementById("value1").value
    value2 = document.getElementById("value2").value
    window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
}

被调用的函数位于 JavaScriptBridgeMessageHandler.swift

class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {

//...

case "multiplyNumbers":

        let arg1 = Double(messageArray[1])!
        let arg2 = Double(messageArray[2])!
        result = String(arg1 * arg2)
//...

let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)

这里的问题是 JavaScriptBridgeMessageHandler 不仅包含该函数,还暴露了一个敏感函数

case "getSecret":
        result = "XSRSOGKC342"

动态分析

此时,您肯定已经识别出 iOS 应用程序中所有潜在有趣的 WebView,并获得了潜在攻击面的概述(通过静态分析、我们在前面章节中看到的动态分析技术或它们的组合)。这包括 HTML 和 JavaScript 文件,UIWebViewJSContext / JSExportWKWebViewWKScriptMessageHandler 的使用,以及哪些函数被暴露并存在于 WebView 中。

进一步的动态分析可以帮助您利用这些函数并获取它们可能暴露的敏感数据。正如我们在静态分析中看到的那样,在前一个例子中,通过执行逆向工程来获取秘密值是微不足道的(秘密值在源代码中以纯文本形式找到),但想象一下暴露的函数从安全存储中检索秘密。在这种情况下,只有动态分析和利用才有帮助。

利用这些函数的过程首先是生成一个 JavaScript 负载,并将其注入到应用程序请求的文件中。注入可以通过多种技术完成,例如

  • 如果某些内容通过 HTTP 从 Internet 以不安全的方式加载(混合内容),您可以尝试实施 MITM 攻击。
  • 您可以始终执行动态检测,并通过使用像 Frida 这样的框架和 iOS WebViews 可用的相应 JavaScript 评估函数来注入 JavaScript 负载(stringByEvaluatingJavaScriptFromString: 用于 UIWebViewevaluateJavaScript:completionHandler: 用于 WKWebView)。

为了从 "Where's My Browser?" 应用程序的前一个例子中获取秘密,您可以使用其中一种技术来注入以下负载,该负载将通过将其写入 WebView 的 "result" 字段来揭示秘密

function javascriptBridgeCallBack(name, value) {
    document.getElementById("result").innerHTML=value;
};
window.webkit.messageHandlers.javaScriptBridge.postMessage(["getSecret"]);

当然,您也可以使用它提供的 Exploitation Helper

请参阅 [#thiel2] 第 156 页的另一个关于易受攻击的 iOS 应用程序和暴露给 WebView 的函数的示例。