JS逆向-楚楚街密码加密

XX 街登陆密码加密

1
aHR0cDovL3NlbGxlci5jaHVjaHVqaWUuY29tL3NxZS5waHA/cz0vVXNlci9pbmRleA==

这个加密太简单了,五秒定位真的不是吹,所以直接来。

输入错误的账号密码,发起登陆请求,可以看到登录包里有个password的加密字段。所以我们依次搜索password:+password :+password=+password =

很快得到下面的结果【图1-1】,直接用python实现就完事了~

图1-1

X博登陆密码与相关加密参数解析

aHR0cHM6Ly93d3cud2VpYm8uY29tL2xvZ2luLnBocA==

用 Chrome 浏览器抓包相信大家都会,前面抓包我们跳过,直接到加密参数分析的地方。

Tip: 这次的加密不是异步的 不要在 XHR 选项卡傻乎乎的等了。

微博登陆框是嵌在页面中的加上微博的登陆页面图片以及要加载的东西很多,所以我们需要注意的包主要有两个:

  • 登陆前返回相关加密秘钥的包【图2-1】
  • 发起登陆请求的包【图2-2】

图2-1

图2-2

到这里就很清晰了,我们搞定 su 和 sp 就完事了。

先来看看 su 这个其实不要搜索,看着是不是很像我们开头的编码结果,由 a-zA-Z[0-9]+/= 这几种字符组成的编码 熟悉的就只有 Base64 , 我们直接找一个在线工具验证一下我们的猜想。【图2-3】

图2-3

当然我们也可以试试搜索 参数名 su 【图2-4】,很明显搜索结果也验证了我们的猜想。

图2-4

接下来看看 sp

在我们上面搜索 su 的地方我们找到了密码加密的地方,已经用红框框出主要的逻辑【图2-5】,接下来我们打上断点找找缺失的参数都是什么。

图2-5

这里的参数都是比较简单的首先是 me.servertime 、me.rsaPubkey 和 me.nonce【图2-6】 这三个参数在上一个请求包都有同名的参数返回可以参考【图2-1】。

图2-6

我们现在已经找齐了全部的参数,接下来需要切换到 webstorm 中调试出我们整体的加密算法。

直接粘贴 789 - 791 行的代码到编辑框中补全成下面这样。

1
2
3
4
5
6
7
function get_sp() {
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.rsaPubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + b)
return b
}
get_sp()

虽然知道运行肯定报错,但是我们需要的就是报错的信息。【图2-7】

2-7

提示 sinaSSOEncoder is not defined ,我们回到浏览器调试窗口找 sinaSSOEncoder在哪儿定义的。可以直接在页面中搜索 var sinaSSOEncoder

结果就只有一个【图2-8】

图2-8

接下来复制 sinaSSOEncoder的全部内容到编辑器中,第1048-1981行。继续运行并提示navigator is not defined,我们定义它为{}。接下来会提示 me 未定义【图2-9】。

图2-9

但是我们调试过都知道这个 me.rsaPubkey 是在【图2-1】中返回的,所以我们把它替换掉。同理替换到我们已知的的其他参数。现在就只剩下 b 参数是未知的了。

我们向下运行,可以看到b参数就是我们输入的密码【图2-10】,我们继续替换再次运行,发现没有东西输出,也没有报错,我们在函数中加上一句 打印语句,看看返回的 b是什么结果,可以看到已经得到了加密后的结果了。【图2-11】

图2-10

图2-11

总结

这次主要把如何扣一个简单的加密算法做了详解,这里包含了基础的JS知识,或许看不明白为什么是复制这些代码而不是其他的,这里我建议可以适当补充一些JS基础语法的知识。等到下次有类似的加密算法时,你可以自己做出判断复制扣取哪些,这样学的更快。

JS逆向学习的文章每一篇都是很简单的案例,希望看完可以自己动手扣一遍。

每天一题,头发掉的更快。

煌金 wechat
扫描关注公众号,回复「1024」获取为你准备的特别推送~