《白帽子讲 Web 安全》之移动 Web 安全

目录

摘要

一、WebView 简介

二、WebView 对外暴露

WebView 对外暴露的接口风险

三、通用型 XSS - Universal XSS 介绍

四、WebView 跨域访问

五、与本地代码交互 js

5.1接口暴露风险:

5.2漏洞利用:

5.3JavaScript 与 Native 代码通信

六、Chrome 开发者工具可信根证书

七:纵深防御体系构建

7.1. WebView基础加固

7.2. 跨域访问控制矩阵

7.3. 安全交互协议设计

7.4. 证书安全增强

总结


摘要

在移动互联网飞速发展的当下,移动 Web 安全的重要性愈发凸显。《白帽子讲 Web 安全》对移动 Web 安全进行了详细阐述,为我们揭开了这一领域的神秘面纱。

一、WebView 简介

WebView 是移动端(如 Android、iOS)用于嵌入网页的核心,显示网页内容的组件允许开发者在原生应用中嵌入网页,实现混合应用开发,,允许应用内直接加载 Web 内容。其本质是一个轻量级浏览器,但默认安全配置较弱,容易成为攻击入口。

在 Android 系统中,WebView 基于 Chromium 内核,能加载并渲染 HTML、CSS 和 JavaScript 代码。

例如,许多新闻类应用通过 WebView 加载网页形式的新闻详情,电商应用利用 WebView 展示商品介绍页面等。它为开发者提供了便捷的方式,将 Web 技术与原生应用相结合,丰富应用功能和用户体验。

二、WebView 对外暴露

WebView 对外暴露的接口风险

WebView 对外暴露存在诸多安全隐患。由于 WebView 可以执行 JavaScript 代码,若应用对 WebView 的使用缺乏严格管控,恶意代码可能会利用 WebView 的漏洞进行攻击。

JavaScript 接口暴露:开发者可能通过 addJavascriptInterface 方法将本地 Java 对象暴露给 WebView 中的 JavaScript 代码。若未严格过滤输入,攻击者可利用反射机制调用敏感系统 API(如发送短信、读取文件)。

案例

1.某应用通过 WebView 调用 getUserInfo() 接口时,未校验调用来源,导致恶意网页可窃取用户数据。

2.攻击者可能通过构造恶意网页,在 WebView 加载该网页时,利用 JavaScript 代码获取应用内的敏感信息,如用户登录凭证、个人资料等。此外,若 WebView 被配置为允许执行任意来源的 JavaScript,攻击者还可能通过注入恶意脚本,控制 WebView 的行为,进而对整个应用造成损害。

三、通用型 XSS - Universal XSS 介绍

通用型 XSS(UXSS)是一种严重的安全漏洞。它不同于传统的 XSS(跨站脚本攻击),不受限于特定的网站或应用,而是能够在广泛的环境中利用 WebView 的漏洞进行攻击。

2022 年,Android 的 WebView 爆出 UXSS 漏洞,这一漏洞影响范围广泛。攻击者利用该漏洞,可通过精心构造的恶意网页,在用户使用搭载存在漏洞 WebView 的 Android 设备访问时,执行任意 JavaScript 代码。这意味着攻击者能够突破应用的安全边界,获取设备信息、篡改应用数据,甚至可能控制设备,对用户隐私和设备安全构成极大威胁。

防御措施

  • 及时更新 WebView 内核:使用最新 Chromium 内核的 WebView 版本,修复已知漏洞。
  • 禁用危险 API:如限制 eval() 函数、避免动态执行未签名脚本。

四、WebView 跨域访问

关键配置方法                  默认值  作用与风险场景                        
setAllowFileAccess          true  控制是否允许通过 file:// 协议加载本地文件。默认开启,可能泄露应用私有文件。,允许file协议访问本地文件          
setAllowFileAccessFromFileURLsfalse  控制 file:// 域页面能否访问其他 file:// 域内容。建议关闭以减少横向渗透风险。,file域页面访问其他file资源      
setAllowUniversalAccessFromFileURLsfalse控制 file:// 域页面能否访问任意 HTTP/HTTPS 内容。必须关闭以防止跨协议攻击。,file域访问任意http/https资源  
  1. setAllowFileAccess:此属性用于设置 WebView 是否允许访问本地文件。若设置为 true,WebView 可以访问设备本地存储中的文件。然而,这也带来了安全风险,恶意网页可能借此读取用户设备上的敏感文件,如存储在本地的数据库文件、配置文件等。例如,攻击者构造的恶意网页,在 WebView 允许访问本地文件的情况下,可能尝试读取用户的登录密码存储文件(若存在此类不安全存储方式),从而获取用户密码。
  2. setAllowFileAccessFromFileURLs:该属性控制 WebView 是否允许从文件 URL 中访问其他文件。当设置为 true 时,从本地文件 URL 加载的页面可以访问其他本地文件。同样,这可能被攻击者利用,通过在本地文件中嵌入恶意代码,进而访问更多本地文件,扩大攻击范围。
  3. setAllowUniversalAccessFromFileURLs:此属性决定是否允许从文件 URL 中进行跨域访问。若设置为 true,从本地文件 URL 加载的页面不仅可以访问本地其他文件,还可能突破限制访问外部网络资源。这无疑为攻击者提供了更多机会,他们可以通过本地文件漏洞,进一步与外部恶意服务器进行交互,获取更多敏感信息或下载恶意软件到设备上。

五、与本地代码交互 js

WebView 允许 JavaScript 与本地代码进行交互,这为应用开发带来了便利,但也存在安全风险。通过 JavaScript 接口,WebView 可以调用原生应用的功能,如访问摄像头、获取地理位置等。然而,如果接口设计不当或缺乏有效的安全验证,攻击者可能通过 JavaScript 代码调用这些接口,获取用户的隐私信息。

例如:恶意网页中的 JavaScript 代码可能在用户不知情的情况下,调用摄像头拍摄照片或获取地理位置信息,并发送给攻击者。开发者在实现 JavaScript 与本地代码交互时,必须严格验证调用来源,确保接口只能被信任的代码调用。

5.1接口暴露风险

通过addJavascriptInterface绑定Java对象

// 危险示例:暴露系统级API
webView.addJavascriptInterface(new SystemAPI(), "nativeObj");

5.2漏洞利用

反射调用敏感方法

// JS调用执行系统命令
nativeObj.getClass().forName("java.lang.Runtime").getMethod("exec", String.class).invoke("rm -rf /");

5.3JavaScript 与 Native 代码通信

  风险场景:通过 WebView 调用摄像头、定位等硬件功能时,若未对参数进行类型和范围校验,可能引发越权操作。

防御方案: 

  1.    白名单校验:仅允许特定域名或协议调用 Native 接口。
  2. 输入过滤:对 JavaScript 传递的参数进行类型强制转换和内容过滤(如正则表达式匹配)。 

六、Chrome 开发者工具可信根证书

 Chrome 开发者工具可信根证书

  • 作用:开发者工具(如 Chrome DevTools)允许用户导入自定义根证书,用于调试 HTTPS 流量。但若设备被植入恶意根证书,攻击者可解密 HTTPS 通信,实施中间人攻击。
  • 风险案例:恶意应用在用户设备安装伪造根证书,劫持银行应用的 HTTPS 请求。

解析:

Chrome 开发者工具在移动 Web 开发和调试中被广泛使用。在使用 Chrome 开发者工具调试移动设备上的 WebView 时,需要安装可信根证书。这是因为 WebView 在加载网页时,会验证网页的 SSL 证书以确保通信安全。当使用 Chrome 开发者工具进行调试时,工具会充当中间人,对 WebView 与服务器之间的通信进行拦截和分析。为了让 WebView 信任 Chrome 开发者工具的中间人角色,需要安装其提供的可信根证书。然而,这也带来了安全风险,如果恶意软件获取了该可信根证书,就可能伪装成合法的中间人,拦截和篡改 WebView 与服务器之间的通信,窃取用户数据或进行其他恶意操作。因此,在安装和使用 Chrome 开发者工具可信根证书时,必须谨慎操作,确保证书的安全性。

 防御建议

  • 证书锁定(Certificate Pinning):在应用中预置合法证书公钥,仅接受指定证书的通信。
  • 用户教育:提示用户不要随意安装未知来源的

七:纵深防御体系构建

7.1. WebView基础加固

// 安全配置模板
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(false); // 非必要不开启JS
settings.setAllowFileAccess(false);
settings.setAllowContentAccess(false);
settings.setAllowUniversalAccessFromFileURLs(false);

7.2. 跨域访问控制矩阵

业务场景            推荐配置                                  
纯在线应用        关闭所有file协议访问                      
本地文件渲染      开启setAllowFileAccess,禁用其他跨域权限    
混合内容加载      严格白名单控制(setAllowedOriginRules)  

7.3. 安全交互协议设计

  • 接口暴露原则

    • 使用@JavascriptInterface注解限定可调用方法

    • 双向参数校验(示例):

    • @JavascriptInterface
      public void safeMethod(String param) {if(!Pattern.matches("[a-z]+", param)) {throw new SecurityException("非法参数");}// 安全逻辑
      }

7.4. 证书安全增强

  • 证书锁定(Certificate Pinning)

    #kotlin
    val certPinner = CertificatePinner.Builder().add("example.com", "sha256/AAAAAAAA...").build()
    val client = OkHttpClient.Builder().certificatePinner(certPinner).build()
  • 防中间人攻击

    • 禁用开发者工具调试(生产环境)

    • 强制使用CertificateTransparency验证

总结

移动 Web 安全涉及多个方面,WebView 作为移动应用与 Web 内容交互的关键组件,其安全性至关重要。开发者在使用 WebView 时,必须充分了解其特性和潜在风险,采取有效的安全措施,如严格控制 WebView 的对外暴露、合理配置跨域访问权限、加强 JavaScript 与本地代码交互的安全验证以及妥善管理 Chrome 开发者工具可信根证书等,以保障移动应用的安全和用户的隐私。 

喜欢的点点赞和关注,共同进步 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法日常刷题笔记(3)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第三篇笔记 笔记时间为2月24日到3月2日 第一天 设计有序流 设计有序流https://leetcode.cn/problems/design-an-ordered-stream/ 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数&#xff…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码

本文项目编号 T 098 ,文末自助获取源码 \color{red}{T098,文末自助获取源码} T098,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

三数之和_算法

1.题目描述 首先我们分析下这道题目:假设给我们一个数组,让数组某三个不同下标的数相加最终得0,那么我就返回这三个数.但是如果返回的多个数组中的元素相同,那么我们还要删掉其中一个保留一个. 注意:这道题的重点是三个数的下标不能相等并且返回的数组中的元素也不能相等,通过…

关于Deepseek本地部署硬件环境检查教程

要在电脑上本地部署DeepSeek,需要关注以下硬件和软件配置: 硬件配置 CPU:至少4核CPU,推荐Intel i5/i7或AMD Ryzen 5/7系列处理器。内存:至少8GB DDR4内存,推荐16GB DDR4内存,对于大型模型建议…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)

前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会有一个InputAction类型的文件,名字为InputSystem_Ac…

250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置

A. 配置Docker中的代理 绿联NAS简单解决docker无法获取镜像-不用软路由 - 哔哩哔哩 B. 下载官网对应的镜像 群晖NAS用docker搭建SearXNG元搜索引擎_哔哩哔哩_bilibili C. 修改默认省略的参数,只配置Base_URL,删除其它默认的空缺项 searxng-docker/REA…

C++-第十九章:异常

目录 第一节:异常有哪些 第二节:异常相关关键字 2-1.抛出异常 2-2.捕获异常 2-3.异常的捕获规则 2-3-1.异常被最近的catch捕获 2-3-2.catch捕获的是异常的拷贝 2-3-3.异常为子类时,可以用父类引用接收 2-4.捕获任意异常 第三节&#xff1…

Redis详解(实战 + 面试)

目录 Redis 是单线程的!为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源,一块为控制电路和传感器电路供电,另一块单独为电机供电。分开供电这样做的好处,有利于减小干扰,提高系统稳定性。 LM7805是常用的三端稳压器件,顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB AOF。第3章:使用Server自带的redis-cli工具连接。第4章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…

Redis 实战篇 ——《黑马点评》(下)

《引言》 (下)篇将记录 Redis 实战篇 最后的一些学习内容,希望大家能够点赞、收藏支持一下 Thanks♪ (・ω・)ノ,谢谢大家。 传送门(上):Redis 实战篇 ——《黑马…

WordPress二次开发实现用户注册审核功能

WordPress默认直接注册登录了,不需要任何验证,如果被批量注册就麻烦了,所以添加一个审核功能比较好。 注册用户默认需要手动审核,审核以后才能登陆,开启审核,可以有效防止用户批量注册。 这儿讲解一下如何…

基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 实体属性图 系统首页界…

湖仓一体概述

湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…