503671998 发表于 2022-4-22 19:38

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

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

### 第一步抓包查看

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

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

果然是,这两个函数都是关键的,直接抠出来
```javascript
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进行操作不需要抠它了
```javascript
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加密,我们直接全文抠出来,手动引用就行了

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

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

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

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

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

学习了大佬:wwqwq

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

页: [1] 2 3 4 5 6
查看完整版本: 【JS逆向学习实践】某招标网站登录X-Sign逆向