JS逆向实战22——某政府采购网简单cookie反爬

文章讲述了如何通过分析JavaScript代码和cookie策略,破解一个网站的保护机制,目标是获取PYCCS值。作者提到使用正则提取值的方法并非最优,寻求更高效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

目标网站

网站:aHR0cDovL3d3dy55bmdwLmNvbS8=

目标

类似于这种 进入前检查浏览器... 如何跳转

页面分析

我们发现这种网站有点类似于5s盾。但是和5s盾不一样的是,这个网站是依靠cookie进行的一个判断。
我们去看看cookie到底有什么猫腻
经过反复用代码测试。
得知这个PYCCS 是请求的关键。那其实很简单了。如何得到这个值就是我们的目标了

JS分析

我们请求页面。

页面返回了一段JS。和一个cookie

然后通过转换一些列操作。

得到第一个传参 P的值

var _$ = ['\x23\x63\x68\x61\x6c\x6c\x65\x6e\x67\x65', '\x23\x77\x61\x66\x5f\x61\x6e\x73\x77\x65\x72', '\x23\x43\x68\x61\x6c\x6c\x65\x6e\x67\x65\x46\x6f\x72\x6d'];
$(_$[0])["\x73\x68\x6f\x77"]();
$(function () {
    setTimeout(function () {
        var x06dd1a = {};
        var x0fcad9;
        var x08c924 = 0x26;
        var x01c264 = navigator["\x75\x73\x65\x72\x41\x67\x65\x6e\x74"]["\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65"]();
        x08c924 = x08c924 * 0x63;
        (x0fcad9 = x01c264["\x6d\x61\x74\x63\x68"](/msie ([\d.]+)/)) ? x06dd1a["\x69\x65"] = x0fcad9[0x1] 
: (x0fcad9 = x01c264["\x6d\x61\x74\x63\x68"](/firefox\/([\d.]+)/)) ? x06dd1a["\x66\x69\x72\x65\x66\x6f\x78"] = x0fcad9[0x1] 
: (x0fcad9 = x01c264["\x6d\x61\x74\x63\x68"](/chrome\/([\d.]+)/)) ? x06dd1a["\x63\x68\x72\x6f\x6d\x65"] = x0fcad9[0x1] 
: (x0fcad9 = x01c264["\x6d\x61\x74\x63\x68"](/opera.([\d.]+)/)) ? x06dd1a["\x6f\x70\x65\x72\x61"] = x0fcad9[0x1] 
: (x0fcad9 = x01c264["\x6d\x61\x74\x63\x68"](/version\/([\d.]+).*safari/)) ? x06dd1a["\x73\x61\x66\x61\x72\x69"] = x0fcad9[0x1] 
: 0x0;
        x08c924 = x08c924 + 0x2e;
        if (x06dd1a["\x69\x65"] 
|| x06dd1a["\x66\x69\x72\x65\x66\x6f\x78"] 
|| x06dd1a["\x63\x68\x72\x6f\x6d\x65"] 
|| x06dd1a["\x6f\x70\x65\x72\x61"] 
|| x06dd1a["\x73\x61\x66\x61\x72\x69"]) {
            x08c924 = (x08c924 * 0x3 + 0x7);
            if (x08c924 < 0x7b) x08c924 = x08c924 + 0x929;
            var x0b515d = $(_$[1]);
            if (x08c924 > 0x929) x08c924 = Math["\x66\x6c\x6f\x6f\x72"](x08c924 / 0x7b);
            x0b515d["\x76\x61\x6c"](x08c924);
            $(_$[2])["\x73\x75\x62\x6d\x69\x74"]()
        }
    }, 0x3e8)
});

然后通过AST去解码

var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
$(_$[0])["show"]();
$(function () {
  setTimeout(function () {
    var x06dd1a = {};
    var x0fcad9;
    var x08c924 = 38;
    var x01c264 = navigator["userAgent"]["toLowerCase"]();
    x08c924 = x08c924 * 99;
    (x0fcad9 = x01c264["match"](/msie ([\d.]+)/)) ? x06dd1a["ie"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/firefox\/([\d.]+)/)) ? x06dd1a["firefox"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/chrome\/([\d.]+)/)) ? x06dd1a["chrome"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/opera.([\d.]+)/)) ? x06dd1a["opera"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/version\/([\d.]+).*safari/)) ? x06dd1a["safari"] = x0fcad9[1] 
: 0;
    x08c924 = x08c924 + 46;
    if (x06dd1a["ie"] 
|| x06dd1a["firefox"] 
|| x06dd1a["chrome"] 
|| x06dd1a["opera"] 
|| x06dd1a["safari"]) {
      x08c924 = x08c924 * 3 + 7;
      if (x08c924 < 123) x08c924 = x08c924 + 2345;
      var x0b515d = $(_$[1]);
      if (x08c924 > 2345) x08c924 = Math["floor"](x08c924 / 123);
      x0b515d["val"](x08c924);
      $(_$[2])["submit"]();
    }
  }, 1000);
});

然后我删掉有关JQuery的操作 形成如下代码

navigator = {
  "userAgent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',

}

var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
var x06dd1a = {};
var x0fcad9;
var x08c924 = 38;
var x01c264 = navigator["userAgent"]["toLowerCase"]();
x08c924 = x08c924 * 99;
(x0fcad9 = x01c264["match"](/msie ([\d.]+)/)) ? x06dd1a["ie"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/firefox\/([\d.]+)/)) ? x06dd1a["firefox"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/chrome\/([\d.]+)/)) ? x06dd1a["chrome"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/opera.([\d.]+)/)) ? x06dd1a["opera"] = x0fcad9[1] 
: (x0fcad9 = x01c264["match"](/version\/([\d.]+).*safari/)) ? x06dd1a["safari"] = x0fcad9[1] 
: 0;
x08c924 = x08c924 + 46;
if (x06dd1a["ie"] 
|| x06dd1a["firefox"] 
|| x06dd1a["chrome"] 
|| x06dd1a["opera"] 
|| x06dd1a["safari"]) {
  x08c924 = x08c924 * 3 + 7;
  if (x08c924 < 123) x08c924 = x08c924 + 2345;
  if (x08c924 > 2345) x08c924 = Math["floor"](x08c924 / 123);
}
console.log(x08c924 )

打印下这个x08c924 这个值 发现是92。

到这里 貌似进行不下去了。进行不下去的时候。我们重新回去看页面。
我们搜索set-cookie 看看哪里是设置cookie的地方


然后发现 诶嘿 还真有个请求里有设置 PYCCS的值。我们点进请求再看看。

我们发现这是个post的302请求。并且有个data传参是45。

同样是数字,我们上文也拿到了一个值92。那这两个数字之间有没有什么关系呢?
我们反复请求这个页面。重复上面的操作几次。
对比所得到的的x08c924

本人所用的方法是通过正则提取几个不一样的值。然后再放入JS中。从而拿到cookie
但是我觉得这种方法太笨了。可能不是最优解。如果有大佬知道有什么更好的方法。希望告诉我下。

到这里 已经很清楚了。
其实这个网站还是挺简单的。但是从0到1的过程还是挺繁琐的。

结果

<think>好的,我现在需要处理用户关于JavaScript五秒盾逆向分析的请求。首先,用户希望了解如何逆向分析并实现绕过五秒盾的技术。五秒盾通常用于防止虫,会在访问后等待几秒才允许继续操作,可能涉及Cookie验证、JavaScript挑战或网络请求拦截等机制。我需要先回忆五秒盾的常见实现方式。通常,网站可能会设置一个计时器,比如使用setTimeout函数,延迟5秒后执行跳转或解除屏蔽。还可能生成加密的Cookie或Token,需要JavaScript计算后才能通过验证。此外,可能通过AJAX请求向服务器发送验证数据,或者检测浏览器环境是否真实。接下来,用户可能需要具体的逆向步骤。我应该分步骤说明,比如动态分析、静态分析、模拟执行和生成请求。动态分析方面,推荐使用Chrome开发者工具,检查Network面板中的请求和响应,查看是否有延迟的XHR或Fetch请求,以及Cookies的变化。Sources面板可以查找关键函数如setTimeout或eval,定位延迟逻辑。静态分析部分,需要解混淆JavaScript代码,可能使用工具如AST还原或在线混淆平台。然后查找核心验证逻辑,比如Cookie生成代码、Token加密函数或网络请求参数构造。这里可以举例说明如何识别setTimeout的调用,以及如何分析加密函数。 模拟执行是关键,可能需要使用无头浏览器如Puppeteer或Selenium,等待5秒后继续操作。或者直接提取加密算法,用Python或Node.js重新实现,生成所需的Cookie或Token。比如用Python的execjs库执行JavaScript代码,获取必要参数。生成请求时,要注意携带正确的请求头和Cookie,并处理可能的动态Token。需要确保请求顺序和参数与浏览器一致,避免被服务器检测到异常。 然后,用户可能需要示例代码。我可以提供使用Puppeteer等待5秒盾的示例,以及用Python逆向加密参数的例子。比如在Puppeteer中等待5秒后再截图,或者在Python中调用JavaScript函数生成Token。相关问题部分,需要考虑用户可能进一步的问题,比如如何绕过动态加密的Cookie、如何处理WebSocket验证,以及无头浏览器的指纹伪装。这些扩展问题可以帮助用户更全面地理解逆向技术。需要确保回答结构清晰,步骤明确,并引用提供的参考资料中的setTimeout示例,说明延迟执行的可能位置。同时,注意使用正确的中文表达和LaTeX格式,但用户问题中没有数学公式,可能不需要太多数学内容,但如果有变量或代码,需正确格式化。 最后,检查是否有遗漏的步骤,比如调试技巧或常见错误处理,确保回答真实可靠,帮助用户逐步解决问题。</think>### JavaScript五秒盾逆向分析技术实现步骤 #### 一、五秒盾核心机制解析 1. **时间延迟验证**:通过`setTimeout`或`Promise`强制等待5秒后触发跳转逻辑[^2] ```javascript setTimeout(function(){ window.location.href = "/target"; }, 5000); //典型延迟跳转 ``` 2. **浏览器指纹检测**:验证`navigator`对象、WebGL指纹、字体列表等参数 3. **动态加密参数**:生成加密的`Cookie`或请求头参数(如`X-Token`),需JS计算验证 4. **网络请求拦截**:通过XHR/Fetch拦截请求,验证时序合法性 #### 二、逆向分析具体步骤 **1. 动态调试分析** - 使用Chrome开发者工具定位核心验证代码: - 在`Sources`面板搜索`setTimeout`、`debugger`等关键词 - 在`Network`面板过滤`XHR`请求,观察5秒后触发的请求特征 - 示例定位加密参数生成点: ```javascript //引用[1]中检测逻辑示例 jdetects.create(function(e) { var a = 0; var n = setInterval(function() { if ("on" === e) { setTimeout(function() { if (a === 0) { a = 1; setTimeout(Base64.decode(code)); //关键解密逻辑[^1] } }, 200); } }, 100); }); ``` **2. 静态代码解混淆** - 使用AST混淆工具处理压缩代码: ```bash npm install babel-parser # 常用JS混淆工具 ``` - 识别核心加密函数(常见模式): - Cookie生成函数(包含`document.cookie`操作) - 包含`CryptoJS`或`btoa()`的加密代码段 - 时间戳校验逻辑(如`Date.now()`差值验证) **3. 加密算法逆向** - 提取参数生成函数(Python模拟示例): ```python import execjs with open('encrypt.js') as f: ctx = execjs.compile(f.read()) token = ctx.call('generateToken', 'clientKey') # 调用JS函数 ``` **4. 请求链路模拟** - 完整请求需要包含以下要素: ```python headers = { "X-Dynamic-Token": token, "Cookie": f"verify={cookies['verify']}; expire={timestamp}" } ``` #### 三、完整技术实现方案 **方案1:无头浏览器自动等待** ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://protected.site'); await page.waitForTimeout(5000); //强制等待5秒盾 await page.click('#continueBtn'); //执行后续操作 })(); ``` **方案2:算法逆向+直接请求** ```python import requests from cryptography.hazmat.primitives import hashes # 加密算法库 def bypass_shield(): # 逆向生成的加密参数 dynamic_param = calculate_token() response = requests.get(url, headers={ "X-Bypass": dynamic_param, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" }) return response.content ``` #### 四、关键防御绕过技巧 1. **时间戳精度伪装**:在请求头中添加`X-Timestamp`并保持与JS相同的精度 $$ t_{request} = \lfloor \frac{Date.now()}{100} \rfloor \times 100 $$ 2. **内存指纹模拟**:通过`Proxy`对象伪造浏览器API返回值 3. **请求时序模拟**:保持与浏览器相同的请求间隔(误差<50ms)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值