【Android】跨端安全小计

news2024/11/15 23:59:27

前言

在挖移动端的时候,通常会关注跨端方向的问题,因为我们能直接从webview容器去访问native的代码,从客户端角度,从前端能直接深入到客户端,所以跨端这块比较有研究意义。

本文详细介绍android前端到客户端跨端通信的基础知识以及相关漏洞挖掘思路。

基础知识

当我们要了解跨端(这里指前端和客户端跨端)的时候,通常需要掌握一些基础知识,如下:

1. 跨端

在移动端前端和客户端的跨端开发,通常是指使用一种技术或框架,同时在移动应用的前端和客户端开发中进行应用。这种跨端技术通常使用 Web 技术(如 HTML、CSS 和 JavaScript)来开发应用程序,然后通过 WebView 或类似的技术来集成到原生应用中。

在这种跨端开发中,前端开发者可以使用熟悉的 Web 技术来开发应用程序,而不需要学习和使用原生开发语言和工具。同时,客户端开发者可以使用原生开发语言和工具来集成前端开发的应用程序。

2. 常见的移动端前端和客户端的跨端技术

1. React Native:React Native 可以使用 Web 技术来开发应用程序,并通过 JavaScript Bridge 技术来与原生应用进行交互,从而实现跨端开发。

2. Flutter:Flutter 可以使用 Web 技术来开发应用程序,并通过 Flutter Engine 技术来与原生应用进行交互,从而实现跨端开发。

3. WebView:WebView 是一种原生控件,可以在原生应用中嵌入 Web 应用程序。前端开发者可以使用 Web 技术来开发应用程序,然后通过 WebView 技术来集成到原生应用中。

4. Hybrid:Hybrid 是一种结合了原生和 Web 技术的跨端开发模式,可以使用 Web 技术来开发应用程序,并使用原生技术来实现底层功能。

3.1 React Native - ReactContextBaseJavaModule

攻击者视角,我更关心前端如何调用客户端。

在 React Native 中,Native Modules 用于将原生功能封装成 JavaScript 可以调用的函数或方法。

在原生代码中,创建一个 Native Module,通过该模块可以调用客户端代码。例如,在 Android 平台上可以创建一个 Java 类,实现 ReactContextBaseJavaModule 接口,并在该类中定义一个可以被 JavaScript 调用的函数。示例代码如下

public class MyNativeModule extends ReactContextBaseJavaModule {
    private Context mContext;

    public MyNativeModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mContext = reactContext;
    }

    @Override
    public String getName() {
        return "MyNativeModule";
    }

    @ReactMethod
    public void showSessionID() {
        Toast.makeText(mContext, getCookie(), Toast.LENGTH_SHORT).show();
    }
}

3.2 React Native - ReactApplication

继承ReactApplication并重写getPackages函数就可以将我们3.1新建的module注册进来。

import com.example.MyNativeModule;

...

public class MainApplication extends Application implements ReactApplication {
    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.asList(
                new MainReactPackage(),
                new MyNativeModule()
            );
        }
    };
}

3.3 React Native - 前端调用

前端就能直接通过事件触发nativemodule的showSessionID方法了。

import React from 'react';
import { TouchableOpacity, Text, NativeModules } from 'react-native';

const MyButton = () => {
  const onPress = () => {
    NativeModules.MyNativeModule.showSessionID();
  };

  return (
    <TouchableOpacity onPress={onPress}>
      <Text>Click me</Text>
    </TouchableOpacity>
  );
};

export default MyButton;

所以如果存在远程动态加载一些前端代码,或者存储类或者其他安全问题能够控制前端代码,那我们就能进一步调用注册进来的客户端代码,例如上述的sessionid。

4.1 webview -     @JavascriptInterface

新建一个javascript接口

class MyNativeInterface {
    @JavascriptInterface
    public void showCookie() {
        Toast.makeText(mContext, getcookie(), Toast.LENGTH_SHORT).show();
    }
}

4.2 webview -     addJavascriptInterface

把接口注册进webview容器

 

import android.webkit.WebView;
import android.webkit.WebViewClient;

...

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = findViewById(R.id.webView);
        mWebView.setWebViewClient(new MyWebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new MyNativeInterface(), "MyNativeInterface");
    }
}

4.3 webview - 前端调用

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>WebView Example</title>
</head>
<body>
  <button onclick="window.MyNativeInterface.showcookie()">Click me</button>
</body>
</html>

webview的攻击比较丝滑,因为只要打开一个webview容器就可以有机会攻击注册进来的跨端接口。扫一扫、Deeplink、IM、搜索等等。

5. Hybrid

Hybrid 应用程序比普通的 WebView 应用程序更加复杂,需要在客户端代码中实现一些原生功能,例如调用系统 API、访问本地数据库等,一种开发模式,它结合了 Web 技术和原生技术,用于开发跨平台应用程序。但是实现原理就是webview。所以参考4.1~4.3即可。

6. Flutter

实现原理和React Native类似,继承MethodCallHandler定义channel并写入跨端方法->setMethodCallHandler注册channel到Flutter->前端调用跨端方法。

public class MyChannel implements MethodCallHandler {
    private static final String CHANNEL_NAME = "com.example.my_channel";

    private Context mContext;

    private MyChannel(Context context) {
        mContext = context;
    }

    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL_NAME);
        channel.setMethodCallHandler(new MyChannel(registrar.context()));
    }

    @Override
    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
        if (call.method.equals("showToast")) {
            String message = call.argument("message");
            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
            result.success(true);
        } else {
            result.notImplemented();
        }
    }
}


--------

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL_NAME = "com.example.my_channel";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME)
                .setMethodCallHandler(new MyChannel(this));
    }
}


-----------
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = const MethodChannel('com.example.my_channel');

  void _showToast() async {
    try {
      await platform.invokeMethod('showToast', {'message': 'Hello, world!'});
    } on PlatformException catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Click me'),
            onPressed: _showToast,
          ),
        ),
      ),
    );
  }
}

实战演练

我们通过逆向APK,搜索webview容器是否注入了跨端方法,全局搜索@JavascriptInterface

然后找到的跨端方法分析出调用参数的结构,并筛选出所有敏感的方法,然后构造前端调用点,触发客户端代码即可。

例如 poc

<script>window.xxxx.yyyy(aaa,bbb);

 

后话

不同的应用厂商在跨端上面可能都会选择不同的解决方案,或者自己开发一些跨端框架,这时候可能需要逆向看代码逻辑才能往下走。另外跨端的调用往往也不是一帆风顺,开发者会增加各种限制,例如权限限制,访问域名限制等等,这个也需要进一步的绕过思路,这个还要慢慢发散思路和学习。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用pytorch进行BERT文本分类

BERT 是一个强大的语言模型&#xff0c;至少有两个原因&#xff1a; 它使用从 BooksCorpus &#xff08;有 8 亿字&#xff09;和 Wikipedia&#xff08;有 25 亿字&#xff09;中提取的未标记数据进行预训练。顾名思义&#xff0c;它是通过利用编码器堆栈的双向特性进行预训练…

集合专题----set篇

1、Set 接口和常用方法 &#xff08;1&#xff09;Set 接口基本介绍 ① 无序&#xff08;添加和去除的顺序不一致&#xff09;&#xff0c;没有索引&#xff1b; ② 不允许重复元素&#xff0c;所以最多包含一个null&#xff1b; &#xff08;2&#xff09;Set 接口的常用方…

自动驾驶开源数据集(附下载链接)

自动驾驶是带动新兴产业的一个突破点&#xff0c;也是中国结合新能源汽车&#xff0c;实现汽车产业弯道超车的不二手段&#xff0c;是打破国外燃油车技术壁垒的关键一步&#xff01;它不会停止&#xff0c;只是在蓄势待发&#xff01; 数据集介绍&#xff1a;点击 自动驾驶场…

java进阶—通俗易懂线程池的概念(底层原理)及使用

前言 首先&#xff0c;我们知道创建一个线程 可以直接 使用 new Thread(() ->{}).start();这种形式来创建&#xff0c;当线程的run 方法执行结束&#xff0c;线程就终止了&#xff0c;线程对象就会被垃圾回收机制&#xff08;GC&#xff09;释放 然而在我们 开发工作中&…

智安网络|攻防演练对抗:网络边界自动化防御的关键

在当今高度互联的数字世界中&#xff0c;网络安全的重要性日益凸显。为了应对不断增长的网络威胁&#xff0c;组织和企业需要采取主动的防御策略&#xff0c;其中攻防演练对抗和自动化防御在保护网络边界方面扮演着重要的角色。本文将探讨攻防演练对抗的意义&#xff0c;并介绍…

四、用户管理

云尚办公系统&#xff1a;用户管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&#x…

ImportError: numpy.core.multiarray failed to import

遇到的问题&#xff1a; 解决方法&#xff1a; 根据你的opencv版本&#xff0c;去百度搜索对应的 numpy 版本&#xff0c;卸载掉现有的numpy &#xff0c;安装其他版本: sudo pip install numpy1.19.0或者直接升级到numpy的最新版本&#xff1a; sudo pip install --upgrade…

小程序-真机上接口无法调通,开发者工具上可以

近期在对接小程序&#xff0c;在这里记录一下&#xff0c;我们在对接小程序的时候碰到的一些奇奇怪怪的问题。 其中一个问题如下&#xff1a; 真实效果如下图 开发者工具上可以&#xff0c;访问没有人任何问题。 真机上接口无法调通&#xff0c;也没有报错&#xff0c;也没有…

idea中git的使用详细说明

一.克隆项目 1. 打开File>New>Project from Version Control... 2. 打开gitLab&#xff0c;复制项目地址 3. 粘贴到第1步中的URL中&#xff0c;点击“Clone” 二.代码提交 1. 修改文件后需要提交时&#xff0c;可以在git-Local Changes中看到你修改的文件及修改内容 2. 选…

netty学习(1):多个客户端与服务器通信

1. 基于前面一节netty学习&#xff08;1&#xff09;:1个客户端与服务器通信 只需要把服务器的handler改造一下即可&#xff0c;通过ChannelGroup 找到所有的客户端channel&#xff0c;发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

MS1826 HDMI 多功能视频处理器 4*4矩阵切换器

基本介绍 MS1826 是一款多功能视频处理器&#xff0c;包含 4 路独立 HDMI 音视频输入通道、4 路独立 HDMI 音视频输出通道以及四路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字 库定制型 OSD&#xff1b;可处理隔行和逐行视频或者图形输入信号&#xff…

Spring Boot 中的 @ComponentScan 注解是什么,原理,如何使用

Spring Boot 中的 ComponentScan 注解是什么&#xff0c;原理&#xff0c;如何使用 在 Spring Boot 中&#xff0c;ComponentScan 是一种注解&#xff0c;它可以让 Spring 自动扫描指定的包及其子包中的组件&#xff0c;并将这些组件自动装配到 Spring 容器中。本文将介绍 Com…

UML14种图

UML14种图 UML是Unified Modeling Language的缩写&#xff0c;译为统一建模语言。 UML是软件行业的建模规范&#xff0c;可以对软件项目建立需求模型、设计模型、实现模型、测试模型。 UML2.0包含的14种图&#xff1a; UML各种图例&#xff08;常用图形&#xff09; 1. 类图&…

状态机编程实例-状态表法

上篇文章&#xff0c;使用嵌套switch-case法的状态机编程&#xff0c;实现了一个炸弹拆除小游戏。 本篇&#xff0c;继续介绍状态机编程的第二种方法&#xff1a;状态表法&#xff0c;来实现炸弹拆除小游戏的状态机编程。 1 状态表法 状态表法&#xff0c;顾名思义&#xff0…

YOLOv8的目标对象的分类,分割,跟踪和姿态估计的多任务检测实践(Netron模型可视化)

YOLOv8是目前最新版本&#xff0c;在以前YOLO版本基础上建立并加入了一些新的功能&#xff0c;以进一步提高性能和灵活性&#xff0c;是目前最先进的模型。YOLOv8旨在快速&#xff0c;准确&#xff0c;易于使用&#xff0c;使其成为广泛的目标检测和跟踪&#xff0c;实例分割&a…

MATLAB 之 Simulink 操作基础和系统仿真模型的建立

这里写目录标题 一、Simulink 操作基础1. Simulink 的启动与退出1.1 Simulink 的启动1.2 模型文件的打开1.3 Simulink 的退出 2. Simulink 仿真初步2.1 模型元素2.2 仿真步骤2.3 简单实例 二、系统仿真模型的建立1. Simulink 的基本模块2. 模块操作2.1 添加与删除模块2.2 选取模…

快速训练自己的大语言模型:基于LLAMA-7B的lora指令微调

目录 1. 选用工程&#xff1a;lit-llama2. 下载工程3. 安装环境4. 下载LLAMA-7B模型5. 做模型转换6. 初步测试7. 为什么要进行指令微调&#xff1f;8. 开始进行指令微调8.1. 数据准备8.2 开始模型训练8.3 模型测试 前言&#xff1a; 系统&#xff1a;ubuntu 18.04显卡&#xff…

大数据ETL工具对比(Sqoop, DataX, Kettle)

前言 在实习过程中&#xff0c;遇到了数据库迁移项目&#xff0c;对于数据仓库&#xff0c;大数据集成类应用&#xff0c;通常会采用ETL工具辅助完成&#xff0c;公司和客户使用的比较多的是Sqoop, DataX和Kettle这三种工具。简单的对这三种ETL工具进行一次梳理。 ETL工具&…

无法更新iPhone,提示“无法检查更新”怎么办?

当我们需要 iPhone更新系统时&#xff0c;可以前往iPhone设置-通用-软件更新中获取更新推送。不过一些用户可能会遇到无法更新的问题&#xff0c;例如会提示“无法检查更新&#xff0c;检查软件更新时出错”。 以上情况可能是网络问题&#xff0c;可以尝试重新打开设置&#xf…

vue2实现公式规则编辑校验弹窗功能

文章目录 需求描述技术栈最终效果演示功能实现逻辑拆分代码目录结构实现思路光标实现底部单个符号或字段结构设计监听键盘事件&处理光标公式规则校验 总结 需求描述 需要一个弹窗&#xff0c;弹窗内部需要能够进行公式规则的配置并进行公式规则合法性校验。 技术栈 vue2e…