js巧施sort计,py调试401

一般我是不写关于渗透测试方面的文章,一方面是没啥可写,一方面是没有亮点驱使我写。
在某次的测试任务中,发现有个网址在代理抓包后进行重放就401。显然存在某种防重放机制。

找到包签名

通过观察包特征发现了存在以下特征:

  1. header头存在时间戳(毫秒)
  2. header头存在随机数(12位)
  3. header头存在token
  4. header头存在sign签名可以肯定这其中一定存在某些关联,在通过断点调试,得到输入参数为时间戳、随机数、token和提交的参数(不为空)进行sort排序后进行计算得到的sign签名。
    /resources/Pasted_image_20260428203137.png

    最后对排序后的结果计算sha256的哈希值既是sign签名的值了。

py反代

最近比较喜欢使用flask进行反代,无论是aes加密还是国密都是比较容易实现实时的解密处理。
同理,这个网站我当时使用反代进行处理header头信息,实时计算生成伪造的sign签名后进行转发。然后神奇的事情就出现了:网站浏览器访问100%的成功率(访问状态码200),使用py的反代服务成功率只有不到10%(提交参数都没变情况下)。绝大部分都是401状态码,要不是携带cookies,还以为是没登陆造成的。

sort排序

下断点在sha256哈希生成前,发现每次的排序都不太一致。有时时间戳在前、有时token在前,搞不懂规则。就是简单的sort排序而已啊~
然后灵光一闪,该不会javascript的sort和python的sort在排序上有什么区别啊?这里我就问了gemini。

/resources/Pasted_image_20260428205235.png

果然,在这里有个不起眼的大坑。
使用javascript进行测试:
/resources/Pasted_image_20260428205359.png

而python的默认排序不是javascript的默认,而是数字按大小,字母按先后。
/resources/Pasted_image_20260428205551.png

需要加上key=str才能”模拟“javascript的排序方式。

修正

修改反代中的排序后,反代可以100%的进行成功注入签名了。又可以愉快的跑测试工具糊个截图了(虽然网站做的真安全)。

一个sign签名拦截了99.9%的攻击流量,一个sort小妙招,拦截了剩下一部分攻击流量。要是再加上JA3/4指纹,岂不是如虎添翼?
学会了,这就添加到自己的服务器策略中。