首页 / 资讯中心 / 文章详情

从AKMST到反爬:拆解前端传感器Cookie的生成与校验逻辑

从AKMST到反爬:拆解前端传感器Cookie的生成与校验逻辑 ★ FEATURED ARTICLE
很多人第一次遇到这个场景是在授权安全评估或数据业务联调里浏览器打开一个敏感接口的页面一切正常但换了脚本去请求同一个接口直接被403或456挡回来响应头里还反复提到一个叫mst的cookie。翻遍所有文档也没有它的说明。这篇文章不打算教你绕过任何验证而是把我自己在测试环境里拆解mst参数的过程完整走一遍怎么定位它、它从哪来、静态特征长什么样、用哪些实验判断它的作用以及这套分析思路能给站点防护带来什么反推启示。内容比较适合两类人一是正在做站点反爬/防Bot策略的同学想搞清楚防护产品到底在验证什么二是做合规安全评估的同学拿到一个新加密字段不知道从哪里下手。1. 先把mst从请求里捞出来别急着讨论“算法”1.1 它到底出现在哪里我第一次注意到这个字段是在一个自建的模拟环境里抓包。当时请求一个受保护的后台接口请求头的Cookie长这样脱敏后的结构示例GET /api/v1/profile HTTP/1.1 Host: demo.example Cookie: _abckabtest_9x...; ak_bmsc1A2B...; AKMSTeyJ0aW1lIjo...; bm_sz7B3C...注意看这一串里面既有常规的ak_bmsc会话状态类也有bm_sz字符短、出现较早还有一个字段是我之前没有单独跟踪过的——AKMST名字里带MST值非常长形态和前面的字段都不一样。后来我换了几种场景去抓包发现它的出现位置并不固定常规场景作为Cookie字段出现key是大写的AKMST部分旧版本站点里是小写mst接口请求部分POST接口会把mst放进表单体或者JSON体里字段名叫mst或mstToken响应回显在403/456的响应体里会以challenge参数形式提示要求“重新加载页面并携带有效cookie”。所以分析的第一步是先确认你手上的mst到底出现在哪个位置。很多人一上来就搜“mst解密方法”但位置都没定位清楚后面全白费。我的习惯是先把三类关键信息记录下来字段名大小写、出现位置Cookie/Header/Body、触发时间点页面加载后还是某个交互后。1.2 用开发者工具确认是谁写入了mst定位字段不算难难的是确认写入方。我在这类问题上的标准动作是打开Chrome DevTools切到Application面板找到Cookies按域名筛一遍能看到AKMST的Domain、Path和Expires时间看HttpOnly标记。如果HttpOnly是false说明它大概率是前端JS写入的而不是服务端Set-Cookie下发的F12切到Sources面板全局搜索AKMST这个字符串找到赋值的地方。有一次我在测试站点里做这个操作发现写入mst的并不是业务代码而是HTML底部动态注入的一段JS。这段JS的文件名每次刷新都变内容也不是纯静态的压缩混淆后很长里面夹着各种环境变量采集函数。这是典型的前端传感器sensor脚本。很多朋友到这一步会陷入误区马上去抠JS里那个赋值函数想把它逆向出来。但我的建议是先绕过“抠代码”用黑盒观察法把mst的行为特征搞清楚。因为这类脚本往往隔几天就更新一次你抠出来的某个公式下个版本就变了但字段的行为模型是相对稳定的。2. 生成链路拆解从第一次访问到mst真正落地2.1 页面脚本本质上是一个“数据采集器”我在测试环境里反复刷新页面配合Performance录制还原了mst的生成过程。首次访问页面时服务器返回的HTML尾部会追加一段脚本引用。脚本加载完成后并不急着写入mst而是会先等几个关键事件DOMContentLoaded读取页面结构信息load等待所有资源加载完毕顺手计算资源加载耗时用户首次交互mouseover/click/touchstart采集行为轨迹定时器间隔每隔几百毫秒做一次环境采样。这些事件触发的数据最终被汇总到一个“传感器数据包”里。数据包里通常包含几类信息我整理了一张分类表数据类别具体项目作用推测基础环境UA、语言、时区、屏幕分辨率、硬件并发数判断浏览器是否常见、环境是否模拟渲染特征canvas指纹、WebGL参数、字体列表识别无头浏览器与真实浏览器差异时间行为页面耗时、事件间隔分布判断操作是否像真人会话状态已有Cookie、localStorage、referrer串起前后端校验逻辑这些数据收集完之后脚本会把它们序列化并做一层压缩/加密最终写入AKMST取值。2.2 从采集完成到写入mst的关键时机我注意到一个容易被忽略的细节mst不是页面加载后就立刻存在的。在首次请求发出后的头200毫秒内Cookie里往往只有bm_sz而AKMST是脚本执行了大概500毫秒到数秒之后才set进去的。也就是说mst带有明显的“异步生成”特征。这一点对理解整个防护逻辑非常关键如果用户在页面加载后立即点按钮发请求此时mst可能还没生成后端就只凭其他字段做判决用户停留时间越长、交互越多mst里携带的行为样本越丰富后端判定也越有依据如果你用纯HTTP库模拟请求完全没有执行任何JS那请求头里自然没有mst——这本身就是最大的风险信号。从另一个角度讲防护参数并不会等你万事俱备才检查它会在不同阶段做多轮判断。mst只是其中一轮而且是一轮“迟到”的判断。2.3 为什么不能把mst当普通Cookie处理普通Cookie大多是服务端Set-Cookie写下来的生命周期和后端会话强绑定。而mst这类前端传感器写入的Cookie有几个特殊之处依赖JS环境没有执行JS就没有该字段值会周期性变化不是一成不变的内容承载的“证据”比“身份”更多更像一包环境快照一旦服务端发现取值的时序、内容与正常环境不一致会直接丢弃会话。理解这点之后再往后做静态分析思路会清晰很多我们不是在解一道加密题而是在读一份“由浏览器代写的现场报告”。3. 不急着解码先用静态特征给mst画个像3.1 数据形态观察长度、分段和字符集拿到一个真实验证过的AKMST值后先别急着拿Base64工具去翻。第一件值得做的事是把它当作一个普通字符串做形态观察。我在测试环境中抽了几个样本合并出这些规律长度普遍超过100个字符不同版本会有差异字符集前几段看起来是Base64字符集A-Za-z0-9/后面偶尔出现_和.分段常见结构为header.payload.signature三段式也有分成四段的版本变化频率在同一浏览器会话里间隔10分钟刷新页面mst大概率会变但如果完全不刷新页面只是发Ajax请求mst可能保持不变。拿其中一段样本举例去掉真实内容后它长得像这样AKMSTQ2hyb21lLzEyMC4w... .eyJ0cmlkIjoi... .R0lNRToxNjI...第一眼确实像“加密串”但仔细观察会发现中间那段eyJ0...无论从长度还是起始字符看都疑似Base64编码的JSON。你可以把这部分单独拿出来解码看看可打印字符通常会露出time、rid、score这类字段名。但这里有个大坑能解出来的“可读字段”只是表象完整取值后面还有一道签名校验。如果你只盯着某一段可读字段去构造改掉任意一个字符整个串就会失效。静态画像的真正作用是帮你判断它大概由哪几部分组成、哪些部分是可能变化的、哪些部分起完整性保护作用。3.2 和其他几个防护参数的分工关系在同一个Cookie列表里通常会同时看到ak_bmsc、bm_sz、AKMST和_abck。我简单整理了一份对比表方便新人理解它们的分工Cookie字段写入方生命周期主要职责ak_bmsc脚本/服务端短分钟级会话首访状态记录bm_sz前端脚本短分钟级记录活动会话与传感器初始化状态AKMST前端脚本分钟左右级别携带环境快照与行为证据_abck前端脚本可持续较长时间跨请求的指纹与风控判定依据这里要注意我上面列的生命周期只是一个粗略观察不同版本、不同站点配置下差很多。但大方向是一致的这些参数不会单独工作后面一定有一层“组合判定”逻辑。只分析mst一个字段看不到全貌不看mst又漏掉了最重要的一块行为证据。所以我的建议是先给mst做静态画像然后把它放回整组Cookie里去观察联动关系而不是孤立地研究。4. 动态实验用受控环境验证mst的风险判定作用4.1 实验场景设计要验证mst到底在风控判定中扮演什么角色最直接的办法是做对照实验。但你千万不能拿真实线上站点去试一方面可能干扰别人业务另一方面也可能给自己惹法律麻烦。下面所有实验我都是在本地搭的模拟环境里完成的Nginx做边缘校验Node后端做Cookie解析与日志记录前端页面原样复刻了采集-写入-上报的流程。实验思路可以复用但目标必须换成你自己的测试站点。4.2 四组关键对照实验我设计了四组实验分别验证mst的“有无”“内容有效性”“上下文一致性”和“时效性”。实验组操作观察现象初步推论A组清除AKMST保留其他Cookie重放立即返回403提示缺少mstmst是必要校验项之一B组保留mst篡改UA头返回403且发起JS质询mst与UA存在绑定关系C组保留mst篡改其中某一段字符返回403不提示重新加载页面存在完整性签名校验D组用10分钟前生成的旧mst发请求首次可能通过第二次被拦截带有过期与复用检测机制实验结果其实很有信息量。A组说明它不可缺失B组说明它内部绑定了请求上下文C组说明它自带防篡改D组说明它有时效窗口。4.3 从现象反推服务端校验逻辑把四组实验综合起来服务端的校验流程就很清晰了我习惯把它概括成三段式存在性检查请求里有没有mst字段没有就直接拒绝合法性检查格式是否完整、签名是否匹配不匹配就拒绝一致性检查字段内容是否与当前请求的UA、来源页面、会话ID对齐对不齐就拒绝并发起验证。这套三段式理解起来很像门禁系统先看有没有工卡再看工卡是不是伪造的最后看持卡人是不是本人。任何一道关卡没过都进不了门。其实把mst想成一个“由浏览器代写的现场报告”整个逻辑就顺了报告要盖公章签名要写清楚时间时效还要和你的身份证明对上上下文绑定。5. 回到防御者视角mst分析能给我自己的站点补什么课5.1 会话信标不能是“单点验证”很多自建站点的防护逻辑是只要校验一个tokentoken对了就放行。mst这套机制给我的第一课是真正有效的会话信标是分层的。哪怕边缘校验只有一个字段它背后也应该有一个跨多个数据源的判定链路。我建议的最低配置是三层边缘层校验Cookie字段是否存在、是否过期应用层校验Session、设备ID、登录态行为层记录并校验环境指纹和交互节奏。三层信息各管一段即使某一层被伪造其他层仍然能拦下来。5.2 前端信标不要承担全部责任mst这类前端采集脚本有一个天然弱点它把判断依据放在了“浏览器自己说”的场景里。浏览器可以说谎脚本也可以被模拟。防御设计上如果只依赖前端采集一旦客户端完全模拟出正常指纹整个防线就形同虚设。更稳的做法是把无法轻易伪造的链路侧信息纳入判定例如TLS握手特征TCP连接窗口与RTT规律HTTP/2帧序与请求时序QUIC/网络层标志位。前端信标定位为“辅助画像”链路侧信息才是主判据。这样即使mst被完整逆向攻击者也无法轻易伪造一张“真实的网络入场券”。5.3 Cookie字段别直接进业务日志分析mst过程中我顺便做了一个自查很多团队会把整包Cookie打到日志里。mst、ak_bmsc这类字段动辄几百字符里面既包含时间戳、统计信息也可能包含会话关联数据。如果日志系统权限控制不严这些字段可能成为信息泄露点。防御侧建议至少做到三件事日志脱敏只记录是否命中校验、校验失败原因不记录Cookie原始值敏感字段加密内部追踪ID使用短哈希不直接拼接完整mst访问审计日志系统按角色控制查看权限避免所有研发都能直接搜到完整Cookie。6. 别忘了“分析”这件事的前提授权、时限和数据最小化6.1 授权边界不是一句空话在真实站点的安全评估会议里我经常看到有人把“拿到了mst样本”当作工作成果来汇报但没有人问过一句这个样本是从哪个环境里拿到的是不是在授权范围内做这类参数分析尤其涉及厂商反Bot机制时边界必须非常清晰要有书面授权或在你自己完全控制的站点/环境中进行测试请求量要控制在合理范围避免对目标业务造成影响不要刻意尝试构造“能骗过校验”的脚本那不是分析那是绕过。我写这篇文章的全部案例都基于本地模拟环境。真实环境的取样、实验、留存每一个环节都要有记录知道做不了也能证明做了的边界在哪里。6.2 原始报文“用完即焚”很多分析过程会保存大量抓包结果包含完整的Cookie字段。保存这些样本本身就有泄露风险。我的建议是只保存脱敏后的字段长度、分段数、关键属性和结论原始报文分析完立即删除不做长期留存所有中间产物存在本地加密目录不放进共享知识库。养成这个习惯还有一个好处以后如果客户的防护策略更新了你翻出来的都是“规律性结论”而不是一仓库过期的报文样本参考价值反而更高。分析mst的过程最有趣的收获其实不是“看懂了这个字段”而是掌握了一套通用方法先定位再画静态特征然后用可控实验验证行为逻辑最后回到防御视角去思考设计意图。这个方法在以后遇到任何新的防护参数时都能直接套用。下次你在授权环境里看到一个陌生字段不妨先别急着搜解密库把它当作一个普通的请求头和它“聊一聊”。
阅读完成 · 觉得有帮助?
咨询建站