记一次JS逆向-新榜数据nonce和xyz参数分析

分析网站:https://www.newrank.cn/ranklist/gongzhonghao

这次我们要分析的是该网站的接口 文化 按钮中的noncexyz参数。

注意:
一定要点击文化按钮进行请求数据,我已经吃了大亏,一开始点击了文化按钮进行抓包,找到如下数据包后,开始debug测试时,点击刷新,一直进不了debug,搞得我以为这个网站的加密升级到进制debug,在这里浪费了好长时间(当然,最开始也有因为用关键词搜索时找到了干扰的js文件,这里还是看了https://blog.youkuaiyun.com/qq_64095740/article/details/141093492这篇文章,学到了一个根据调用堆栈找到js文件,再用关键关键词搜索的技巧,才顺利的找到核心加密代码),到处找教程,最后偶然点了一次文化按钮进行请求,发现可以进debug。

在这里插入图片描述
在这里插入图片描述

1、发送请求

打开网页https://www.newrank.cn/ranklist/gongzhonghao

点击F12,来到网络,先清空数据,然后点击文化按钮,可以看到我们会发送一个请求

在这里插入图片描述

如果进入网页后,直接来到网络这里,然后发送请求的话会有大量的干扰包,不利于我们找到有用的数据包。

2、查看数据包

查看数据包,找到要破解的密文nonce、xyz

在这里插入图片描述

3、点击栈跟踪

通过观察可以发现

在这里插入图片描述

这里主要涉及到的js文件有

在这里插入图片描述

然后我们点击调试器中的

在这里插入图片描述
将代码展开

4、关键词搜索

ctrl+f 进入在文件中查找,输入关键词xyz,或nonce

在这里插入图片描述

在该文件中找到关键代码,此时不用急,先把其余文件搜索完,然后发现其余文件中均没有该关键词。

这里提一下我最开始的做法,我是直接上来就ctrl+shift+f 关键词搜索,然后找到了很多跟上图一样的代码块,然后就在哪里测试,浪费了很多时间。

5、debug

在我们找的关键词位置打两个断点

在这里插入图片描述
然后点击文化按钮,点击刷新是不会发送这个请求的,也就不会进入这个断点调试

根据代码可以看到nonce是 c 得到的值,c做了一个随机数的操作

我们可以点击下一步就可以看到nonce的值

在这里插入图片描述

接着再看xyz的值b()®,调用了一个b函数,然后传入r

所以我们可以看一下r的值,在控制台输入r,我们就可以拿到r的值,

在这里插入图片描述

点击下一步,直到跳转到另一个js文件

在这里插入图片描述

一直点击下一步,会发现它带我们调用的是88970下的函数,这里会用比较长的时间。在循环时可以按住F11或F9(浏览器不同,下一步按键就不同)不松,看一看都调用了哪些函数
在这里插入图片描述

这些函数调用完后就会带我们回到关键词的代码那里

然后再控制台输入b()®会得到xyz的值
在这里插入图片描述

停止调试后,可以看到发送了请求数据,然后跟数据包中的xyz对比一下,是一样的,此时就确定了这是xyz和nonce加密的关键代码

6、扣代码

这一步也可以提前在测试nonce的值时做

我们将生成nonce的代码复制出来,运行该代码,得到值,由于是随机数,所以每次运行的nonce的值会不同

var c = Math.random().toString(16).slice( - 9);
return r += '&nonce='.concat(c),
a.nonce = c,
将r的值提出来
let r = "/nr/user/wx/getTempQrCode?AppKey=joker&scene=portal_login&type=1";

const nonce = Math.random().toString(16).slice(-9);// '&nonce=0f7c6816d'
 // r += "&nonce=".concat(c);
console.log("获取nonce:", nonce);

在这里插入图片描述

然后再扣下xyz的代码,找到刚刚调用过的函数,可以直接将88970下的所有代码都复制下来,但是会有一些错误,仔细观察后,发现它只调用了**!function (o)**中的代码于是我将其中的代码全部复制下来

'use strict';
        function i(e, t) {
   
   
          var n = (65535 & e) + (65535 & t);
          return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
        }
        function a(e, t, n, r, o, a) {
   
   
          var u;
          return i((u = i(i(t, e), i(r, a))) << o | u >>> 32 - o, n)
        }
        function u(e, t, n, r, o, i, u) {
   
   
          return a(t & n | ~t & r, e, t, o, i, u)
        }
        function c(e, t, n, r, o, i, u) {
   
   
          return a(t & r | n & ~r, e, t, o, i, u)
        }
        function s(e, t, n, r, o, i, u) {
   
   
          return a(t ^ n ^ r, e, t, o, i, u)
        }
        function l(e, t, n, r, o, i, u) {
   
   
          return a(n ^ (t | ~r), e, t, o, i, u)
        }
        function f(e, t) {
   
   
          e[t >> 5] |= 128 << t % 32,
          e[(t + 64 >>> 9 << 4) + 14] = t;
          var n,
          r,
          o,
          a,
          f,
          p = 1732584193,
          d = - 271733879,
          y = - 1732584194,
          m = 271733878;
          for (n = 0; n < e.length; n += 16) r = p,
          o = d
在网页操作中获取或生成 `nonce` `sign` 参数通常涉及对前端 JavaScript 逻辑的逆向分析,尤其是当这些参数是通过动态方式生成并用于请求签名时。以下是针对这一需求的详细说明: ### 获取 nonce 的方法 `nonce`(即“一次性随机数”)通常是防止重放攻击的一种安全机制,它可能由服务器端生成并返回给客户端,也可能由客户端通过特定算法生成。在一些网站中,`nonce` 是基于时间戳、随机字符串或者其他规则组合而成的值。 - 在某些情况下,可以通过查看页面源码或者网络请求响应中的 cookies、headers 或 body 来直接找到 `nonce` 值。 - 如果 `nonce` 是通过 JavaScript 动态生成,则需要定位到相关的 JS 函数,并理解其生成逻辑[^4]。有时这个过程可能包括解析复杂的混淆代码,此时可以借助调试工具如 Chrome DevTools 设置断点逐步执行来追踪 `nonce` 的生成流程。 ### 生成 sign 签名的方法 `sign` 签名一般是将一组数据按照一定顺序拼接后,再经过哈希算法处理得到的结果。常见的哈希算法有 MD5, SHA1, SHA256 等。为了生成正确的 `sign`,你需要知道: - 参与签名的数据字段有哪些; - 这些字段是否需要按特定排序进行拼接; - 使用了哪种加密算法以及是否有额外的密钥(secret key)参与运算。 例如,在某个案例中提到使用了标准的 MD5 加密来生成 `xyz` 参数,这表明可以直接用 Python 实现类似的加密逻辑[^2]。下面是一个简单的示例,展示如何使用 Python 来计算一个字符串的 MD5 哈希值: ```python import hashlib def generate_md5(input_string): md5_hash = hashlib.md5() md5_hash.update(input_string.encode('utf-8')) return md5_hash.hexdigest() # 示例输入 input_str = "/xdnphb/main/v1/week/rank?AppKey=joker&end=2022-10-23&rank_name=科技&rank_name_group=资讯&start=2022-10-17&nonce=88afb83b0" sign = generate_md5(input_str) print("MD5 Sign:", sign) ``` ### 分析与还原步骤 1. **监控网络请求**:利用浏览器开发者工具监控相关接口调用,录下所有发送至服务器的参数,特别是那些看起来像是签名或临时令牌的参数。 2. **查找生成逻辑**:搜索页面中的 JavaScript 文件,寻找与 `nonce` 或 `sign` 相关的关键字,尝试识别出负责生成这些参数的函数。 3. **模拟实现**:一旦明确了具体的生成规则,就可以着手编写相应的程序来复现该过程。如果原始实现依赖于浏览器环境下的某些特性(比如 window 对象),那么可能还需要考虑使用 Headless 浏览器或是 Node.js 环境来进行更准确的模拟。 通过以上步骤技术手段,通常能够成功地从网页操作中获取或自行生成所需的 `nonce` `sign` 参数。当然,每个网站的具体实现细节可能会有所不同,因此实际操作时还需结合具体情况灵活应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whoam_laowei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值