JS逆向对抗——记一次渗透测试签名绕过

admin 2026-01-18 02:17:14 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍渗透测试中JS逆向绕过签名验证的方法。核心在于利用不常见参数定位前端加密逻辑,分析算法并编写脚本伪造签名。文章展示了从代码搜索到成功绕过的流程,建议利用AI工具辅助还原加密代码以提升效率,具有较强的实战参考价值。 综合评分: 88 文章分类: 渗透测试,逆向分析,Web安全


cover_image

JS逆向对抗——记一次渗透测试签名绕过

点击关注 👉 点击关注 👉

马哥网络安全

2026年1月17日 21:01 河南

在测试中我们一般都是通过修改前端传入的参数来测试目标是否存在相对应的漏洞,但是如果网站设置了签名验证机制,只要你修改了前端的参数,就会返回签名验证失败从而阻挡了你测试的脚步

但是JS逆向的魅力就在于,只要是你发起的请求带有的参数,无论是什么加密,总能在前端找到相对应的加密逻辑。

只要我们拿到它的加密逻辑,我们就可以编写相对应的加解密脚本来伪造,从而实现绕过签名/加密的防御

下面我就是在测试过程中遇到了签名验证的一个例子,我们接下来就在前端找一找他的实现逻辑

首先我们要先找出他的实现代码在什么位置,这就涉及到关键字的选用了,像下面这个例子我们看他的签名的参数sign很常见,我们一般不直接搜sign,这样直接搜一大堆,效率太慢,但是其他参数比如noncestr就不太常见,我们就可以直接使用这个去间接定位sign值的位置

全局检索noncestr,只有一个匹配,这样就大大提高了我们的定位效率,再周围查看sign值实现代码在哪里

可以看到,就在他的周围就有sign

一般这种参数都是一起封装的,我们只要找到一个的位置,那么在其周围都可以找到其他的参数

找到位置后我们打个定点

可以看到就是这个位置,传入了f的值,然后通过这个值来加密形成签名

我们在控制台打印看看f的只是什么

ok,接下来我们跟进签名实现的方法,看看代码逻辑

 c = function(e, n)  {   var r = t.wordsToBytes(s(e));   return n && n.asBytes ? r : n && n.asString ? i.bytesToString(r) : t.bytesToHex(r) }

当我们走完这个方法后,sign值就出来了

控制台输出一下

可以看到,这里s()这个方法就是sign值的生成方法

我们改一下参数,生成其他的值了,这样我们就可以任意伪造sign的值了

我们将生成的值放入我们的数据包,成功实现签名伪造绕过

如果不想手动还原代码,就把你拿到的加密逻辑一股脑丢给AI,让AI分析并写出加密逻辑

f = function() {  var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}    , n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : u    , r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]    , o = t({}, e)    , i = {      appSignKey: n    }    , a = Date.now();  e.serverTimestamp && !l && (l = e.serverTimestamp - a),    o.timestamp = a + l,    o.noncestr = c(8, "number");  var f = Object.keys(o).filter((function(e) {    return void 0 != o[e] && "" !== o[e] || (delete o[e],                                             !1)  }                                )).concat("appSignKey").sort().map((function(e) {    var t = i[e] || (void 0 == o[e] ? "" : o[e]);    return "".concat(e, "=").concat(t)  }                                                                   )).join("&");  return r && console.log("sign", e, f),    o.sign = s(f),    o}
//下面是s()实现function(e, n) {                            var r = t.wordsToBytes(s(e));                            return n && n.asBytes ? r : n && n.asString ? i.bytesToString(r) : t.bytesToHex(r)                        }

import hashlib
def generate_sign(sign_str):    """    核心SHA1加密方法 (还原JS里的s()函数)    :param sign_str: 拼接好的待签名原始字符串    :return: 小写的sha1签名结果,和JS完全一致    """    sha1 = hashlib.sha1()    # 转bytes格式,utf-8编码,JS默认也是该编码,无乱码问题    sha1.update(sign_str.encode('utf-8'))    # 生成16进制小写字符串,完美还原 JS bytesToHex + 转小写    return sha1.hexdigest()
# -------------------------- 你提供的【正确待签名串】 --------------------------raw_str = "appSignKey=4bTogwpz7RzNO2VTFtW7zcfRkAE97ox6ZSgcQi7FgYdqrHqKB7aGqEZ4o7yssa2aEXoV3bQwh12FFgVNlpyYk2Yjm9d2EZGeGu3&noncestr=48025550&timestamp=1768236168865"# 生成签名final_sign = generate_sign(raw_str)# 打印结果print("最终生成的sign签名值:", final_sign)

这篇文章主要是分享一个加密逻辑的定位技巧,还有如何结合AI编写加密脚本,例子不重要,思路才重要。

文章转自先知社区,原作者云逸,侵删

今日福利

为了帮助大家入门网安,给大家推荐一份《新手Web安全入门到精通》,共474页,包括代码审计、web漏洞、靶场实例分析、信息收集、渗透思路等,将Web安全攻防知识点一网打尽。

代码配图,简单明了,攻防思路清晰透彻,关键是里面还配有多张思维导图,通俗易懂,实用性非常强,很适合新手学习参考~

以上资料获取请扫码

识别上方二维码

备注:web安全入门到精通

100%免费领取

(是扫码领取,不是在公众号后台回复,别看错了哦)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:马哥网络安全 点击关注 👉 点击关注 👉《JS逆向对抗——记一次渗透测试签名绕过》

评论:0   参与:  0