web逆向-解决某服务平台webpack的请求体加密和对返回结果解密

解决webpack

  • 0 声明
  • 1 分析
  • 2 思路

0 声明

此文章仅用于技术交流

1 分析

脱敏地址:aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw/Y29kZT05MDAwMCZmbGFnPWZhbHNlJmdiRmxhZz10cnVl
经抓包分析,可见该网站的接口为POST请求,其中请求体和返回结果都加密
在这里插入图片描述
在这里插入图片描述
通过拦截器interceptors.request.useinterceptors.response.use可定位加密和解密的位置
首先对请求体加密位置进行定位,可以搜索到三处地方用到了拦截器,逐一打上断点,看会在哪里断住
在这里插入图片描述
最终发现是变量e经过u.a后从明文变成了密文,可判断u.a为请求体加密的函数
在这里插入图片描述
再去找u是什么,发现上面定义了变量u = n("7d92"),在此处打上断点,刷新页面,进入到u函数里
发现u为函数o,通过特征分析这是一个webpack打包技术,一般webpack涉及的代码量比较多,且会循环套用,一个一个函数去补环境是费时费力的事情,我们直接把全部代码拿到本地

function o(t) {
        if (n[t])
            return n[t].exports;
        var i = n[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(i.exports, i, i.exports, o),
        i.l = !0,
        i.exports
    }

首先运行一下代码,看一下缺什么,发现缺少window和userAgent,根据经验对其补充,除此之外,代码中进行了环境检测的初始化,需要补大量的环境,但是对我们来说不进行环境检测是更好的选择,所以可以注释掉其中环境检测的部分
在这里插入图片描述

2 思路

在外部定义一个变量:window

window = global;

在核心函数的下方把核心函数赋值给window下的一个自定义变量
在这里插入图片描述
查看代码发现需要传入一个e值,在之前的分析中看到传入的是是7d92
加密处代码为u.a(e)
e为一个包含页数的JSON,复制到本地进行测试,发现正常请求

let page_number = 1
let eData = {
    "transformRequest": {},
    "transformResponse": {},
    "timeout": 30000,
    "xsrfCookieName": "XSRF-TOKEN",
    "xsrfHeaderName": "X-XSRF-TOKEN",
    "maxContentLength": -1,
    "headers": {
        "common": {
            "Accept": "application/json, text/plain, */*"
        },
        "delete": {},
        "get": {},
        "head": {},
        "post": {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        "put": {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        "patch": {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        "Accept": "application/json",
        "Content-Type": "application/json",
        "channel": "web"
    },
    "withCredentials": false,
    "baseURL": "/ebus/fuwu/api",
    "method": "post",
    "url": "/nthl/api/CommQuery/queryFixedHospital",
    "data": {
        "addr": "",
        "regnCode": "110000",
        "medinsName": "",
        "medinsLvCode": "",
        "medinsTypeCode": "",
        "outMedOpenFlag": "",
        "pageNum": 2,
        "pageSize": 10,
        "queryDataSource": "es"
    }
}
function params_decrypt(page_number){
    let t = "7d92"
    let u = window.duan(t)
    eData.data.pageNum = page_number
    result = u.a(eData)
    return JSON.parse(result.data)
}
console.log(params_decrypt(page_number))

关于请求体的加密到此即搞定了,请求返回结果的解密使用的是相同的方法,只是使用拦截器定位用的是interceptors.response.use,其他都一模一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值