【JS逆向学习实践】某招标网站登录X-Sign逆向

查看 122|回复 10
作者:503671998   

今天又练习了另一个站点,登录的时候协议头里有一个X-Sign参数是变化的,并且他有两个登录入口,第一个是首页的登录那个X-Sign很简单一眼就能看到,但是另一个页面的登录X-Sign比较难找,最好玩的是简单的那个X-Sign可以用到第二个上,废话不多说,上地址。
地址: aHR0cHM6Ly93d3cubWFmZW5ncy5jb20vdGVuZGVyT3Jn

第一步抓包查看


1.png (47.65 KB, 下载次数: 0)
下载附件
2022-4-22 19:23 上传

可以看到登录信息都是明文的,最主要的就是这个X-Sign,我们直接搜索X-Sign搜不到,搜不到的话它是在Header中,搜索Header


2.png (48.86 KB, 下载次数: 0)
下载附件
2022-4-22 19:24 上传

这个太像了啊,跟进去看看


3.png (71.87 KB, 下载次数: 0)
下载附件
2022-4-22 19:26 上传

果然是,这两个函数都是关键的,直接抠出来
function getParamsHash(axiosRequestConfig) {
  const url = new URL(axiosRequestConfig.url)
  const urlQueryString = url.searchParams.toString()
  let paramsQueryString = new URLSearchParams(
    axiosRequestConfig.params
  ).toString()
  paramsQueryString = paramsQueryString.replace(/%2C/g, ',')
  paramsQueryString = paramsQueryString.replace('%3A', ':')
  paramsQueryString = paramsQueryString.replace('%28', '(')
  paramsQueryString = paramsQueryString.replace('%29', ')')
  const queryStringList = []
  if (urlQueryString) {
    queryStringList.push(urlQueryString)
  }
  if (paramsQueryString) {
    queryStringList.push(paramsQueryString)
  }
  const queryString = queryStringList.join('&')
  const uri = url.pathname
  let body = axiosRequestConfig.data
    ? JSON.stringify(axiosRequestConfig.data)
    : ''
  if (typeof body !== 'string') {
    body = ''
  }
  const inputToSign = uri + queryString + body
  log.debug('uri:', uri)
  log.debug('queryString:', queryString)
  log.debug('body:', body)
  log.debug('inputToSign:', inputToSign)
  return md5(inputToSign).toString()
}
这个是根据url信息通过MD5加密,得出一个hash值给上图中的function makeJwt(paramsHash, { clientId })使用,这里我们自己套用CroptoJS进行操作不需要抠它了
function makeJwt(paramsHash, { clientId }) {
  const oHeader = { alg: 'HS256', typ: 'JWT' }
  const oPayload = {}
  const tNow = Math.round(getServerEpochMilli() / 1000)
  const ttl = 10
  oPayload.sub = paramsHash
  oPayload.nbf = tNow - getLeeway()
  oPayload.iat = tNow
  oPayload.exp = tNow + ttl + getLeeway()
  oPayload.iss = clientId
  const sHeader = JSON.stringify(oHeader)
  const sPayload = JSON.stringify(oPayload)
  log.debug('payload iat', new Date(tNow * 1000))
  log.debug('payload exp', new Date(oPayload.exp * 1000))
  return jwtLib.jws.JWS.sign(
    'HS256',
    sHeader,
    sPayload,
    'VPLnFDx85XuNPvVVOQfjF3ftfoZP8ckP'
  )
}
这个函数最后调用了jsrsasign.js库进行sign加密,我们直接全文抠出来,手动引用就行了


4.png (32.1 KB, 下载次数: 0)
下载附件
2022-4-22 19:30 上传

图中圈出来的函数跟一下就出来了,另外getleeway函数里面获取的是localstorage的东西,可以跟一下它的返回值,是0,我们直接让他返回0就行了
这样就已经全部抠出来了,我操作的时候有一个坑,导致我算出来的和真实环境算出来的不一样


5.png (41.97 KB, 下载次数: 0)
下载附件
2022-4-22 19:33 上传

看图中画出来的第二个参数是clientId,他有一个生成函数是取一个小数点随机数,我直接写进去了,但是通过跟环境发现,它实际是undefined,这里我们也直接给他一个undefined,否则算出来的值是错误的


6.png (78.04 KB, 下载次数: 0)
下载附件
2022-4-22 19:36 上传

这就是最后算出来的,提交post的时候要把它的请求头全部带上,要不然也返回的是sign值错误


7.png (90.49 KB, 下载次数: 0)
下载附件
2022-4-22 19:37 上传

希望大佬看见有什么不足可以指导我一下,抠了4个小时抠出来,感觉还是经验太少,技术太菜

下载次数, 下载附件

503671998
OP
  


不负韶华 发表于 2022-4-23 14:19
楼主您好,城南post工具能发一下吗

好的好的,链接: https://pan.baidu.com/s/1Sa03CUtAdlzDAlnyhuThSw 提取码: nvpi 复制这段内容后打开百度网盘手机App,操作更方便哦
503671998
OP
  


mzhsohu 发表于 2022-4-22 23:01
为什么没有大佬做成视频教程呢~!!!

某B站上有成套的教程,我也是学习后进行实践的,要不然光看视频觉得自己会了,一实操也不会,得多积累经验
503671998
OP
  

文章来喽,大家怎么不看,看啊给我看,看文章多是一件美事啊
yzxqhdx   

学习了大佬
TestPoner   

楼主好,请问我想学js逆向从哪里开始呢
mzhsohu   

为什么没有大佬做成视频教程呢~!!!
shamshiel   

感谢分享
eoo   

学习了大佬
wyp123   

这是jwt,但是这种直接通过js设置jwt的就比较不常见了,有很多都是从浏览器发送数据过去,如果登录成功了咋返回jwt,但是这个就有点迷,直接前端生成jwt
您需要登录后才可以回帖 登录 | 立即注册

返回顶部