淺逆某簡單akamai(無風控部分)
Target:aHR0cHM6Ly93d3cuZGlnaWtleS5jbi8=
前言
本文參考了以下文章和視頻,感謝大佬們的分享
- https://www.bilibili.com/video/BV1d14y1h7P9/?spm_id_from=333.880.my_history.page.click&vd_source=999a37555f77c5995df6185262c99be3
- https://blog.csdn.net/huangch135/article/details/130227868
基本分析
- akm的目標是cookie裡的
_abck
這個值 - 當
_abck
裡的~-1~
變成~0~
時就算是有效
- 上述的
_abck
由類似1diI9T-4eS/HLR5GidZ/XH/YkNYXGfprwm5/cEMlcQYB/TnUjFxE/ZWTA
這樣的接口返回 - 本網站屬於簡單類型的akm,因此在風控正常的情況下,第1個接口返回的cookie就已經是有效的
- 而對於其他難度的akm,則可能需要在第3次後,什至是在某些事件觸發後,才會返回有效的cookie
第一次請求
- 從上述接口的堆棧,直接可以跟到這裡
Txf
就是接口請求的data,而其主要部分是wFf
- 向上跟來到這裡,可以看到
ATf
明顯是一個環境檢測的數據,裡面保存著當前的各種環境
ATf
環境數組具體如下,基本上每個都是環境檢測點,建議與自己的環境逐一對比- 個人認為最主要關注的部分就是這個環境數組,只要這裡能基本一致應該就可以
- 後續的各種操作生成最終的
sensor_data
應該就沒有那麼重要了
1 | [ |
技巧:以上述環境數組的第3個索引為例,要如何找到其生成位置?
- 先確認它是哪個變量
- 通過search快速定位
- 發現是一堆switch…case,這時可以在每個
return
處下斷點
- 可以看到是由
UJ.apply(undefined, tJ)
返回,進入該函數,裡面就是對input的檢測
sensor_data
這個請求參數可以在XMLHttpRequest.prototype.send
裡接收
第二、三次請求
雖然只需第一次請求就夠,但第二、三次請求的一些檢測點還挺有意思的,簡單地說一下吧
- 在第2次請求時,在以下代碼的位置檢測了
font
相關的東西,例如不同fontSize
和fontFamily
的offsetHeight
和offsetWeight
- 應付的方法也很簡單,就是根據
fontSize
和fontFamily
構建字典一一對應就可以了
1 | var Mtf = cE.slice(); |
- 同樣是第2次請求,這裡先執行了
Object.keys(iframe.contentWindow)
的操作,然後用JSON.stringify
將其變成字符串,最後再將它用某種算法加密了一下,然後加上Object.keys
返回的數組的長度
1 | E7f = ff[hf.tK.call(null, ZG, Ux)][hf.PF.call(null, Cb, QE)](d7f); |
- 第3次請求,這裡是一些CSS的檢測,有興趣可以自己來看看
1 | return [hf.I5.call(null, fW, Z9), hf.j5.apply(null, [ng, dk, SE(K1), NG]), hf.N5(Lk, AI), hf.x5(kV, g9), hf.d5(jC, fj), hf.E5.apply(null, [kV, Qn]), hf.M5(bH, HV), hf.G5(Ehf, khf, hB, c4), hf.C5(Chf, I9), hf.k5.apply(null, [vE, j9]), hf.c5(Yb, N9), hf.J5(cR, x9), hf.B5(xJ, Uk, Wk, kc), hf.w5.call(null, Cw, qV), hf.A5(NR, Rp, cG, Xp), hf.b5(F9, pc, SE(K1), Ec), hf.l5(Qb, d9), hf.p5.apply(null, [nB, E9]), hf.V5.call(null, gLf, M9), hf.R5(r3f, G9), hf.H5.call(null, xC, C9), hf.W5(k9, NH, cG, Pw), hf.f0(c9, hJ, SE(K1), hJ), hf.dQ(Bk, Ip, pG, Eb), hf.EQ(EJ, CM, DC, MG), hf.h0(Khf, SE(K1), Ec, rhf), hf.P0(JH, CO), hf.Q0.call(null, Cc, J9), hf.MQ.apply(null, [FC, ZG, pJ, rV]), hf.L0(pc, ng), hf.K0.call(null, OG, B9), hf.S0.apply(null, [kb, Fl]), hf.T0.call(null, EG, Il), hf.GQ(EG, VW, Vc, TPf), hf.z0(AA, w9), hf.t0.apply(null, [hV, DC, JB, xw]), hf.F0.call(null, Pff, A9), hf.q0(Rff, SE(SE(K1)), SE(K1), rW)][hf.Cz(lLf, b9)](function(HYf) { |
注:三次請求的觸發條件分別是
1 | 1. 最開始的自執行函數 |
實際請求
總體流程如下:
效果如下:
curl_cffi
是用來躲避TLS檢測,注意*impersonate*="chrome101"
要與js環境的ua和appVersion一致node_vm2
太經典了就不多說啦
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 NgIokWeng's Blog!
評論