天天看點

記一次奇葩的Js劫持事件

最近,項目突發狀況,之前開發的一個手機端APP内嵌H5頁面突然異常。現象是重新整理頁面後,有很大機率頁面卡死在資料加載階段。于是聯系App開發人員,出調試包。開始調試。

開始調試後,首先發現頁面加載時發送了一個奇怪的請求-http://8.525cm.com/v2/v.php?id=105,傳回還是404,于是猜測被營運商DNS劫持,篡改了我們的HTML(話說營運商是聯通啊啊啊,開始完全不相信,因為自己孤陋寡聞,隻見過小城市的電信幹這種事,而我大北京的聯通應該不至于吧),而我們的頁面确實并未開啟HTTPS。嗯嗯,查HTML,發現在head部分确實被插入了一個script标簽,如下圖:

記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件

看來問題找到了。

進一步思考,發現這個原因仍然無法解釋為什麼我們的頁面會卡死在加載階段,理論上這種劫持不會影響原頁面的的功能啊。看來仍然需要進一步調查。

  頁面卡死一般會有兩種情況,某些請求沒有傳回,一直在Pending狀态,或者JS的執行出錯了。分别檢視網絡請求和控制台輸出,果然是JS執行出錯了。具體檢視出錯資訊,發現是我們依賴的一個JS庫沒有執行。這就很奇怪了,在網絡請求中該JS庫是正常傳回的。再次檢視網絡請求确認,發現該JS請求竟然不是我們所依賴的庫,竟然被替換成了下面這份鬼樣子:

記一次奇葩的Js劫持事件

高潮來了,讓我們來審查一下這段神奇的代碼。首先,它會試圖去找一個id為mck0的dom,找到了就什麼都不幹。如果找不到,嘿嘿,它會向DOM添加兩個JS節點(使用appendChild()API),一個是之前被域名劫持掉的JS,自作聰明的作者企圖通過這這種方式掩蓋他的罪行;另一個就是真正幹壞事的請求-8.525cm.com/v2/v.php?id=105。但是百密一疏的是作者居然使用了appendChild,JS的加載順序被他改掉了,正巧項目中的其它JS依賴了這個被替換掉的JS,于是其它JS在加載時妥妥的報錯了,頁面卡死也就不足為奇了。

進一步實驗還發現,如果整個站點起在HTTPS下面,并且将所有JS也全部托管于HTTPS下,該僞造的JS并不會聰明的分辨協定,還是使用了一個HTTP的JS來還原之前被劫持掉的HTTPS JS,這樣整個JS都會因為浏覽器的安全政策而加載失敗。也就是說如果我們的站點是在HTTPS下的,那麼站點中一定會有一個JS因為劫持而加載失敗,導緻頁面出現問題。

通過whois反查,得到如下資訊:

記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件
記一次奇葩的Js劫持事件

貌似域名持有者是中國萬網,阿裡旗下公司,我們靜待大公司如何回應吧。

回到我們的項目,被劫持的JS是托管在七牛的CDN上,并且通過HTTPS通路,是以已經可以斷定,七牛配置設定給我們的域名已經被營運商劫持掉了。現在我們正在聯系七牛的客服積極進行中。進一步的進展我會及時更新在這篇文章中。

繼續閱讀