1. 程式人生 > >記一次奇葩的Js劫持事件

記一次奇葩的Js劫持事件

最近,專案突發狀況,之前開發的一個手機端APP內嵌H5頁面突然異常。現象是重新整理頁面後,有很大概率頁面卡死在資料載入階段。於是聯絡App開發人員,出調試包。開始除錯。

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


看來問題找到了。

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

  頁面卡死一般會有兩種情況,某些請求沒有返回,一直在Pending狀態,或者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是託管在七牛的CDN上,並且通過HTTPS訪問,所以已經可以斷定,七牛分配給我們的域名已經被運營商劫持掉了。現在我們正在聯絡七牛的客服積極處理中。進一步的進展我會及時更新在這篇文章中。