iOS URL Schemes与漏洞的碰撞组合

前言

iOS URL Schemes,这个单词对于大多数人来说可能有些陌生,但是类似下面这张图的提示大部分人应该都经常看见:

今天要探究的就是:了解iOS URL Schemes、如何发现iOS URL Schemes、iOS URL Schemes结合漏洞案例。

iOS URL Schemes

基本概念

抛开iOS从URL Schemes的字面意思理解,就是地址协议(Scheme一般用来表示协议,比如 http、https、ftp 等),我们所熟知的HTTP协议的URL格式就是:

http(s)://user:pass@host:port/path?query

举个例子:http://gh0st.cn/,在浏览器输入这个地址,浏览器是使用HTTP协议向 gh0st.cn 请求,请求的资源就是 / 。

再来看一下iOS URL Schemes的一个例子:weixin://,你在Safari浏览器(Mobile)输入这个网址就会提示你在"微信"中打开链接吗?,然后由你选择"取消"或"打开";和HTTP协议格式的URL访问流程进行对比,iOS URL Schemes 实际上就是启动一个应用的 URL,其访问流程是这样的:

浏览器输入"weixin://" -> iOS识别URL Schemes ->询问是否跳转到微信 -> 确认跳转 -> 从浏览器跳转到微信端

那么问题就来了,以上所述流程中的"iOS识别URL Schemes",iOS如何识别这段URL Schemes?iOS官方要求的是APP开发者需要自己定义自己APP的"URL Schemes",只有APP本身定义(支持)了URL Schemes,iOS才会去识别然后跳转。

定义

一个完整的 URL Schemes 应该分为 Scheme、Action、Parameter、Value 这 4 个部分,中间用冒号 :、斜线 /、问号 ?、等号 = 相连接。

举个例子:mst://jump?url=https://gh0st.cn/&title=test,它对应的4部分就是如下所示:

Scheme(头): mst、Action(动作): jump、Parameter(参数): url、title、Value(值): https://gh0st.cn、test

不同的部分之间有符号相连,它们也有一定的规则(和URL部分规则是一样的):

  • 冒号::在链接头和命令之间;

  • 双斜杠 //:在链接头和命令之间,有时会是三斜杠 ///
  • 问号 ?:在命令和参数之间;
  • 等号 =:在参数和值之间;
  • 和符号 &:在一组参数和另一组参数之间。

理解

以上述所举的例子:mst://jump?url=https://gh0st.cn/&title=test,来简单的说明下这段URL Scheme所产生的效果:

1.跳转到"mst"所对应的APP

2.在APP中执行jump动作(跳转网站)

3.告诉APPjump动作所需的urltitle参数,对应的值分别为https://gh0st.cn/test

可以理解为在APP应用中访问https://gh0st.cn/,网页标题为test

寻找iOS APP的URL Schemes

当你学会了如何寻找APP的URL Schemes,你就算发现了半个漏洞。

获取IPA包

基本的URL Schemes可以在iOS APP中的Info.plist文件中寻找到,而一般你是无法获取到APP的ipa包的,所以需要借助软件获取到这个包。

前提是你需要这两台设备:MacBook、iPhone,如果你只拥有一台iPhone的话也有办法去获取(需要Thor APP,具体方法自行寻找)。

Mac上先安装Apple Configurator 2,然后你需要在该软件中登录你的Apple账户:

使用iPhone充电线将手机连接Mac,这时候软件中就会显示已经连接Mac的设备:

假设你需要获取微信的URL Schemes,那么你的手机已经安装过了微信,然后使用该软件进行添加,选中设备点击添加按钮,选择应用:

搜索微信,选中添加:

当你下载完成看见如下提示的时候,在Finder中按快捷键Command+Shift+G,输入~/资源库/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

软件下载的微信ipa文件就存在该文件夹中:

进入文件夹将ipa文件复制到其他地方:

然后回到Apple Configurator 2的提示,点击停止即可。

获取基本URL Schemes

将IPA包后缀名修改为ZIP,然后解压,进入Payload目录会看见一个.APP后缀名文件,选中文件右击显示包内容:

找到Info.plist文件并打开,搜索关键词URLSchemes

String标签所包含的就是微信的URL Schemes:

<string>wexinVideoAPI</string>
<string>weixin</string>
<string>weixinapp</string>
<string>fb290293790992170</string>
<string>wechat</string>
<string>QQ41C152CF</string>
<string>prefs</string>

寻找完整URL Schemes

如上已经了解了如何获取最基本的URL Schemes,但是这远远不够,因为完整的URL Schemes有4部分,而目前只找到了第一部分,仅仅能做到的功能就是启动,而想找到更多的非基本URL Schemes需要其他的方法。有很多方法在这里不一一例举了,只例几个常见的思路供你参考。

从手机站点页面获取

一般网站都会有这些子域名:m\h5\mobile...

打开这些子域名,利用Chrome的开发者工具(F12)切换为手机模式视图,这样就能模拟手机去访问了:

那在这里可以在该页面的HTML代码中寻找URL Schemes(前提是你已经知道了基本的URL Schemes)

在这里我从页面的JavaScript代码中发现了很多URL Schemes:

有些还有参数,可以根据命名来猜这些URL Schemes的含义,例如path: "mst://jump/core/web/jump",就可以知道这个是做Web跳转的,那跳转到哪个地址是什么参数控制呢?下面也有对应的告诉我们是url参数去控制,也就组成了这样一个URL Scheme: mst://jump/core/web/jump?url=https://gh0st.cn

QRLCode解析地址获取

现在很多网站都支持二维码登录,就比如如下这个网站:

保存该二维码进行二维码解析:

解析得出这是一个URL Scheme,修改json参数url的值为我的网站尝试在浏览器中打开成功的触发了跳转APP,并且在APP中访问了我的网站。

逆向APP

不仅是iOS,安卓也支持URL Schemes,而一般的定义是一样的,所以你可以基于获取基本URL Schemes这个步骤将.APP文件的后缀去掉,这时候这个文件就变成了一个文件夹拖到Sublime里面全局搜索"weixin://"即可。

至于安卓的APK的逆向可以参考我之前的一篇文章< 打造Mac下APK逆向环境到实战接口XSS挖掘 >,可以在源代码中、所有文件内容中搜索URL Schemes。

漏洞案例

APP内URL跳转问题

其实严格来讲这不算是漏洞,毕竟利用有限,但又和一切能产生危害的问题都算漏洞这句话所冲突,所以在这还是选择列了出来,至于厂商觉不觉得是个安全性问题,还要看他们对“安全风险“的定义。

如何发现这类问题?在上文中我提到了如何发现URL Schemes,只要你发现了这种类型的URL Schemes就可以尝试替换地址为你的地址然后使用浏览器打开查看是否能在APP内跳转到你的地址,当然利用方式也很简单,构建一个HTML页面即可,然后将网址发送给“受害者”即可:

<script>
window.location='URL Schemes';
</script>

凭证窃取(设计不当)

在做一次漏洞挖掘的时候也碰见了很多次这种问题,大概的描述下就是我找到了能在APP中打开网页的入口方式(例如:二维码扫描、URL Schemes动作),让APP访问到我的地址,这样我就可以直接获取到APP中登录后的凭证信息。

利用方式和URL跳转的方式是一样的;关于这方面漏洞产生原理得出一个可能“不太严谨的结论”:APP在做HTTP请求的时候默认所有访问的都是信任域,所以带上了本身已经登录的凭证去请求了。

结合漏洞扩大攻击面

在一次APP的漏洞挖掘中发现了一个JSONP劫持的问题,但是在这里只会对APP用户产生影响,在没有二维码扫描的情况下就需要结合URL Schemes来扩大这个漏洞的影响面,而不是局限于self。

利用流程:

用户打开https://gh0st.cn/test.html,test.html内容:

<script>
window.location='mst://jump?url=https://gh0st.cn/jsonp.html';
</script>

用户点开之后启动mst应用执行jump动作,跳转到https://gh0st.cn/jsonp.html,jsonp.html内容:

<script>function test(data){ document.write(JSON.stringify(data)) }</script> <script src="JSONP URL"></script>

URL Schemes劫持

这个漏洞是15年在乌云爆出来的,漏洞编号为:wooyun-2015-0103233,大家可以自行去查看。

这个问题说白了是一个流程上的缺陷,苹果官方没有限制APP定义的URL Schemes名字,导致其他APP也可以定义“支付宝”的URL Schems名字;又因为iOS系统判定URL Schemes优先级顺序与 Bundle ID 有关(一个 Bundle ID 对应一个应用),如果有人精心伪造 Bundle ID,iOS 就会调用恶意 App 的 URL Schemes 去接收相应的 URL Schemes 请求,这就导致了可以被劫持。

结尾

还有很多思路等着我们去探寻,此文仅做思路启发。

iOS URL Schemes与漏洞的碰撞组合的更多相关文章

  1. 你所知道好玩有趣的 iOS URL schemes 有哪些?

    QQ的url是 mqq:// 微信是weixin:// 淘宝taobao:// 点评dianping:// dianping://search 微博 sinaweibo:// 名片全能王camcard ...

  2. iOS URL schemes

    来源:知乎 launch center pro支持的参数主要有两个,[prompt]文本输入框和[clipboard]剪贴板 淘宝宝贝搜索 taobao://http://s.taobao.com/? ...

  3. iOS 微信打开第三方应用(Universal Links 和 URL Schemes)

    一.前言 项目中时常有这种需求, 是通过链接跳转到应用内部,现在iOS主流的方案有两个 Schema: 常用在于一个应用跳转到另一个应用内部,属于应用间的跳转.当然ios9以下,网页可以通过schem ...

  4. 苹果app(iOS app)的URL schemes

    最近折腾iOS快捷启动应用或应用内的某个动作的神器launch center pro (LCP),发现很多国产app并没有被LCP官方收录,所以不得不想办法找到app的url schemes. 下面是 ...

  5. iOS 之URL schemes

    添加 URL  schemes 步骤: 1.打开info.plist文件. 2.点击 “+ ”号添加,或者在列表上点击鼠标右键,选择 Add Row. 3.选择 URL types. 4.点击三角号展 ...

  6. URL Schemes

    APP 被唤醒离不开对URL Schemes的认知. 苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了 URL Schemes 这个解决办法. URL Schemes ...

  7. iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 受此影响,当你的应用在 ...

  8. LSApplicationQueriesSchemes--关于info.plist 第三方登录 添加URL Schemes白名单

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 当你的应用在iOS 9 ...

  9. 【转】iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 受此影响,当你的应用在 ...

随机推荐

  1. OpenStack—neutron组件介绍与安装

    neutron介绍 Neutron 概述:传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和 ...

  2. java----代码打包

    打包 文件生成在out目录下 D:\IDEA代码\out\artifacts\IDEA_jar 注意打包好像只能打包src下面的代码 不在src目录下的一些文件,自己文件添加到打包好的目录下 可以选择 ...

  3. jq 操作表单中 checkbox 全选 单选

    知识点: Note: 1: .prop() 和 .attr() 方法的区别 .prop() 针对标签既有属性 .attr() 针对自定义属性 2: $('input:checked')即为选中元素. ...

  4. 集腋成裘-13-git使用-02进阶篇

    上一篇我们简单介绍了如何安装和使用git,本次将简单介绍如何创建分支.处理冲突.提交与回滚 创建和合并分支是Git的一大特色. 使用场景:当有一个新功能要开发,但是又没有确定上线时间,不能合并到主干上 ...

  5. 独立版Jexus配置SSL,支持https访问

    一.申请证书[腾讯免费证书] 二.验证DNS,即解析域名.记录类型选择 TXT ,主机记录与证书上的主机记录保持一致,记录值也与证书上的记录值保持一致 三.等待DNS验证与CA轮询,轮询成功后即可下载 ...

  6. LCT入门总结

    原文链接https://www.cnblogs.com/zhouzhendong/p/LCT.html 为什么要写这个总结? 因为之前的总结出问题了…… 下载链接: LCT 入门总结 UPD(2019 ...

  7. redis的两种安装方法

    原:https://www.cnblogs.com/caokai520/p/4409712.html C# Redis   概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦 ...

  8. vimtutor——vim官方教程

    =============================================================================== =      欢     迎     阅 ...

  9. maven项目如何手动打包

    1.确定打包对象:dubbo-admin 2.进入打包对象目录,复制目录路径(D:\H\dubbox-master\dubbo-admin). 可以看到该对象为典型的maven目录,此时没有“targ ...

  10. c# asp.net mvc使用斑马GK888t打印机打印标签

    前言 c#语言,asp.net mvc,南京都昌电子病历模板工具(类似word),斑马GK888t,打印手腕带和标签纸. 实现步骤为:在页面上显示一个或多个都昌模板工具,点击页面上的button,出现 ...