记一次前端一次性sign签名的分析

admin 2025-12-29 00:43:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档分析了某管理系统前端一次性Sign签名的逆向方法,该签名含防重放、时效性及完整性校验。签名逻辑为对请求体参数排序拼接后进行SM3哈希并追加时间戳。作者利用Yakit配合PythonFlask服务在beforeRequest钩子中动态计算并替换签名,实现了对签名机制的自动化绕过,有效降低了渗透测试难度。 综合评分: 88 文章分类: 渗透测试,WEB安全,安全工具,逆向分析


Yakit + flask 模拟签名过程

因为涉及到数据排序的情况,Yak在这一块是继承的golang,也就是要自己实现。对此,我表示,能写,但没必要。有这个时间,用python调用库不香吗?

Python的国密库gmssl

pip install gmssl

流程如下: Yakit webfuzzer ——》热加载 beforeRequest ——》Python flask ——》 热加载 beforeRequest ——》后端

在beforeRequest中,我们要先从req中获取请求体,然后构造http请求,发送给flask。 flask接收到请求体,对其进行分割、排序、拼接,然后进行SM3算法,将结果返回给beforeRequest。

Yakit beforeRequest

beforeRequest = func(https, originReq, req) {
    // 获取请求体
    body_post = poc.GetHTTPPacketBody(req)
    // 发送到flask的数据包
    flask_sign = `POST /sign HTTP/1.1
Host: 127.0.0.1:5000
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

a=1`
    // 发送http请求到flask,将请求中的请求体替换为req中的请求体
    rsq_body, _, _ = poc.HTTP(
        flask_sign,
        poc.https(false),
        poc.replaceBody(body_post, false),
    )
    // 得到签名
    sign = poc.GetHTTPPacketBody(rsq_body)
    // 替换到请求头中
    req = poc.ReplaceHTTPPacketHeader(req, "X-Request-SIGN", sign)
    /*
    一个替换请求参数a的例子
    poc.ReplaceHTTPPacketQueryParam(req, "a", "bbb")
    */
    // 将修改后的请求返回
    return []byte(req)
}

flask

@app.route('/sign', methods=['POST'])
def sign():
    body = request.get_data().decode("utf-8")
    body_list = body.lower().split("&")
    body_list.sort()
    body_sort = "&".join(body_list)
    return sm3_hash(body_sort) + datetime.now().strftime("%Y%m%d%H%M%S%f")[:15]

SM3算法

from gmssl import sm3
import binascii

def sm3_hash(message: str) -> str:
    """
    使用 SM3 算法计算输入消息的哈希值

    参数:
        message: 待计算哈希的字符串

    返回:
        计算结果的十六进制字符串
    """
    # 将输入字符串转换为字节
    message_bytes = message.encode('utf-8')

    # 计算 SM3 哈希
    hash_bytes = sm3.sm3_hash(list(message_bytes))

    # 将字节结果转换为十六进制字符串
    return binascii.hexlify(bytes.fromhex(hash_bytes)).decode('ascii')

结果

开启共用热加载代码 总结

梳理了前端sign签名的分析过程,积累了相关的脚本。

sign校验增加了渗透测试的难度,但通过热加载构造sign,能够让其过程对测试人员透明,降低测试难度。


免责声明:

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

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

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

本文转载自:进击的HACK 进击的hack《记一次前端一次性sign签名的分析》

评论:0   参与:  0