首先打开登陆页:
输入138888888888和123456之后,查看network,可以看到登录时的请求payload内容。
主要有appKey,callId,password,sessionKey,sig和user这几个参数,下面分别看看这些参数。
appKey
直接全局搜索:
可以看到appKey的值是写死的,跳过。
callId
这里的callId值为1708926871886,跟时间戳的格式很像,尝试用时间戳解析一下:
正确。
password
前面输入的密码为123456,而密文是e10adc3949ba59abbe56e057f20f883e,很明显是md5加密,搜索1732584193来验证一下:
猜想正确。
sessionKey
sessionKey参数值为空,同样跳过。
user
该值即为登录时输入的用户名信息,并且为明文。
sig
最后来看sig参数,当前登录中,sig的值为5c4eaf63da0a3de5f8d8c5df30e1b3af。尝试解密,解密失败,下面从js入手。
先下个XHR断点,看一下调用栈:
这里有一个loginByPass,从命名来看应该是通过password进行登录,跟进去:
先留意这个文件:new-renren......
全局搜索sig:
共有3个文件,重点来看new-renren这个js。一共有70处调用,搜索.sig:
还是有数十处,搜索sig=:
一共只有两处,依次查看一下:
很明显都是从 ze.getSign(a, r.secretKey)取的值。
搜索getSign方法:
函数如下:
getSign:function(t, e){
var i ="c5957b350d87c02409766be680f76d5b";
e &&(i = e);
var s =Le(t)+ i
, n =Re()(s);
return n
}
打个断点看看:
t即为传入的参数,而e就是前面提到写死的appKey,与前面的a=s.params也能对应上。
先看Le(t),打断点进去看:
首先对参数的name进行了排序,排序之后键值对进行拼接。
结合上面的代码,此时s已经可以算出来,即为参数的key=value再拼接上appKey:"bcceb522717c2c49f895b561fa913d10"
最后一个问题就是n=Re()(s)
.
同样先打断点,步入:
跟到t:f(e,n),继续跟:
看到e.exports = function(e,n){},由于前面只给了一个参数(Re()(s)),因此n为undefined,如图所示,但是e有值,因此跳到var r=xxx,最后再通过一个三元运算,将结果return。
由于n为undefined,所以最终return的结果为t.bytesToHex(r),而r=t.wordsToBytes(a(e,n)),最终取值其实就是t.bytesToHex(t.wordsToBytes(a(e,n))).
写一段简单的js代码,如下:
let bbb =function(callId,password,user){
var s ="appKey=bcceb522717c2c49f895b561fa913d10callId="+callId+"password="+password+"sessionKey=user="+user+"bcceb522717c2c49f895b561fa913d10";
var sig = t.bytesToHex(t.wordsToBytes(a(s,n)));
return sig
}
console.log(bbb("1708926871886","e10adc3949ba59abbe56e057f20f883e","13888888888"))
这里使用的时间戳和user,pass为文中第一次请求时的数据,运行结果为:
一致。
至此整个逻辑已经清楚了,后续要做的就是抠代码使其能够在本地运行。
注意到,在核心加密函数中,存在1732584193,即md5的默认的模值,将s整个进行md5加密,其实就能得到sig的值。
修改代码如下:
let bbb =function(callId,password,user){
var s ="appKey=bcceb522717c2c49f895b561fa913d10callId="+callId+"password="+password+"sessionKey=user="+user+"bcceb522717c2c49f895b561fa913d10";
var sig = md5(s);
return sig
}
console.log(bbb("1708926871886","e10adc3949ba59abbe56e057f20f883e","13888888888"))
也可以通过抠代码的方式一步步进行,这里不再介绍。
原文始发于微信公众号(Crush Sec):js逆向系列07-人人网实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论