【原创分享】另辟蹊径:基于浏览器脚本与中间人拦截的瑞数“异步”解决方案
一、引言:复杂瑞数环境下的痛点与思考
各位看雪的大佬们、朋友们,大家好!
近期在处理某瑞数**防护的网站时,相信不少同行都深有体会,其复杂的JS混淆、请求后缀和Cookie的生成机制,让传统的爬虫或逆向分析变得异常困难且耗时。
我通过网络搜索和B站视频学习,发现主流的解决方案往往过于复杂(涉及大量AST、JS还原或模拟执行),或者是一些培训机构的引流内容,难以找到一种相对简单、快速、且行之有效的应对思路。
因此,我一直在思考:有没有一种“非传统”的、能绕开复杂JS逻辑分析,直接获取所需参数和Cookie的相对简单方法?
正是基于这些痛点,我探索出了一种利用浏览器自身环境优势并结合外部拦截的“异步”解决方案。
我的解决方案核心思路非常直接:既然瑞数的JS逻辑非常复杂,难以在外部环境(如Node.js)中中完整重现,那就让它在最擅长的环境——浏览器中运行!
我们知道,瑞数会重写浏览器中的发包函数(如XMLHttpRequest.prototype.send或fetch),以便在发送请求时动态加上所需的动态参数或更新Cookie。
执行端(浏览器): 我通过填表(即在浏览器控制台或通过Selenium/Puppeteer等工具)执行特定的发包脚本,触发一个预期的请求。
发包脚本: 这个脚本可以是简单的fetch或XMLHttpRequest,但它会被瑞数的JS逻辑所拦截和修改。
中间人端(Burp/Fiddler/mitmproxy): 在浏览器执行发包脚本后,瑞数JS必然会拦截并修改这个即将发出的请求,使其携带正确的参数和Cookie。
设置中间人代理: 确保浏览器所有流量经过中间人工具(如mitmproxy)。
浏览器端操作: 通过自动化工具或手动在控制台执行一个**“触发”发包**的JS脚本。
示例(伪代码): fetch('目标URL?params=trigger', {headers:{...}})
中间人拦截: 拦截所有从浏览器发出的请求。
定位与存储: 识别那个带有正确瑞数参数/Cookie的特定请求。
数据提取: 从该被拦截的请求中,提取出:
动态URL后缀/参数(如url后缀=...)。
动态Cookie(如动态cookie=...)。
后续使用: 将这些提取到的参数/Cookie用于后续的HTTP请求库(如Python的requests)中。
由于我们的发包脚本是通过浏览器执行,而抓包拦截则是在代理层完成,两者在执行层面是分离的。
传统的HTTP请求: 可以做到同步RPC(Request-Process-Complete),即发送请求后立即等待响应。
本方案: 无法做到发送一个“触发”请求,然后立即同步返回修改后的参数和Cookie。 这是一个异步的过程。
浏览器: 发送带有正确瑞数参数的请求。
中间人: 拦截、存储正确的瑞数参数。
主程序: 等待中间人存储完成后,再去读取并使用。
为了解决异步问题,需要引入一个共享存储或通信机制:
方案一:中间人插件 + 本地文件/数据库
中间人拦截到数据后,通过插件将数据写入本地文件或数据库。
主程序(如Python爬虫)监控或查询该文件/数据库,获取最新参数。
方案二:中间人插件 + API服务
中间人拦截到数据后,通过插件调用一个本地API服务,将数据POST过去。
主程序通过GET请求该API服务,获取最新参数。
通过这种方式,我们巧妙地避开了对瑞数JS代码的深度分析,而将其视为一个**“黑盒加解密机”**,我们只关注它产出的结果。
要验证本方案的有效性,我们只需要一个简单的快速测试流程,核心是确认浏览器脚本生成的请求是否确实包含了瑞数所需的合法动态参数。
触发与拦截准备:
在您的中间人抓包软件(如Burp Suite, Fiddler, 或 mitmproxy)中,对目标请求(例如:891K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5P5s2S2^5i4K6u0W2j5$3!0E0i4K6u0r3P5s2S2^5)设置请求断点。
在浏览器**控制台(Console)**中,执行一个简单的发包脚本来触发目标请求,例如:
JavaScript
获取动态参数:
脚本执行后,请求会被抓包软件的断点拦截下来。
此时,被瑞数JS处理后的请求会包含正确的动态参数(如 URL 中的 参数)和/或正确的动态 Cookie。
复制这个被拦截请求中的动态后缀参数和/或完整的 Cookie 头部。
重放测试:
将上述复制的参数和 Cookie 应用到您的HTTP 发包工具(如 Postman、Insomnia 或 Burp Repeater)中。
发送这个重构后的请求。
结果判定:
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!