十分鐘學會Fiddler

一.Fiddler介紹

Fiddler是一個http抓包改包工具,fiddle英文中有“欺騙、僞造”之意,與wireshark相比它更輕量級,上手簡單,因爲只能抓http和https數據包,所以在針對http和https數據包的抓取上它更加專業。

不僅可以記錄客戶端和服務器的http(s)請求,還能設置斷點,修改請求和響應的數據,模擬弱網絡環境。如果這些還滿足不了你的需求,你還可以安裝插件對Fiddler現有的功能進行擴展,甚至編寫腳本實現一些自動化操作。

二.Fiddler的工作原理

當我們瀏覽網頁的時候,實際上瀏覽器會通過tcp連接以http數據包的形式向服務器發起請求的,服務器在接收到請求後會根據後臺代碼邏輯做出不同的響應。

以上是系統中沒有代理,用的是直連網絡的情況。這時候如果系統中設置了靜態http代理,那麼瀏覽器所有外發的http請求會被重定向到代理服務器,代理服務器會根據請求的目的ip將請求再轉發至相應的服務器。同理,服務器返回給瀏覽器的數據也要經過代理這一層。

其實Fiddler所做的和代理服務器是一樣的事情,當我們啓用Fiddler之後,ie的http(s)代理會自動被設置爲127.0.0.1:8888(之所以這麼設置是因爲Fiddler是在本地8888端口進行監聽的), 所有http(s)會話的都會被Fiddler攔截。Fiddler監聽的端口號可以在下面這個地方更改:

使用http://localhost:8888/可以訪問到Fiddler的echo服務

至於Fiddler爲啥可以抓https包,其實是利用了類似中間人攻擊的技術,看下面這張圖:

在瞭解Fiddler解密https的原理之前,我們首先要知道標準的https通信原理。在https通信中,運用到了兩種加密技術——對稱加密技術和非對稱加密技術(RSA),非對稱加密用來在握手過程中傳輸對稱祕鑰,而對稱加密技術是握手完成之後實際使用的通信加密技術。

https實際通信過程可以分爲兩步走:

第一步,客服端和服務器協商通信使用的密鑰(對稱密鑰)。

這個過程可以簡單描述爲——客戶端發起請求獲取服務器的證書,證書裏包含了服務器的RSA公鑰。客戶端生成通信用的對稱密鑰,使用服務器的公鑰加密後傳輸給服務器。服務器接收到之後使用自己的RSA私鑰解密得到傳輸用的明文祕鑰。

第二步,客服端和服務器使用協商好的密鑰進行加密通信。

瞭解以上常識後我們再看Fiddler解密https的過程其實不難:

  1. 客戶端發起請求,中間人(Fiddler)會攔截來自客戶端的請求,並將僞造的ca證書派發給客戶端。同時Fiddler向服務器請求,獲得服務器的ca證書。

  2. 客戶端接收到來自中間人(Fiddler)的證書,還傻傻的以爲這個證書是來自服務器的,並且使用證書裏的公鑰(其實是Fiddler的公鑰)對生成的通信祕鑰(對稱密鑰)加密,發送給服務器。可憐的是這個數據包也會被中間人(Fiddler)攔截。

  3. 中間人(Fiddler)使用自己的私鑰將數據包解密,很輕鬆地得到了通信祕鑰。之後使用服務器的RSA公鑰對通信密鑰加密後傳輸給服務器。

  4. 服務器接收到“客戶端”(其實是Fiddler)發送給自己的密鑰,使用RSA私鑰解密得到明文密鑰後,建立信任。握手完成。使用對稱密鑰加密消息, 開始通信。

  5. 後面的事情大家應該就明白了,由於Fiddler持有通信祕鑰,客戶端和服務器的通信對其始終是透明的。這篇文章裏有更加詳細的描述,文章鏈接:http://www.mehdi-khalili.com/Fiddler-in-action/part-1/

三.Fiddler的使用

網上介紹Fiddler各種功能的帖子已經不少了,這裏就結合我工作中的使用來總結下Fiddler的幾個常見的使用場景。

1.模擬瀏覽器白屏的同時不影響正常抓包(可學習到:使用Fiddler設置斷點,QuickExec命令)。

因爲有收到某些用戶反饋QB在某些環境下會出現白屏現象,爲了針對白屏問題進行優化,需要對白屏現象穩定復現。當然瀏覽器白屏可能是多種因素造成的,瀏覽器崩潰,網絡卡慢導致網頁遲遲不能加載,亦有可能網頁本身就有問題……

經過和開發同學瞭解,目前重點要解決的是首頁白屏問題,QB首頁從開始導航到渲染成功中間有一段間隙,在這段間隙裏網頁在視覺上會保持“白屏”的狀態,如果這個時間比較長就會給用戶不好的體驗。可以給這種“白屏”做一個具體的定義:首頁打開20s後如果仍未成功渲染就定義爲發生了一次“白屏”現象。測試的時候我們要模擬這種白屏現象,只要找到一種方法可以讓標籤頁打開20s之內始終保持“白屏”狀態即可。

當然對網絡進行限速可以達到這個目的,但是我測試中有在模擬白屏的同不影響正常抓包的需求,而一般的限速工具(比如電腦管家)只是應用級的限速,無法做到針對特定請求限速。

所以首先想到的是使用Fiddler的設置http斷點功能,將QB啓動時發起的導航頁請求卡住,讓其遲遲不能獲取導航頁服務器的響應,保持這個狀態20s即可成功觸發“白屏”現象。點擊Fiddler左下角的這個位置,默認這個位置是空白的,當點擊後圖標變爲向上的箭頭時Fiddler會攔截所有http(s)請求,如果是向下的箭頭會攔截所有的響應。請求被攔截時QB會一直保持白屏狀態,維持20s觸發“白屏”。全局斷點會攔截所有的http(s)請求,如果只想模擬導航頁的白屏,可以設置下filters,但是如果想模擬導航頁白屏的同時不影響其他網頁的正常抓包,我們還得求助於bpu命令。

bpu是一個QuickExec命令, QuickExec命令輸入框在fiddler的左下方可以找到(那個黑色的長條)。bpu命令格式:bpu {url},這裏直接在QuickExec下輸入bpu https://daohang.qq.com/?fr=hmpage,就會成功設置斷點,只要一發現url爲https://daohang.qq.com/?fr=hmpage的請求,Fiddler就會將其中斷。而其他的http請求仍然可以正常發送。這種方法可以在製造白屏的同時正常抓包。如果想取消之前設置的斷點在QuickExec下直接輸入bpu(無參數)即可。

由此延伸着學習了下Fiddler提供的一些常見的QuickExec的命令,列舉幾個相對來說比較實用的:

Tips:

(1)和bash shell類似,使用方向鍵上、下,可以切換QuickExec歷史命令;

(2)值得一提的是內置的QuickExec命令其實是通過FiddlerScript(FiddlerScript會在下一部分介紹)定義的,如果這些命令仍舊不能滿足你的需求,你可以在對應的地方添加自定義命令。

2.修改網絡請求

在工作中時不時會因某些原因需要修改網絡請求,主要有以下場景(但不限於此):

  • 當前請求的的內容與將要上線的功能存在局部差異,一般是一些請求參數的差異;

  • 某些後臺服務ip或端口發生變更。

當然你可以使用Fiddler的composer對想要修改請求包進行重構——打開composer標籤,將要修改的session拖到composer裏即可修改。但是如果想對某些特定的url自動的改包,還得使用FiddlerScript來做。使用FiddlerScript的簡要步驟如下:

(1)安裝Fiddler script editor插件,安裝後可以在右側發現多了一個選項卡FiddlerScript:

(2)Fiddlerscript的語法和js有點類似,簡單學習下,發現如果要改請求參數可以在OnBeforeRequest這個function裏對Session對象的url屬性進行修改。下面是一段示例代碼,可以做到自動對GET請求中的個別參數修改:

(3)點擊左上角的【save script】保存修改.

(4)重新觸發請求,使用Fiddler抓包,可以看到host參數自動被替換爲了我們指定的值。

官方文檔上列舉了比較幾類常見的改包場景:

  • 添加或刪除一個請求頭;
oSession.oRequest["NewHeaderName"] = "New header value";

oSession.oResponse.headers.Remove("Set-Cookie");
  • 重定向請求的file、hostname、port;
if (oSession.PathAndQuery=="/version1.css")
    oSession.PathAndQuery="/version2.css";

if (oSession.HostnameIs("www.bayden.com"))
    oSession.hostname="test.bayden.com";

if (oSession.host=="www.bayden.com:8080")
    oSession.host="test.bayden.com:9090";

3.線上文件映射到本地調試(可學習到:auto response)

使用Fiddler可以將線上的文件映射到本地調試,比如線上某個js文件有一個bug,這時你身邊的電腦上又沒有裝ide環境,你可以將這個js文件下載下來在本地修改,然後使用Fiddler的auto response功能將所有請求線上js的會話重定向到本地js文件,這樣就可以直接在線上實時觀察修改結果了。例如下圖裏,我使用本地的jquery文件對線上jquery文件“替換”。

注意:線上引用的jquery之前是1.11.3的,加了auto response規則後再次請求後,Fiddler使用本地3.1.1的jquery替換了原始的response。

4.Fiddler抓localhost(127.0.0.1)

有時候需要對本地的服務抓包分析,使用Fiddler也是可以抓到的。在localhost或127.0.0.1後面加點“.”就可以了,例如:http://localhost.:8080。另外使用本機ip或機器名訪問Fiddler也是可以抓到的。

5.使用FiddlerCore做自動化

除了擁有強大插件擴展能力,Fiddler還抽取了其核心能力爲開發者封裝了一套sdk——FiddlerCore,可以將Fiddler的功能很好的集成到自己的應用裏。

不過遺憾的是FidderCore只支持.net開發(誰讓作者是微軟的IE項目經理呢......),可以使用Nuget爲你的project集成FidderCore。

篇幅有限,有興趣的話可以去官網http://www.telerik.com/fiddler/fiddlercore下文檔學習。

四.結語

以上就是我個人使用Fiddler的經驗總結,當然Fiddler的功能遠遠不止這些,比如:移動端抓包、模擬弱網絡、http性能測試、自動化ApiTest等等,甚至可以使用Fiddler做反向代理,有興趣的同學可以繼續鑽研一下,下面是一些Fiddler學習的網站。

Fiddler官網:
http://www.telerik.com/Fiddler

Fiddler的google論壇(Fiddler作者Eric Lawrence偶爾也會在上面回答一些問題):
https://groups.google.com/forum/#!forum/httpFiddler。

不知大家在工作中是否用到fiddler、wirshark這類工具,是否有使用fiddler解決問題的好案例?或者同學們如果有更好的工具推薦,都請在評論區討論一下吧!

此文已由作者授權騰訊雲技術社區發佈,轉載請註明文章出處

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