Python 爬蟲時,高版本 App 如何進行抓包?

我們都知道 iphone 和低版本 Android 抓包,只需要設(shè)置代理和配置證書就可以順利抓包
但是升級了 targetSdkVersion 到 28 后發(fā)現(xiàn),在 Android 7.0 以上機型 Charles 抓取 https 包時顯示找不到證書,但是 Android 6.0 機型還是可以正常抓包。
這其中的原因是,從 Android 7.0 開始,默認的網(wǎng)絡(luò)安全性配置修改了
解決方法如下:
現(xiàn)象:android7.0 以上的手機 https 抓包失敗(安裝了 https 證書也不行)
原因:android7.0+ 的版本新增了證書驗證(系統(tǒng)證書),具體如下:
1、Android 6.0(API 23)及更低版本應(yīng)用的默認網(wǎng)絡(luò)安全性配置如下:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /><certificates src="user" />trust-anchors>base-config>
2、而在 Android 7.0(API 24)到 Android 8.1(API 27)的默認網(wǎng)絡(luò)安全性配置如下:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" />trust-anchors>base-config>
3、而在 Android 9.0(API 28)及更高版本的默認網(wǎng)絡(luò)安全性配置如下:
<base-config cleartextTrafficPermitted="false"><trust-anchors><certificates src="system" />trust-anchors>base-config>
對比很容易發(fā)現(xiàn),在 Android 7.0(API 24)到 Android 8.1(API 27),默認不再信任用戶添加的 CA 證書,所以也就不再信任 Charles 和 Fiddler 抓包工具的證書,所以抓取 HTTPS 包時才會失敗
而且在 Android 9.0(API 28)及更高版本上,不僅默認只系統(tǒng)預(yù)裝的 CA 證書,還默認禁止所有明文通信(不允許 http 請求)
解決辦法:
前提:在手機端和電腦端都必須安裝 https 的安全證書
配置:打測試包時,項目設(shè)置默認信任所有證書(系統(tǒng) + 用戶,Charles 和 Fiddler)
1、在項目工程 res-xml 目錄中創(chuàng)建一個名為 network_security_config.xml 的文件,文件內(nèi)容如下:
<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" overridePins="true" /><certificates src="user" overridePins="true" />trust-anchors>base-config>network-security-config>
2、在 AndroidManifest 里的
<manifest ... ><application android:networkSecurityConfig="@xml/network_security_config"... >...application>manifest>
重新打包項目,然后抓包,即可成功
Webview 抓包失敗
上面可以解決 Android 原生抓包問題,但在 Android7.0 以上的手機,開著網(wǎng)絡(luò)代理訪問不了Webview
若要抓包webview,需要在 Webview 的 WebViewClient 中,將一行代碼給注釋掉:
super.onReceivedSslError(view, handler, error)這樣是為了忽略掉 SSL 證書錯誤
因為開啟代理后網(wǎng)絡(luò)會變得不安全,證書會報錯誤,Webview 檢測到證書錯誤之后就不請求任何數(shù)據(jù)。注釋是為了忽略掉父類的處理,默認執(zhí)行下去。
警告
這樣的配置操作是敏感且危險的,只能用于測試環(huán)境方便抓包,線上包一定注意要恢復(fù)配置,不然 APP 會面臨被他人抓包的風(fēng)險。
如何只在調(diào)試模式下允許抓包呢?
使用?即可實現(xiàn):只在?android:debuggable?為?true?時才生效的配置
<network-security-config><debug-overrides><trust-anchors><certificates src="system" /><certificates src="user" />trust-anchors>debug-overrides>network-security-config>
網(wǎng)上有些解決方式是將 Charles 和 Fiddler 的證書添加到?raw?文件夾下的方式也可以,但是繁瑣了點
在 Android 9.0(API 28)以上允許部分 http 請求
最佳的解決方式肯定是全部使用 https 請求,安全性更高,如果有些請求或測試環(huán)境下還是需要使用 http 請求,需要在網(wǎng)絡(luò)安全性配置添加白名單:
<network-security-config><domain-config cleartextTrafficPermitted="true"><domain includeSubdomains="true">sample.domaindomain>domain-config><debug-overrides><trust-anchors><certificates src="system" /><certificates src="user" />trust-anchors>debug-overrides>network-security-config>
后記
通過查找資料,還有一個方法,通過重載 WebViewClient 的 onReceivedSslError() 函數(shù)并在其中執(zhí)行 handler.proceed(),即可忽略 SSL 證書錯誤,繼續(xù)加載頁面
代碼如下:
WebView webview = (WebView) findViewById(R.id.webview);webview.setWebViewClient(new WebViewClient() {public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {// 不要調(diào)用super.onReceivedSslError,因為其包含了一條 handler.cancel(),第一次訪問時無法加載,第二次以后可以加載// super.onReceivedSslError(view, handler, error);// 忽略SSL證書錯誤,繼續(xù)加載頁面handler.proceed();}}
