淘客怎么样做网站,哪些网站可以找兼职做室内设计,织梦可以做哪些类型型网站,四川省建设厅工地安全网站0x00 前排 最近在练习JS逆向#xff0c;发现论坛里关于JS逆向的东西都太难#xff0c; 我这样的菜鸡太难上手。 所以发了这个帖子#xff0c;记录一下简单点的JS分析。 只是新手练习记录#xff0c;如文中有理解错误#xff0c;还请大佬指出。 只记录算法分析过程#xf… 0x00 前排 最近在练习JS逆向发现论坛里关于JS逆向的东西都太难 我这样的菜鸡太难上手。 所以发了这个帖子记录一下简单点的JS分析。 只是新手练习记录如文中有理解错误还请大佬指出。 只记录算法分析过程不提供成品。 0x01 目标网址 0x02 定位JS 1. 随便输入账号密码验证码如果是不存在的账号会直接提示密码错误如果是是存在的账号会提示输入验证码这里假设是带验证码的点击登录后查看提交的参数可以看到在登录包里有许多看不懂的加参数一个个来分析。 1.png (69.14 KB, 下载次数: 0) 2019-12-16 17:21 上传 2. 分析下参数 参数 值 来源 entry weibo 固定 gateway 1 固定 from 固定 savestate 7 固定 qrcode_flag false 固定 useticket 1 固定 pagerefer 固定 pcid yf-826260aed11d* 上次返回 door 1111 验证码 vsnf 1 固定 su MT*****NjY JS计算 service miniblog 固定 servertime 1576135789 JS计算 nonce NLUYC0 上次返回 pwencode rsa2 固定 rsakv 1330428213 上次返回 sp 2395de422727c06* JS计算 sr 1536*864 固定 encoding UTF-8 固定 prelt 82 JS计算 returntype META 固定 其中上次返回是在登陆之前的一次请求中返回的内容 2.png (52.65 KB, 下载次数: 0) 2019-12-16 17:22 上传 其他的JS计算也不全是加密有的只是单纯计算的值下面一个个找。 3. CtrlShiftF调出搜索面板本着越生僻越好搜的原则先搜索prelt看到只有一个js结果。 点进第一个结果点花括号格式化一下CtrlF搜prelt只有两个结果而且第一个returntype: TEXT明显不是要找的所以第二个上面下断点。 11.png (325.01 KB, 下载次数: 0) 2019-12-16 17:22 上传 同时观察断点处发现f是在上面由makeRequest定义的所以这里先搜一下看看makeRequest的定义在哪。 101.png (385.62 KB, 下载次数: 0) 2019-12-16 17:23 上传 直接找到了加密处就是makeRequest可以看到还有其他参数也是在这里生成的包括固定的一些。在782行这里也下个断点。 4. 重新输入账号密码验证码点击登录JS被断了下来。 111.png (415.36 KB, 下载次数: 1) 2019-12-16 17:23 上传 直接先把su给扣下来 e.su sinaSSOEncoder.base64.encode(urlencode(a)); 可以看到参数a是账号跟进urlencode发现只是一个简单的encodeURIComponent urlencode function(a) { return encodeURIComponent(a) } 再找sinaSSOEncoder直接CtrlF搜索找到定义处 var sinaSSOEncoder sinaSSOEncoder || {}; 这个语句意思是如果sinaSSOEncoder不为空(即转为bool类型不为false)则把sinaSSOEncoder赋值给前面的变量(也是sinaSSOEncoder)如果sinaSSOEncoder为空则把后面的{}赋值给前面的sinaSSOEncoder所以这里首先生成了空对象。 所以再找定义处往下翻一下看到有两个函数调用了.call(sinaSSOEncoder);这就是加密对象的定义了两个函数全部拿走。 继续往下运行发现对servertime进行了赋值那就搜一下后面的.servertime (前面不带对象名但带上.后面带上空格和等于号)可以快速定位。 1111.png (351.07 KB, 下载次数: 0) 2019-12-16 17:24 上传 这里看到其实就是一个a循环加2的意思在这里下个断点断下来之后可以从右侧Call Stack里看到参数a的来源找到调用处发现就是上一次请求返回的servertime也就是说参数servertime就是上次返回的servertime循环加2所以这里可以直接在外部语言实现。 下一个参数是sp在上面的加密处已经看到了sp大致看到是一个RSA而且RSA对象的定义已经被扣下来过了这里没啥要做的了,只是加密的参数要注意看下一个是上次返回的nonce一个是计算完的servertime还有一个是明文密码再加上其他字符组合成了加密参数。 1000.png (428.38 KB, 下载次数: 0) 2019-12-16 17:25 上传 最后一个参数是prelt这个参数位置在一开始第一次下断点的那里 f.prelt preloginTime; 直接搜preloginTime可以定位到269行 10.png (353.19 KB, 下载次数: 1) 2019-12-16 17:25 上传 这段意思是prelt就是上一次请求的回调函数中new Date减去上一次请求的起始new Date再减去请求返回的exectime也就是等于上一次请求的本地总耗时减去云端耗时。 5. 参数找完了到这里已经可以开始改写了。 参数列表如下 参数 值 来源 entry weibo 固定 gateway 1 固定 from 固定 savestate 7 固定 qrcode_flag false 固定 useticket 1 固定 pagerefer 固定 pcid yf-826260aed11d 上次返回 door 1111 验证码 vsnf 1 固定 su MTU1NTU1NTY2NjY base64URL编码 手机号 service miniblog 固定 servertime 1576135789 以上次返回的为基数每次2(从上次请求到提交登录的时间差除以2取整一般为4~10) nonce NLUYC0 上次返回 pwencode rsa2 固定 rsakv 1330428213 上次返回 sp 2395de422727c06ce JS计算 RSA加密 sr 1536*864 固定 屏幕宽*高 encoding UTF-8 固定 prelt 82 可随机约等于上一次请求的本地耗时减去云端耗时上一次请求的回调函数中new Date-上一次请求的起始new Date-请求返回的exectime returntype META 固定 0x03 改写JS 1. 先把调用函数拿过来。 function test(pass, servertime, nonce) { rsaPubkey EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443 var f new sinaSSOEncoder.RSAKey; f.setPublic(rsaPubkey, 10001); b f.encrypt([servertime, nonce].join(\t) \n pass) return b } 这里需要传入定义好的3个参数明文密码、计算过的servertime、上次返回的nonce同时把前文抠下来的JS全部放到上面就行了。 2. 除了参数sp其他全部可以用Python直接实现。 另外base64也可以直接用JS内的方法实现不用调用base64库写个调用函数就行了。 function b64(username) { a sinaSSOEncoder.base64.encode(encodeURIComponent(username)); return a } 0x04 完事儿 放到调试器里测试一波没报错写了登录例子也能成功。