(JS逆向专栏一)某号店网站登入rsa加密

声明:

        本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

名称:1号店
目标:登入参数
加密类型:RSA
目标网址:https://passport.yhd.com/passport/login_input.do

第一步: 查看接口参数

加密值:credentials.username、credentials.password、captchaToken

第二步: 搜索参数名

我们搜索credentials.username 可以看到一下就定位到了加密入口,我们再看一下我们想要的值是否都在这个位置,这里我们可以看到除了captchaToken  

credentials.username、credentials.password 的加密方式已经显而易见的就是标准的rsa

第三步:实现加密参数

var pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXQG8rnxhslm+2f7Epu3bB0inrnCaTHhUQCYE+2X+qWQgcpn+Hvwyks3A67mvkIcyvV0ED3HFDf+ANoMWV1Ex56dKqOmSUmjrk7s5cjQeiIsxX7Q3hSzO61/kLpKNH+NE6iAPpm96Fg15rCjbm+5rR96DhLNG7zt2JgOd2o1wXkQIDAQAB"
var i = new JSEncrypt();
i.setPublicKey(pubkey);

var i = 13566667777
var k = 123456

j = i.encrypt(j);
k = i.encrypt(k);
username = k
password = j

console.log(username)
console.log(password)

我们直接把浏览器的实现代码扣下来直接运行

 

 发现缺少JSEncrypt这个第三方包   我们用指令安装一下

npm install jsencrypt

我们再引入这个包

 const JSEncrypt = require('jsencrypt')

这时候我们再启动会出现一个window 未定义的错误这个时候我们只要在最上面定义一下

window = global;

我们再运行 可以出结果啦!至此credentials.username、credentials.password的加密就结束了

 完整代码实现

window = global;
const JSEncrypt = require('jsencrypt')
var pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXQG8rnxhslm+2f7Epu3bB0inrnCaTHhUQCYE+2X+qWQgcpn+Hvwyks3A67mvkIcyvV0ED3HFDf+ANoMWV1Ex56dKqOmSUmjrk7s5cjQeiIsxX7Q3hSzO61/kLpKNH+NE6iAPpm96Fg15rCjbm+5rR96DhLNG7zt2JgOd2o1wXkQIDAQAB"
var i = new JSEncrypt();
i.setPublicKey(pubkey);

var j = 13566667777
var k = 123456

j = i.encrypt(j);
k = i.encrypt(k);
username = k
password = j

console.log('username->'+username)
console.log('password->'+password)

接下来就是captchaToken参数的获取了,我们把鼠标放到window.jab.getData()这个方法上然后点击main.min.js跳进这个方法

 跳进去后我们会看到一堆混淆之后的代码,不用去管我们只找我们想要的,我们在这里下一个断点

然后再点击登入发现被断住了,我们可以看到b('0xe0', 'OjB3')就是window.jab调用的getData方法,

下面Z是拿到了this['c'] 然后 Z[0x2] 相当于取Z[2] 意思取Z中的第三位,由此我们可以推测Z应该是一个数组

 那Z[2]()执行的返回值是不是就是captchaToken呢?我们把Z[2]()放到控制台一执行 woc

这不是我们想要的captchaToken吗?

 现在我们有两种思路:第一种扣代码、第二种补环境

这里我们直接扣代码直接选择硬刚

 我们把鼠标放到Z上然后点击第三个方法进入,我们可以看到这个ao不就是数组吗 不就是我们的Z吗? 那Z[2]不就是我圈出来的这一块然后返回一个拼接的值

 我们把返回值拆开看大致是三个部分的拼接

(g[f[b('0x6c7', ']swn')]('_', 't')] || '') 、aq、ap 中间用 | 拼接

经过多次观察 发现(g[f[b('0x6c7', ']swn')]('_', 't')] || '')的内容其实是写死的我们这边就跟着写死就行

我们通过追栈可以看到 ap相当于aK函数运行的返回值

接下来就是慢慢扣代码的环节了,由于篇幅过长就不做描述了,直接上结果图

 结合一下账号密码完成完整的加密

需要源码的可以私聊我

看完点个赞吧,喜欢的可以点个关注!

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值