赞
踩
当你测试App的时候,想要通过Fiddler/Charles等工具抓包看下https请求的数据情况,发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例:
Fiddler中看到的请求是这样的:
你可能开始找证书的问题:是不是Fiddler/Charles的证书没有导入的手机中去?配置一遍又一遍,又开始对比web端浏览器的https发现没问题。这时候你可能已经不知所措了。
没错,就是证书的问题,但跟你想象中的证书有点不同,不是Fiddler内置证书的问题,而是App内置证书的问题 -- SSL Pinning机制(也可称为证书绑定)。
首先,在https的建立连接过程中,当浏览器向服务端发送了连接请求后,服务器会发送自己的证书(包括证书有效期、颁发机构等)给浏览器,浏览器首先在本地根证书区域寻找是否有这个服务器证书的CA机构的根证书。如果有继续则下一步会进行验证服务器端的证书,如果没有弹出警告。验证通过后经过一系列服务器和客户端的信息交换,双方最终建立了通讯。
原因就是在浏览器面前Fiddler伪装成一个https服务器,用户可以自由的将Fiddler的伪装证书导入到浏览器内置的根证书中。此时Fiddler作为中间人在真正的服务器面前伪装成浏览器的角色。
明白上述一点之后,我们再回到App客户端,App默认是信任系统(Android or IOS)用户第三方安装的的CA证书的,有一些App能够通过Fiddler抓到包的原因是因为:我们可以在系统的用户CA证书集中添加Fiddler的证书。这样App就能信任证书是安全的,放心的发送请求了。
但是现在随着系统的更新,Google or Apple认识到安全越来越重要,所以就引入SSL-Pinning技术:
开发者预先把证书相关信息预置到App中再打包,这样在https通讯过程中App本地可以与服务器返回的证书可以做合法性校验,如果发现不一致,那么可能就是由于中间人攻击(比如Fiddler/Charles抓包工具),App客户端可以终止https链接。而在新版本Android系统(V7.0)的规则中:
应用只会信任系统默认预置的CA证书及应用自身内置的证书,如果是第三方安装的证书(比如Fiddler安装的)则不会信任。
上面的都是一些理论方面的内容,到底该如何突破SSL Pinning机制能够抓到App的https请求包呢?
目前已验证在Android 7.0或以上的系统有启用了对第三方证书的限制。但是在Android 7.0以下还是依旧可以将Fiddler/Charles的证书安装在用户的CA集中抓取https请求。
此种办法前提是需要root权限,但是现在很多新款手机获取root权限困难,所以此办法并不推荐。
- <?xml version="1.0" encoding="utf-8"?>
- <network-security-config>
- <base-config cleartextTrafficPermitted="true">
- <trust-anchors>
- <!-- 信任系统预置CA 证书 -->
- <certificates src="system" />
- <!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
- <certificates src="user" />
- </trust-anchors>
- </base-config>
- </network-security-config>
- <?xml version="1.0" encoding="utf-8"?>
- <manifest ... >
- <application android:networkSecurityConfig="@xml/network_security_config"
- ... >
- ...
- </application>
- </manifest>
此种方案比较适用于对反编译比较熟练的童靴
VitualXposed介绍:
Use Xposed with a simple APP, without needing to root, unlock the bootloader, or flash a system image
官网下载地址:https://vxposed.com/
简单来说,VitualXposed可以在不需要设备root的情况下,修改App的行为。此应用的工作原理类似于应用分身功能,会将应用安装到一个虚拟独立的环境当中,其内部会自带一个已经激活了的Xposed工具。
JustTrustMe介绍:
An xposed module that disables SSL certificate checking for the purposes of auditing an app with cert pinning
JustTrustMe是Github上面的一个开源项目,是xposed中的一个模块,用于禁止SSL证书验证。
https://github.com/Fuzion24/JustTrustMe
操作流程:
打开Xposed,选择左上角导航栏->模块,勾选JustTrustMe
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。