測試技術分享 App 抓包提示網絡異常怎麼破?

 

背景

當你測試App的時候,想要通過Fiddler/Charles等工具抓包看下https請求的數據情況,發現大部分的App都提示網絡異常/無數據等等信息。以“貝殼找房”爲例:

 

Fiddler中看到的請求是這樣的:

 

你可能開始找證書的問題:是不是Fiddler/Charles的證書沒有導入的手機中去?配置一遍又一遍,又開始對比web端瀏覽器的https發現沒問題。這時候你可能已經開始懷疑人生了。

那麼究竟是不是證書的問題?

沒錯,就是證書的問題,但跟你想象中的證書有點不同,不是Fiddler內置證書的問題,而是App內置證書的問題 -- SSL Pinning機制。

什麼是SSL Pinning?

首先,在https的建立連接過程中,當客戶端向服務端發送了連接請求後,服務器會發送自己的CA證書(包括證書有效期、頒發機構等)給客戶端,如果客戶端是瀏覽器,則使用瀏覽器內置的根證書去校驗服務器CA證書的合法性。

那麼爲什麼Fiddler能夠抓得到瀏覽器的https請求呢?

原因就是在瀏覽器面前Fiddler僞裝成一個https服務器,用戶可以自由的將Fiddler的僞裝證書導入到瀏覽器內置的根證書中。此時Fiddler作爲中間人在真正的服務器面前僞裝成瀏覽器的角色。

明白上述一點之後,我們再回到App客戶端,App默認是信任系統(Android or IOS)用戶第三方安裝的的CA證書的,有一些App能夠通過Fiddler抓到包的原因是因爲:我們可以在系統的用戶CA證書集中添加Fiddler的證書。這樣App就能信任證書是安全的,放心的發送請求了。

但是現在隨着系統的更新,Google or Apple認識到安全越來越重要,所以就引入SSL-Pinning技術: 開發者預先把證書相關信息預置到App中再打包,這樣在https通訊過程中App本地可以與服務器返回的CA證書可以做合法性校驗,如果發現不一致,那麼可能就是由於中間人攻擊(比如Fiddler/Charles抓包工具),App客戶端可以終止https鏈接。而在新版本的系統規則中,應用只信任系統默認預置的CA證書,如果是第三方安裝的證書(比如Fiddler安裝的)則不會信任:

 

解決方案

上面的都是一些理論方面的內容,到底該如何突破SSL Pinning機制能夠抓到App的https請求包呢?

方案一:使用Android7.0以下的系統

目前已驗證在Android 7.0或以上的系統有啓用了對第三方證書的限制。但是在Android 7.0以下還是依舊可以將Fiddler/Charles的證書安裝在用戶的CA集中抓取https請求。

方案二:將Fiddler/Charles證書安裝到系統默認預置的CA證書區域中

此種辦法前提是需要root權限,但是現在很多新款手機獲取root權限困難,所以此辦法並不推薦。

方案三:反編譯APK,修改AndroidManifest.xml文件

  • 有些APK加了殼,需要先進行脫殼處理
  • 再通過apktool等工具進行反編譯
  • 在源碼的res/xml目錄添加network_security_config.xml文件,內容如下:
<?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>
  • 修改AndroidManifest.xml文件,在application標籤中增加android:networkSecurityConfig="@xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

此種方案比較適用於對反編譯比較熟練的童靴

方案四:VitualXposed框架+JustTrustMe模塊(推薦)

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

操作流程:

  • 將VitualXposed安裝到真機中,點擊應用按鈕->添加應用,將要調試的App、JustTrustMe.apk進行安裝

  • 打開Xposed,選擇左上角導航欄->模塊,勾選JustTrustMe

  • 重啓VitualXposed應用,打開貝殼找房,通過Fiddler抓包,可以看到App請求正常,https請求能抓到

  • 轉載地址:http://www.lemfix.com/topics/43397

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章