吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6038|回复: 53
收起左侧

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

[复制链接]
503671998 发表于 2022-4-22 19:38

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

第一步抓包查看

1.png
可以看到登录信息都是明文的,最主要的就是这个X-Sign,我们直接搜索X-Sign搜不到,搜不到的话它是在Header中,搜索Header
2.png
这个太像了啊,跟进去看看
3.png
果然是,这两个函数都是关键的,直接抠出来

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
图中圈出来的函数跟一下就出来了,另外getleeway函数里面获取的是localstorage的东西,可以跟一下它的返回值,是0,我们直接让他返回0就行了
这样就已经全部抠出来了,我操作的时候有一个坑,导致我算出来的和真实环境算出来的不一样
5.png
看图中画出来的第二个参数是clientId,他有一个生成函数是取一个小数点随机数,我直接写进去了,但是通过跟环境发现,它实际是undefined,这里我们也直接给他一个undefined,否则算出来的值是错误的
6.png
这就是最后算出来的,提交post的时候要把它的请求头全部带上,要不然也返回的是sign值错误
7.png
希望大佬看见有什么不足可以指导我一下,抠了4个小时抠出来,感觉还是经验太少,技术太菜

免费评分

参与人数 5吾爱币 +11 热心值 +5 收起 理由
bjznhxy + 1 + 1 我很赞同!
宇宙狂人 + 1 + 1 用心讨论,共获提升!
timeni + 1 + 1 用心讨论,共获提升!
涛之雨 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

好的好的,链接: https://pan.baidu.com/s/1Sa03CUtAdlzDAlnyhuThSw 提取码: nvpi 复制这段内容后打开百度网盘手机App,操作更方便哦
 楼主| 503671998 发表于 2022-4-23 08:17
mzhsohu 发表于 2022-4-22 23:01
为什么没有大佬做成视频教程呢~!!!

某B站上有成套的教程,我也是学习后进行实践的,要不然光看视频觉得自己会了,一实操也不会,得多积累经验
 楼主| 503671998 发表于 2022-4-22 21:49
文章来喽,大家怎么不看,看啊给我看,看文章多是一件美事啊
yzxqhdx 发表于 2022-4-22 22:14
学习了大佬
TestPoner 发表于 2022-4-22 23:00
楼主好,请问我想学js逆向从哪里开始呢
mzhsohu 发表于 2022-4-22 23:01
为什么没有大佬做成视频教程呢~!!!
shamshiel 发表于 2022-4-22 23:19
感谢分享
eoo 发表于 2022-4-22 23:42
学习了大佬
wyp123 发表于 2022-4-23 00:05
这是jwt,但是这种直接通过js设置jwt的就比较不常见了,有很多都是从浏览器发送数据过去,如果登录成功了咋返回jwt,但是这个就有点迷,直接前端生成jwt
彭哥列第十代 发表于 2022-4-23 02:05
本帖最后由 彭哥列第十代 于 2022-4-23 02:08 编辑

我也试试 ,值得学习
头像被屏蔽
yyspawn 发表于 2022-4-23 07:29
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-13 14:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表