Android APP Webview识别技巧与调试攻略本公众号及Viego安全团队所发布内容仅供网络安全学习与研究之用,严禁用于非法目的01
前言
在日常App测试过程中,我们经常会遇到这样一种情况:有些请求在Yakit、Burp中能明显看到HTML、JS等前端资源,而有些页面却几乎只暴露接口请求,看不到明显的网页痕迹。
造成这种差异的一个关键原因,就是目标页面是否使用了WebView。
对测试人员来说,这意味着一个很重要的变化:有些师傅可能抓包看到数据包加密就会放弃,但是当目标页面使用了WebView,测试思路就不能只停留在原生层,还需要关注页面中的前端资源以及可能存在的前端加密逻辑。
本文将围绕两个问题展开:
如何判断一个App页面是不是WebView页面。
当WebView中存在加密逻辑时,如何对其中的JS进行调试
02
App 常见的三种形态
根据app的开发方式,大致可以将app分为以下三类:- 原生app:页面与功能全部由原生代码实现。在Android场景下,通常可以理解为主要由Java或Kotlin编写。
- 混合app:部分功能使用原生代码开发,部分功能使用webview开发。
- h5 app:应用功能基于WebView容器实现。
03
如何辨认是否为webview页面
那我们如何辨认一个app中哪些页面是java原生开发的,哪些页面是webview页面呢,接下来介绍一个方法。 我们再打开一个app,如果app中某个页面像下面这样,每一个小按钮都有一个自己的小框,这证明这是一个android原生开发的app。 如果一个页面像下面这样,每个按钮没有自己的小框,而是整个页面中有个大框,这说明这个页面是一个webview页面,其中展示的内容都是html页面。 当然也可以通过jadx反编译apk文件,全局查找Webview来判断是否使用了Webview,例如android.webkit.WebView、webView.loadxxx等。04
调试webview中的js
在android原生开发的功能中,当我们碰见加密,我们可以用frida hook java代码、算法助手来弄清楚他的加密逻辑。 如果在Webview中碰见加密,我们可以像调试传统web网站一样对webview中的js文件进行调试。 在调试webview中的js之前,我们需要有对app中webview的调试权,这需要WebView.setWebContentsDebuggingEnabled(true); 然而市面上的app一般不会给我们这个调试权限,所以我们需要通过以下项目打开webview的调试权限。项目地址:https://github.com/feix760/WebViewDebugHook【PS】:apk在项目的/app/release目录下将apk下载下来装入lsposed中,在lsposed中启用该模块并勾选目标app 接下来手机连接数据线到电脑,确保adb能获取到设备信息,然后打开app中的webview页面,在edge浏览器中输入edge://inspect进入如下页面 等待一会儿,就会显示检测到的webview页面,点击inspect即可进入webview的调试页面 由于是另起了一个窗口,所以我们用不了浏览器自带的插件,那我们有什么快捷的方法进行解密吗?我们可以在Snippets里面写入Hook AES、RSA等加密的js代码 这些hook加解密的js代码我们可以通过油猴、插件、Github来获取。可以参考:https://www.cnblogs.com/yoyo1216/p/19186628 当然有时候并不需要这么麻烦,有些webview界面相关的数据包可能会有路由,我们拖到浏览器可以直接去访问进行解密。【PS】:如果要使用chrome浏览器进行调试,则在浏览器中输入chrome://inspect,使用chrome浏览器时需要打开科学上网,不然后面会提示404而无法成功调试。 05
访问APP,发现一个路由很可疑
放到浏览器里面去访问
观察数据包,发现跟APP里面的数据包是一样的,猜测加密逻辑是相同的,我们可以直接在H5页面进行hook,更方便点
这种全加密的我们只能全局搜索关键词encrypt:、encrypt(,或者打xhr断点,通过一步步调试找到加密位置,可以看到很明显的SM2、SM4加密逻辑还有SM3验签。
后续使用yakit编写热加载代码进行自动化流量加解密,也是靠解密成功挖到签到处存在逻辑缺陷。
06
有什么问题欢迎讨论,共同进步。