某post请求参数加密过程详解

抓包发现 这个post请求 如下
可以发现post请求的参数变成一堆奇怪的字符串
这样的话 就没办法分析具体有哪些参数了
接着我就解了下这个加密的过程
在这里插入图片描述首先url上带了 参数 rcuuid 和rcdesc
在这里插入图片描述可以发现 rcdesc是个固定值 “提交一个Query进行计算” 然后rcuuid是个变值 应该是随机生成的uuid

然后再看下面那个 request payload 里面本应该是一串json格式数据 然而就是被加密了

那就来解下 开始

首先就看看它发ajax请求的时候这步
在这里插入图片描述这里就已经能初步推断出post的参数data就是这个了 只不过发请求的时候被加密了

那我们就在发ajax的时候打个断点
在这里插入图片描述可以发现这个w就是加密后的值
那么这个w怎么来的
继续往上看

w = function(e, t) {
            return e ? "string" == typeof e ? e : p === g || "GET" == t ? he(e) : JSON.stringify(e) : null
        }(s.data, y)

在这里插入图片描述
在这里插入图片描述
结合上面代码分析,其实意思就是把这个s.data (就是post请求的参数)变成json字符串发送post请求 基本可以确定了

那我们具体来看看这个w怎么生成

找下调用栈
在这里插入图片描述

在me这个调用栈 可以发现 w是通过 o.LZString.compressToBase64(w)这个函数生成的
看到了熟悉的base64 但这里肯定不是用的原生的base64 肯定是改动过的
接着就看这个方法怎么实现的

找到函数的位置
在这里插入图片描述就是这个函数了 这段代码意思是 再把这个data传到另一个加密函数

var n = o.LZString._compress(r, 6, function(r) {
                return t.charAt(r)
            });

这个里面的n就是返回的加密字符串
后面就是根据这个加密字符串长度 根据4的余数 在字符串最后拼接有多少个=号

所以上面那段加密其实也不是真正的加密,,只是对加密的字符串末尾加上不同数量的=号罢了

那么我们再看看里面这个函数

o.LZString._compress(r, 6, function(r) {
                return t.charAt(r)
            })

有三个参数 第一个就是参数data,第二个参数是固定数字6,第三个参数是一个函数

找到这个函数的位置
在这里插入图片描述

        _compress: function(r, o, n) {
            if (null == r)
                return "";
            var t, e, i, s = {}, p = {}, c = "", u = "", a = "", l = 2, f = 3, h = 2, d = [], m = 0, g = 0;
            for (i = 0; i < r.length; i += 1)
                if (c = r.charAt(i),
                Object.prototype.hasOwnProperty.call(s, c) || (s[c] = f++,
                p[c] = !0),
                u = a + c,
                Object.prototype.hasOwnProperty.call(s, u))
                    a = u;
                else {
                    if (Object.prototype.hasOwnProperty.call(p, a)) {
                        if (a.charCodeAt(0) < 256) {
                            for (t = 0; t < h; t++)
                                m <<= 1,
                                g == o - 1 ? (g = 0,
                                d.push(n(m)),
                                m = 0) : g++;
                            for (e = a.charCodeAt(0),
                            t = 0; t < 8; t++)
                                m = m << 1 | 1 & e,
                                g == o - 1 ? (g = 0,
                                d.push(n(m)),
                                m = 0) : g++,
                                e >>= 1
                        } else {
                            for (e = 1,
                            t = 0; t < h; t++)
                                m = m << 1 | e,
                                g == o - 1 ? (g = 0,
                                d.push(n(m)),
                                m = 0) : g++,
                                e = 0;
                            for (e = a.charCodeAt(0),
                            t = 0; t < 16; t++)
                                m = m << 1 | 1 & e,
                                g == o - 1 ? (g = 0,
                                d.push(n(m)),
                                m = 0) : g++,
                                e >>= 1
                        }
                        0 == --l && (l = Math.pow(2, h),
                        h++),
                        delete p[a]
                    } else
                        for (e = s[a],
                        t = 0; t < h; t++)
                            m = m << 1 | 1 & e,
                            g == o - 1 ? (g = 0,
                            d.push(n(m)),
                            m = 0) : g++,
                            e >>= 1;
                    0 == --l && (l = Math.pow(2, h),
                    h++),
                    s[u] = f++,
                    a = String(c)
                }
            if ("" !== a) {
                if (Object.prototype.hasOwnProperty.call(p, a)) {
                    if (a.charCodeAt(0) < 256) {
                        for (t = 0; t < h; t++)
                            m <<= 1,
                            g == o - 1 ? (g = 0,
                            d.push(n(m)),
                            m = 0) : g++;
                        for (e = a.charCodeAt(0),
                        t = 0; t < 8; t++)
                            m = m << 1 | 1 & e,
                            g == o - 1 ? (g = 0,
                            d.push(n(m)),
                            m = 0) : g++,
                            e >>= 1
                    } else {
                        for (e = 1,
                        t = 0; t < h; t++)
                            m = m << 1 | e,
                            g == o - 1 ? (g = 0,
                            d.push(n(m)),
                            m = 0) : g++,
                            e = 0;
                        for (e = a.charCodeAt(0),
                        t = 0; t < 16; t++)
                            m = m << 1 | 1 & e,
                            g == o - 1 ? (g = 0,
                            d.push(n(m)),
                            m = 0) : g++,
                            e >>= 1
                    }
                    0 == --l && (l = Math.pow(2, h),
                    h++),
                    delete p[a]
                } else
                    for (e = s[a],
                    t = 0; t < h; t++)
                        m = m << 1 | 1 & e,
                        g == o - 1 ? (g = 0,
                        d.push(n(m)),
                        m = 0) : g++,
                        e >>= 1;
                0 == --l && (l = Math.pow(2, h),
                h++)
            }
            for (e = 2,
            t = 0; t < h; t++)
                m = m << 1 | 1 & e,
                g == o - 1 ? (g = 0,
                d.push(n(m)),
                m = 0) : g++,
                e >>= 1;
            for (; ; ) {
                if (m <<= 1,
                g == o - 1) {
                    d.push(n(m));
                    break
                }
                g++
            }
            return d.join("")
        },

可以发现这个才是真正的加密函数

抠出这个函数 先在浏览器试试运行下
在这里插入图片描述可以发现是一样的,,那么加密函数就是这个了 后面就是根据这个字符串长度取4的余数来添加=号了

我再在node上模拟下 看看结果会变不

首先扣出函数的js代码 试着改一下 因为第三个参数是一个函数
我们用python调用js的话是不能直接传函数的
在这里插入图片描述那么这里就直接把这个函数写死吧
在这里插入图片描述可以发现也是一模一样的

好了 data加密已经解出来了。

接着分析下具体的参数

在这里插入图片描述这里面有一个limit offset 很明显就是用来翻页的 下面再加了个时间戳

`{"query":{"resid":"/SCHSJC/app/hsjc.app/jcjg/hscxfx/cyxxcx_20220427yh.spg","fields":[{"name":"CALCULATOR_2"},{"name":"JCJGOU"},{"name":"SGTXM"},{"name":"ZJLX"},{"name":"ZJHM"},{"name":"XM"},{"name":"XB"},{"name":"CYRQ"},{"name":"LXFS"},{"name":"JCLX"},{"name":"QMJCID"},{"name":"JCRQ"},{"name":"YBLX"},{"name":"JCJG"},{"name":"HSJCLX"},{"name":"CYDD"},{"name":"CYRY"},{"name":"XZQH"},{"name":"SSRQ"},{"name":"JCPC"},{"name":"HYFS"},{"name":"XS"}],"sources":null,"select":true,"filter":[],"params":[{"name":"fieldsFilter1","value":"[{\\"clauses\\":[{\\"leftExp\\":\\"CYRQ\\",\\"operator\\":\\"=\\",\\"rightValue\\":\\"20220612\\"}]}]"},{"name":"combobox2","value":"2"}],"sort":[],"options":{"needCodeDesc":true,"autoSort":true,"cache":true,"limit":20,"offset":20,"queryBlobFlag":true,"queryTotalRowCount":false,"needHighlightKeyword":true,"highlightPreTag":"<em class='sz-keyword'>","highlightPostTag":"</em>"},"queryId":"model3","resModifyTime":1651852697419},"resid":"/SCHSJC/app/hsjc.app/jcjg/hscxfx/cyxxcx_20220427yh.spg"}`

其他的应该都是些定值

带上这个加密字符串请求 可以看到成功了!
在这里插入图片描述

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在Delphi中使用POST方法发送HTTPS请求,可以按照以下步骤执行: 1. 首先,需要在Delphi项目中使用Indy组件库。可以通过在菜单栏中选择"Component" -> "Install Packages",然后选择"Indy System"来安装该组件库。 2. 在Delphi中创建一个新的Form或Unit,并添加一个按钮控件,用于触发发送HTTPS请求的操作。 3. 在按钮的点击事件中,编写以下代码来发送HTTPS请求: var IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create(nil); try IdHTTP.HandleRedirects := True; IdHTTP.ProtocolVersion := pv1_1; // 设置协议版本为HTTP 1.1 IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; IdHTTP.Request.Charset := 'utf-8'; // 将需要发送的数据进行编码,并设置到请求参数中 // 这里假设要发送的数据为name=John&age=30 IdHTTP.Request.Params.Add('name=' + TIdURI.ParamsEncode('John')); IdHTTP.Request.Params.Add('age=' + TIdURI.ParamsEncode('30')); // 发送POST请求 IdHTTP.Post('https://example.com'); // 获取响应内容 ShowMessage(IdHTTP.ResponseText); finally IdHTTP.Free; end; end; 在上述代码中,我们首先创建了一个TIdHTTP对象,并设置了一些必要的属性,如处理重定向、协议版本、内容类型和字符集。 然后,我们将要发送的数据进行URL编码,并将其添加到请求参数中。 接下来,我们调用IdHTTP的Post方法,传入https://example.com作为请求的URL。这会发送一个POST请求,其中包含我们设置的请求参数。 最后,我们获取服务器的响应内容,并将其显示在一个消息框中(可以根据实际需求进行处理)。 以上就是使用Delphi发送HTTPS POST请求的基本步骤。当然,实际情况可能会更加复杂,还需要根据具体的接口文档或业务需求进行相应的参数设置和处理。 ### 回答2: Delphi是一种用于创建Windows应用程序的编程语言。在Delphi中,可以使用TIdHTTP组件来进行HTTP请求。要进行POST请求并使用HTTPS协议,可以按照以下步骤进行操作: 第一步是导入所需的单元。需要使用IdHTTP单元来进行HTTP请求,并使用IdSSLOpenSSL单元来处理HTTPS请求。在Delphi中,可以通过使用uses关键字将它们导入到代码中。 第二步是创建一个IdHTTP对象。可以使用TIdHTTP类创建一个新的实例。例如,可以声明一个名为HTTP的变量作为TIdHTTP的实例。 第三步是设置相关参数。在进行HTTPS请求时,需要设置SSL相关参数。可以使用TIdSSLIOHandlerSocketOpenSSL类创建一个新的实例,并将其分配给IdHTTP对象的IOHandler属性。然后,需要设置SSL相关参数,如SSLVersion和SSLCipherSet等。 第四步是创建要发送的数据。可以使用TStringList类创建一个新的实例,并添加要发送的数据。 第五步是发送HTTP请求。使用IdHTTP对象的Post方法,并传递请求的URL和发送的数据。 第六步是接收HTTP响应。可以使用TMemoryStream类创建一个新的实例,并将其分配给IdHTTP对象的Response属性。然后调用IdHTTP对象的Get方法,将响应数据保存到内存流中。 最后一步是处理响应数据。可以从内存流中读取响应数据,并对其进行进一步的处理。 总结:Delphi中进行HTTPS的POST请求可以通过使用TIdHTTP和TIdSSLIOHandlerSocketOpenSSL组件来实现。首先创建IdHTTP对象,并设置SSL参数,然后创建要发送的数据。最后,发送HTTP请求并处理响应数据。 ### 回答3: Delphi是一种流行的编程语言,可用于开发Windows应用程序。在Delphi中,使用HTTP协议进行POST请求是相对简单的。而在HTTP请求中使用HTTPS协议,需要额外的设置和步骤来确保请求的安全性。 首先,在Delphi中发送HTTPS请求,需要使用HTTPS的库。Delphi提供了一些第三方库,如Indy和Synapse等,可用于发送HTTPS请求。这些库提供了SSL/TLS协议支持,通过建立安全的加密通道,确保请求的隐私性和完整性。 接下来,我们需要设置HTTPS请求的一些参数,如URL地址、请求方法(POST)、请求头部等。可以使用TIdHTTP类来实现这些设置,该类是Indy库中提供的一个HTTP客户端组件。 在设置完参数后,可以通过TIdHTTP的Post方法来发送HTTPS请求。该方法将会自动处理SSL/TLS握手过程,确保与服务器建立安全连接。在发送请求时,可以传递需要的请求参数,如表单数据或JSON数据等。 发送HTTPS请求后,可以使用TIdHTTP的Response属性获取服务器的响应数据。根据实际需求,可以对响应进行解析和处理。 需要注意的是,在使用HTTPS协议时,服务器端需要使用有效的SSL证书。如果服务器端证书无效或过期,可能会导致HTTPS请求无法成功。为了确保请求的安全性,可以验证服务器端证书的合法性。 总之,Delphi中发送HTTPS请求需要使用支持SSL/TLS的库,设置请求参数,并通过Post方法发送请求。考虑到安全性,需要验证服务器端证书的有效性。使用HTTPS协议可以确保请求的安全性,对于需要传输敏感信息的场景特别有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值